Forum: Compiler & IDEs avr: struct im __flash initialisieren


von Taucher (Gast)


Lesenswert?

Ich habe für ein Menü folgende Struktur definiert:
1
typedef struct MenuEntry {
2
    const char __flash const    *pStr;
3
    void                        (*const handler)();
4
} MenuEntry;

Die Deklaration der Menütabelle sieht folgendermaßen aus:
1
static const MenuEntry __flash menuList[] = {
2
    { "s  Status",                      displayStatus },
3
    
4
};

Es soll also die ganze Chose im Flash gespeichert werden. Allerdings ist 
der avr-gcc damit nicht einverstanden: bei der Initialisierung der 
Stringkonstanten mault er:
1
ui.c:248:11: error: initializer element is not computable at load time
2
         { "s  Status",                      displayStatus },
3
           ^
4
ui.c:248:11: note: (near initialization for ‘menuList[0].pStr’)

Wo ist der Fehler?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?


von Falk B. (falk)


Lesenswert?

Johann L. schrieb:
> Siehe "Strings" in avr-gcc Tutorial: Flash mit   flash und Embedded-C

Der Link geht so nicht. Eher so

https://www.mikrocontroller.net/articles/Kategorie:AVR-GCC-Tutorial#Strings_2

von Rolf M. (rmagnus)


Lesenswert?


von jo mei (Gast)


Lesenswert?

so würde es bei mir fehlerfrei compilieren:
1
typedef struct MenuEntry
2
{
3
    const char   *pStr;
4
    void         (*const handler)();
5
} MenuEntry;
6
7
static const MenuEntry __flash menuList[] =
8
{
9
  {
10
   "s  Status" ,   NULL        
11
  },
12
  {
13
   "x  Exit  " ,   NULL        
14
  }    
15
};

Ob das in deinem Sinne ist ... weiss ich jetzt nicht so genau.
Für den Handler hab ich jetzt einfach mal den NULL Pointer
angenommen, für etwas das fehlerfrei compiliert.

Also hier ist die Typdefinition frei von "__flash".

von Taucher (Gast)


Lesenswert?

jo mei schrieb:
> Ob das in deinem Sinne ist ... weiss ich jetzt nicht so genau.

Nein, ist es nicht – die Strings liegen nicht im Flash.

So liegt alles im Flash:
1
#define FSTR(X) ((const __flash char[]) { X } )
2
3
typedef struct MenuEntry {
4
    const char const __flash  *pStr;
5
    void                      (*const handler)();
6
} MenuEntry;
7
8
static const MenuEntry const __flash menuList[] = {
9
    { FSTR("s  Status"),                      displayStatus },
10
    
11
};

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.