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
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.
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!
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.....
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.