avr: struct im __flash initialisieren

Gast #6540908
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?
Gast #6541878
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".
Gast #6543494
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
};

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