Forum: Mikrocontroller und Digitale Elektronik Atmel Studio 7 Problem mit __flash


von Stefan H. (stefan_h143)


Lesenswert?

Hallo,

Ich versuche gerade im Atmel Studio 7 eine Konstante im Flash 
Speicherbereich anzulegen. dabei bekomme ich aber immer die 
Fehlermeldung "unrecognized symbol" und er unterstreicht mir das 
"__flash".

Momentan mache ich das so:
1
const __flash uint8_t  value = 70;

wo liegt da der Fehler?

Ich möchte letztendlich etwas größere Arrays im Flash ablegen und 
auslesen.

Gruß
Stefan

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ist nur die IDE zu doof, das zu kennen, oder bekommst du tatsächlich 
Compilerfehler?

__flash ist eine private Erweiterung, die meines Wissens auch nur in den 
GNU-Modi (also -std=gnu99 und so, nicht -std=c99) zugelassen ist.

ps: Für einen uint8_t lohnt der Aufwand allerdings in der Regel kaum. :)
Vermutlich wirst du aber größere Datenmengen da hinterlegen wollen.

von Franz M. (elmo64)


Lesenswert?

Stefan H. schrieb:
> const __flash uint8_t  value = 70;

static const __flash ...

UND

Jörg W. schrieb:
> -std=gnu99

von Mitlesa (Gast)


Lesenswert?

Jörg W. schrieb:
> __flash ist eine private Erweiterung, die meines Wissens auch nur in den
> GNU-Modi (also -std=gnu99 und so, nicht -std=c99) zugelassen ist.

Das Token PROGMEM anstelle von __flash ist bei den Compiler-
Versionen vom Atmel Studio (7.0.xxxx) durchaus "funktionsfähig".

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A. M. schrieb:
> Stefan H. schrieb:
>> const __flash uint8_t  value = 70;
>
> static const __flash ...

Kommt drauf an, wo das in der Quelldatei steht. Es muss static storage 
haben, aber keineswegs in der Sichtbarkeit auf den lokalen Modul 
eingeschränkt sein (das Schlüsselwort kann ja in C beides bedeuten, eine 
der Jugendsünden der Sprache, wie Dennis Ritchie wohl mal zum besten 
gegeben hat).

Mitlesa schrieb:
> Das Token PROGMEM anstelle von __flash ist bei den Compiler-
> Versionen vom Atmel Studio (7.0.xxxx) durchaus "funktionsfähig".

Ja, das funktioniert dann auch mit -std=c99 etc. Allerdings ist die 
Handhabung umständlicher, weil man dann alls mit pgm_read_foo-Funktionen 
zugreifen muss, während der Compiler bei __flash implizites Wissen 
darüber besitzt, dass er mit LPM-Befehlen drauf zugreifen muss.

von Stefan H. (stefan_h143)


Lesenswert?

Jörg W. schrieb:
> Ist nur die IDE zu doof, das zu kennen, oder bekommst du tatsächlich
> Compilerfehler?

Compilerfehler bekomme ich nicht. Zumindest wird nichts angezeigt und 
scheinbar scheint der Coder auch zu funktionieren.

Bin nur durch die roten Kringel irgendwie verunsichert.


Jörg W. schrieb:
> also -std=gnu99

war so eingestellt


A. M. schrieb:
> static const __flash ...

warum static, wenn man es global deklariert? Verändert der Compiler echt 
die Speicheradresse, wenn die Konstante im Flash abgelegt ist?

Mitlesa schrieb:
> Das Token PROGMEM anstelle von __flash ist bei den Compiler-
> Versionen vom Atmel Studio (7.0.xxxx) durchaus "funktionsfähig".

Ich finde halt __flash aufgrund der einfacheren Zugriffe angenehmer. Hat 
progmem da irgendwelche vorteile?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan H. schrieb:
> Bin nur durch die roten Kringel irgendwie verunsichert.

Denk einfach mal dran, dass der Visual-Krams ja durch Atmicrochip nur 
von Microsoft zugekauft ist. __flash ist ein relativ spät eingeführtes 
Schlüsselwort, welches technisch ein "type qualifier" ist, also nichts, 
was der Parser der IDE irgendwo in einer Headerdatei definiert finden 
würde (anders als PROGMEM). Insofern müsste jemand dem Syntaxparser 
beibringen, dass es dieses Schlüsselwort gibt, und dass es ein type 
qualifier ist. Bei Microsoft-C-Code taucht es ja nicht auf.

Vermutlich würde er dir dafür andere potenzielle qualifier wie __near 
oder __far nicht anmosern, obwohl der Compiler die nicht kennt. :-)

von Stefan H. (stefan_h143)


Lesenswert?

Danke für die Antworten :)

Dann bin ich ja beruhigt :)

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.