Forum: Mikrocontroller und Digitale Elektronik Meine IDE Eclipse kennt den Qualifier __flash nicht. Könnt ihr mir da weiterhelfen?


von mullwark (Gast)


Lesenswert?

Guten Abend zusammen,

ich bin vor kurzem auf die IDE Eclipse umgestiegen, vorher nutzte ich 
den Editor Geany. Ich programmiere in C für den ATmega32 in einem 
kleinen Roboter.
Mein Sytem ist ein Debian/Wheezy und ich habe avr-gcc 4.7.2. In Eclipse 
ist die C-Erweiterung und AVR-Unterstützung installiert.
Meine Software compilieren und flashen funktioniert soweit gut.
Jetzt zu meinem Problem:

Ich habe eine Struktur, die einige Elemente und Funktionspointer 
enthält, in meiner Headerdatei deklariert:
1
struct commands_s {
2
  uint8_t command;                // stores the commandtag
3
  void (*p_command)(uint8_t *p_cmd_arglist);    // function pointer linked with commandtag
4
  uint8_t number_of_args;              // specifies the number of arguments
5
};

In meinem Code initialisiere ich dann wie folgt:
1
static const __flash struct commands_s s_cmd_list[] = {
2
    {0x01, &drive_both, 5},
3
    {0x02, &Led4_Off, 1},
4
    {0x03, &Led6_On, 1},
5
    {0x04, &Led6_Off, 1},
6
    {0x05, &Leds, 2}
7
  };

Wenn ich das "__flash" wegnehme, ist in Eclipse alles prima. Habe ich es 
wie oben stehen, wird mir das als Syntax-Error angestrichen. Dann kann 
Eclipse auch die Strukturelemente (z.B. s_cmd_list[i].p_command) im Code 
nicht auflösen.

Unabhängig von der Fehlermeldung läßt sich der Code mit avr-gcc 
-std=gnu99 in beiden Fällen compilieren und avr-size -C zeigt mir auch, 
daß die Struktur nun nur im Flash liegt.

Vielleicht hat einer von Euch einen Hinweis, an welcher Stelle meine IDE 
nochmal Zuwendung braucht.

MfG

Mullwark

von Frederik Nord (Gast)


Lesenswert?

Genaue Fehlermeldung ?

macht er/sie/es das auch bei normalen Variablen ?
also:
1
static const __flash uint8 var = 10;


/!\

von dummschwaetzer (Gast)


Lesenswert?

static const landet doch im flash!?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

dummschwaetzer schrieb:
> static const landet doch im flash!?

NOPE!
const ist nur für den compiler mit er meckert, wenn du darauf zugreifen 
willst und static sagt, dass die Variable nur für für diese C Datei ist.
static sagt in anderen Fällen auch was anderes aus

Zum Thema:
Wie man freiwillig eclipse nutzen kann ist mir zwar ein Rätsel, aber 
hier die Lösung:
damit __flash erkannt wird muss der c99 standard aktiviert sein.
Also als flag ins makefile oder in den tiefen von der Sonnenfinsternis 
wühlen fürn Häkchen.

edit:
ups, dass du schon c99 aktiviert hattest, hab ich glatt überlesen...

von Bastler (Gast)


Lesenswert?

__flash ist doch eine GCC Erweiterung für AVR. Zumindest ist sie in der 
AVR spezifische Source des GCC definiert. D.h. Das AVR-Plugin müsste dem 
C-Editor dieses "Schlüsselwort" beibringen. Aber nur für C ohne ++.

von Oliver (Gast)


Lesenswert?

Wer oder was meldet denn da eine Syntax-Fehler? Eclipse selber, oder der 
Compiler beim Comilieren?

Im ersten Fall sollte man das tun, was man sowieso immer machen sollte: 
Die Eclipse-eigene Syntaxprüfung abschalten. Wer die erfunden hat, 
gehört geteert und gefedert...

Im Zeiten Fall schau dir halt den Compilerauf an, und vergeleichen das 
mit dem des funktionierenden Aufrufs.

Oliver

von pitschu (Gast)


Lesenswert?

Abschalten wäre ja eine Schande. Die Syntaxprüfung erfolgt auch in der 
IDE selbst mit dem Compiler. Allerdings muss sie dafür wissen, welcher 
Compiler zu nemen ist. Meistens fehlt in den Projectproperties die 
Zuordnung. Die kann man einstellen und sollte bei AVR Projekten wie 
folgt sein: C-Files -> GCC, H-Files -> GCC Header und S-Files auf 
Assembler. Das solltest du prüfen und anschließend Index->Freshen all 
files. Bei mir hat das bisher immer geholfen.
PS

von Max M. (max_not_mustermann)


Angehängte Dateien:

Lesenswert?

War auch einen Tag auf der Suche nach einer Lösung. Google hat mich aber 
immer wieder hier hin geleitet. Leider bin ich mit pitschus Tipp nicht 
weitergekommen.

Eine Lösung die bei mir (Eclipse Kepler) funktioniert:

Projekt Einstellungen:
Properties -> C/C++ General -> Preprocessor Include Paths, Makros, 
etc...

Dort:
Languages "GNU C" -> CDT User Setting Entries -> Add

Dort:
Preprocessor Makro (Dropdown oben links), Name: __flash ,Value: /**/ , 
Checkbox "Treat as built in": aktiv

Compiler tut das was er soll, Eclipse Syntax Parser meckert nicht mehr.

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.