String aus einem Structarray auslesen das im Flash liegt

Gast #3192232
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.
#3192246
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...
#3192255
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.
Gast #3192406
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.
Gast #3192854
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?
Gast #3193318
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren