mikrocontroller.net

Forum: Compiler & IDEs expected initializer before progmem - Problem


Autor: Alex (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich schreibe gerade an einem kleinen Menu-teil für mein Projekt. Bisher 
lief alles OK im Visual Studio.

Ich versuche das ganze jetzt in den AVR-GCC zu wandeln habe jetzt aber 
das Problem, dass ich die Struktur nicht in den Flash schreiben kann. 
Ich bekomme ständig die Fehlermeldung:

menu.cpp:12: error: expected initializer before "PROGMEM"

Kann mir bitte jemand Weiterhelfen?

Ich will die Struktur myMENU des Typs menu in den Flash schreiben.

mfg Alex

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht die Synthax für eine Struct-Definition nicht ander aus ? (In C tut 
sie das auf jeden Fall, ich hab aber keine Ahnung von C++ )
In C bräuchtest du einen Prototyp für den Struct:
struct menu {
PSTR(string);
char* einpointer;
Typ var; // mußt du einsetzen
}
// und deine Deklaration sähe so aus:
const struct menu myMENU[] PROGMEM = {
  {"Test1",   &SetMenu,  test1},
  {"Test2",   &bar,           NULL},
  {"Test3",   &foobar,   NULL},
  {"zurück?",   NULL,     NULL},
  {"",    NULL,     NULL}
};
//Du  kannst dann "const" und PROGMEM noch in den Prototypen verlagern.

Einfach (noch-)mal das Kapitel "Struct" in deinem (C /C++) Buch und das 
Kapitel "<avr>/pgmspace.h" in der AVR-GCC doku nachschlagen

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Prototyp habe ich im Header.

Das ganze sieht jetzt so aus:

cpp-Datei:

const struct menu myMENU[] PROGMEM = {
  {PSTR("Test1"),   &SetMenu,   test1},
  {PSTR("Test2"),     &bar,     NULL},
  {PSTR("Test3"),     &foobar,   NULL},
  {PSTR("zurück?"),   NULL,     NULL},
  {PSTR(""),       NULL,     NULL}
};

Prototyp aus header:

struct menu{
  const char* text;
  void (*fp)(struct menu*);
  struct menu* pUMenu;
};

----------------------------------------

Ich will dass der Compiler mit alle "TEXTE" in den Flash schreibt, sowie 
die ganze Struktur myMENU.

   => FLASH soll später stehen:
      die Texte ,
      die Strukturen
      die Adressen der Texte in der Struktur,
      die Adressen der Funktionen in der Struktur,
      die Adressen der "Untermenus"

PSTR gibt mir die Adressen der TEXTE im Flash zurück, der wird in den 
Char * geschrieben.

Trotz allem bekomme ich immernoch die selbe Fehlermeldung:

menu.cpp:13: error: expected initializer before "PROGMEM"

mfg

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich es so umschreibe...
#include <avr/pgmspace.h>

struct menu{
  const char* text;
  void (*fp)(struct menu*);
  struct menu* pUMenu;
};

void SetMenu(struct menu*);
void bar(struct menu*);
void foobar(struct menu*);
#define test1 myMENU
#define NULL ((void*)0)

static char text1[] PROGMEM = "Test1";
static char text2[] PROGMEM = "Test2";
static char text3[] PROGMEM = "Test3";
static char text4[] PROGMEM = "zurück?";
static char text5[] PROGMEM = "";

const struct menu myMENU[] PROGMEM = {
  {text1,     &SetMenu, test1},
  {text2,     &bar,     NULL},
  {text3,     &foobar,  NULL},
  {text4,     NULL,     NULL},
  {text5,     NULL,     NULL}
};

void SetMenu(struct menu* m)
{
}

void bar(struct menu* m)
{
}

void foobar(struct menu* m)
{
}

int main(void)
{
  return 0;
}


... wird es übersetzt und es kommen diese Statistiken raus...
# avr-gcc (GCC) 3.4.5 (20060125)
AVR Memory Usage
----------------
Device: atmega16

Program:     224 bytes (1.4% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)
# avr-gcc (GCC) 4.1.1 (WinAVR 20070122)
AVR Memory Usage
----------------
Device: atmega16

Program:     212 bytes (1.3% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)

  

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dankeschön,

ich habe meinen Fehler mittlerweile auch gefunden, allem anschein nach 
kann ich dem avrgcc nicht soviel zumuten wie gedacht.

Danke nochmal.

mfg

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verrätst du den Fehler ?
Falls nochmal jemand ein ähnliches Problem hat (bei der 
Havard-Architektur des AVR nicht unwahrscheinlich) ist das bestimmt 
hilfreich.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pkt1:

PSTR(...) ist als Typecast definiert, darf aber nicht zur 
Initialisierung von PROGMEM Elementen verwendet werden.

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.