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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.