Forum: Compiler & IDEs String aus einem Structarray auslesen das im Flash liegt


von stift (Gast)


Lesenswert?

Es gibt viele Beiträge zu diesem Thema, allerdings hat das Lesen und 
Testen die letzten drei Tage leider nichts gebracht!

Vor dem Problem stehe ich:
Hier der Struct und seine Einträge:
1
typedef struct {
2
  unsigned char   MenuTitle[20];  //Menütitel
3
  sMenu          *pMenu;      //pointer auf den sMenu Struct
4
  unsigned char  PWsave;        //passwortschutz für dieses Menü
5
  unsigned char  Entries;      //anzahl der Menüeinträge
6
  unsigned char   ParentMenu;    //Index des Herkunftsmenü
7
} sAllMenu;
8
9
10
const sAllMenu AllMenu[] PROGMEM = {  
11
  //[Menütitels | MenuPointer | PWsave | Menüeinträge | ParentMenu]
12
  {"Hauptmenu",    MainMenu,      1,          10,          0},    // 0 Index
13
  {"Extras...",    ExtraMenu,      0,          3,          0},    // 1 
14
  {"Die Uhr",      ClockMenu,      0,          3,          1}    // 2
15
};
aber ich bekomms einfach nicht gebacken den string aus 'MenuTitle' 
auszulesen.
das funktioniert einwandfrei wenn ich ein char auslesen will:
1
unsigned char Entries = pgm_read_byte(&(AllMenu[x].Entries));
Folgendes funktioniert nicht:
1
char *data;
2
strcpy_P(data, &(AllMenu[x].MenuTitle));

Ich bin mit meinem Latein am Ende... vielleicht hat hier jemand eine 
Minute Zeit und Erklärt mir was ich fasch mache und wie ein Lösungsweg 
aussehen könnte.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Nimm einfach __flash anstatt des alten PROGMEM.  Zum Auslesen genügt 
dann "nomales" C ohne pgm_read etc.

von Daniel V. (danvet)


Lesenswert?

> Folgendes funktioniert nicht:
>
1
> char *data;
2
> strcpy_P(data, &(AllMenu[x].MenuTitle));
3
>
>
> Ich bin mit meinem Latein am Ende... vielleicht hat hier jemand eine
> Minute Zeit und Erklärt mir was ich fasch mache und wie ein Lösungsweg
> aussehen könnte.

- für "char *data" hast du keinen Speicherplatz reserviert, strcpy wird 
also ins Nirvana kopieren.
- sind die Strings mit NULL abgeschlossen? ansonsten liest sich strcpy 
zu Tode

Ansonsten solltest du mal warten bis Karl-Heinz auftaucht...

von Karl H. (kbuchegg)


Lesenswert?

Daniel V. schrieb:

>>
1
>> char *data;
2
>> strcpy_P(data, &(AllMenu[x].MenuTitle));
3
>>
>>

> - für "char *data" hast du keinen Speicherplatz reserviert, strcpy wird
> also ins Nirvana kopieren.
> - sind die Strings mit NULL abgeschlossen? ansonsten liest sich strcpy
> zu Tode
>
> Ansonsten solltest du mal warten bis Karl-Heinz auftaucht...

Passt schon.
Das hier

> - für "char *data" hast du keinen Speicherplatz reserviert, strcpy wird
> also ins Nirvana kopieren.

ist der Fehler.

>> Ich bin mit meinem Latein am Ende...

Ein gutes C Buch könnte helfen.
String-Verarbeitung in C
Sind eigentlich für jeden C Programmierer Basisdinge, die nichts mit µC 
oder Flash oder EEPROM oder solchen Dingen zu tun haben. Nur weil man 
einen Pointer hat, hat man noch lange keine Speicherfläche, in der man 
was speichern kann. So ein Pointer kann auf so eine Speicherfläche 
zeigen, aber er ist sie erst mal nicht.

von stift (Gast)


Lesenswert?

Oh man! klar doch, brauch einen speicherbereich auch wo der pointer 
hinzeigen darf!!
1
char data[20];
2
strcpy_P(data, &(AllMenu[x].MenuTitle));
Und siehe da es funktioniert :)

Jetzt hab ich noch eine große Hürde zu meistern... in diesem Structarray 
sind pointer die auf andere Structarray zeigen die noch im RAM liegen 
aber auch noch ins Flash ausgelagern werden müssen.
Aber ich versuche es mal allein zu lösen und melde mich wieder sollte 
ich gar nicht weiter kommen.

Herzlichsten Dank für eure hilfe!

ps an Johann L.:
Mein Atmel Studio 4 kann mit '__flash' leider gar nichts anfangen.
Er erkennt dieses Schlüsselwort anscheinend nicht.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

stift schrieb:

> Mein Atmel Studio 4 kann mit '__flash' leider gar nichts anfangen.
> Er erkennt dieses Schlüsselwort anscheinend nicht.

avr-gcc ab Version 4.7 kennt __flash.  Kommt darauf an, was unter der 
Haube von "Atmel Studio 4" steckt...

von stift (Gast)


Lesenswert?

dachte schon das es was mit dem avr-gcc zu tun haben muss.
ich lads grad runter und werd mein menü mal mit der __flash ?funktion? 
versehen.

Danke für den tip :)

von stift (Gast)


Lesenswert?

hab mir jetzt den avr-gcc v4.7 runtergeladen.
Leider erkennt mein Atmel Studio 4 den qualifier '__flash' noch immer 
nicht.
Ich hab Studio 4 als avr-gcc: C:\WinAVR-20100110\bin\avr-gcc.exe
und für make: C:\WinAVR-20100110\utils\bin\make.exe

Ist das richtig bzw. muss man noch wo was umstellen?

von Oliver (Gast)


Lesenswert?

stift schrieb:
> Ich hab Studio 4 als avr-gcc: C:\WinAVR-20100110\bin\avr-gcc.exe
> und für make: C:\WinAVR-20100110\utils\bin\make.exe
> Ist das richtig bzw. muss man noch wo was umstellen?

Wenn der avr-gcc v4.7 mit C:\WinAVR-20100110\bin\avr-gcc.exe aufgerufen 
würde, dann wäre das richtig. Vermutlich liegt der aber ganz woanders.

Also musst du den Pfad zum richtigen Compiler etc. einstellen.

Oliver

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Oliver schrieb:

> Wenn der avr-gcc v4.7 mit C:\WinAVR-20100110\bin\avr-gcc.exe aufgerufen
> würde, dann wäre das richtig. Vermutlich liegt der aber ganz woanders.

??? WinAVR-20100110 ist ein avr-gcc 4.3.3.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.