Forum: Mikrocontroller und Digitale Elektronik Variable im Flash ablegen


von eddf (Gast)


Lesenswert?

Hallo Leute!

Ich will eine uint32_t an einer bestimmten Stelle im Controller flash 
ablegen. Wie deklariert man so etwas in C?

Danke schon mal für die Antwort

von rmf (Gast)


Lesenswert?

Dafür gibt es keine allgemein gültige Methode.
Im C Standard ist das nicht festgelegt und mehr oder Minder jeder 
Compiler hat da seine eigene Art und Weise.
Es hilft also nur ein Blick ins Handbuch des jeweiligen Compilers.

von Little B. (lil-b)


Lesenswert?

in C macht man das meistens so
1
// globale varaible im Flash
2
const uint32_t GobaleVariable = 0xffaa5500;
3
4
int main (void) {
5
   // lokale variable
6
   // auch wenn sie hier als const deklariert wird, wird sie auf dem Stack abgelegt
7
   // deshalb muss sie static const sein
8
   static const uint32_t LokaleVariable = 0x55AA00FF;
9
}

was der compiler aber daraus macht, kann man aber nicht allgemein gültig 
sagen. Besser ist es, mit sections zu arbeiten und entsprechend das 
linkerfile anzupassen.
1
__attribute__((section(".VariablesInFlashSection")))
2
uint32_t GlobaleVariable = 0x12345678;

Hier ist es dann egal, ob const, static, oder wie auch immer.

Soll es tatsächlich eine ganz spezielle Adresse sein, so unterstützt GCC 
zum Beispiel folgendes:
1
uint32_t Variable@0x2000 = 0x89ABCDEF;

Ich empfehle dir allerdings nicht, es so zu tun, da es höchst 
compiler-spezifisch ist und das programm nicht protabel ist!

von eddf (Gast)


Lesenswert?

Hi

Das mit der Section habe ich probiert, das geht leider nicht. Die
Variable landet in der Flash-Section und nicht in der 
VariablesInFlashSection.
Warnungen gibt es keine...

Das mit dem @ geht auch nicht.

Anmerkung: Ich verwende Rowley Crossworks for ARM, leider ist der
Support ausgelaufen.....

von Jim M. (turboj)


Lesenswert?

eddf schrieb:
> Das mit der Section habe ich probiert, das geht leider nicht. Die
> Variable landet in der Flash-Section und nicht in der
> VariablesInFlashSection.

Dann stimmt Dein Linker Skript nicht. Das muss dazu passen.

von eddf (Gast)


Lesenswert?

Das habe ich auch angepasst. Das Problem ist Rowley generiert das
mit jedem build aus einer XML-Datei. Da steht die Sektion auch drin.

Der Ausdruck:

__attribute__((section(".VariablesInFlashSection")))
uint32_t GlobaleVariable = 0x12345678;

wird auch übersetzt, keine Warnung. Die Variable landet nicht da
wo sie sein soll.

MFG

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.