STM32, GCC: Konstanten im Flash

Gast #1889973
Lesenswert?
• ▲
▼
Hallo,

reicht es aus, eine globale Variable als const zu deklarieren, damit der 
GCC sie bei einem STM32 Target in dessen Flash-Speicher packt und nicht 
ins RAM läd? Also etwa:
const unsigned char s[]="String im Flash zum dynamischen Laden";

Sollte das so gehen, so müsste man ja etwa wie folgt auf einzelne Bytes 
des Strings zugreifen können, da Flash und RAM sich einen gemeinsammen 
Adressraum teilen (und nicht wie bei der AVR-Architektur mit einem 
pgm_read_byte Äquivalent arbeiten):
unsigned char c;
c=s[2];


Vielen Dank schon einmal!
(Firma: EleLa - www.elela.de) #1889992
Lesenswert?
• ▲
▼
Ich mache das immer so:
1
const <Datentyp> <variable>[] __attribute__ ((section(".rodata"))) =
2
{
3
: : :
4
};
5

6
#define  <variable>_ANZAHL (sizeof(<variable>)/sizeof(<Datentyp>))

Mit dem _attribute_ section wird es garantiert in den Bereich gelinkt 
wie im Linkerfile angegeben. Man kann somit selbst festlegen ab welcher 
Adresse die Daten stehen.

Bei einem reinen const bin ich mir auch nicht sicher wohin er die 
Konstante linkt. Steht aber in der .map Datei.
(Firma: EleLa - www.elela.de) #1890181
Lesenswert?
• ▲
▼
Bei const bin ich mir nicht ganz sicher, ob die Ursprünglichen Daten im 
Flash liegen und bei Startup die Variable im Ram angelegt/Daten kopiert 
werden und der Zugriff in der Applikation erfolgt dann aus der RAM 
Kopie.

Ich glaube es gibt dazu auch einen Kompillerschalter.

Es kann auch sein ich verwechsle es gerade mit dem GCC Kompiller für den 
Atmega.
#1890198
Lesenswert?
• ▲
▼
Den Compiler selbst geht das überhaupt nichts an. Der schiebt seine 
"const" Daten nach ".rodata" und die Sache hat sich für ihn. Ob das im 
Flash liegt, im RAM oder in externem DRAM ist ihm dabei völlig wurscht. 
Der Compiler weiss nicht einmal, ob der Controller überhaupt Flash hat.

Erst Linker-Script und Startup-Code bestimmen was damit passiert. Oft 
wird man bei ARMs mit Code im Flash auch die RO-Daten dorthin legen. 
Aber da bei Prozessoren ohne Cache der Zugriff auf Flash langsamer als 
RAM ist kann man das ggf. auch anders halten und den Linker so 
dirigieren, dass er diese Section im RAM platziert und der Startup-Code 
den Inhalt zusammen mit den normalen initialisierten Daten aus dem Flash 
dorthin kopiert.

Es gibt also keine einfache Antwort darauf (bei AVRs gibt es die, aber 
da ist das von der Architektur vorgegeben). Schon garnicht, wenn nur 
"GCC" in der Frage steht, nicht aber die konkrete Entwicklungsumgebung. 
Bei fertigen Compiler-Paketen wie Keil, Crossworks usw. wird man 
abhängig vom exakten Zielprozessor und dem Debugging-Modus eine 
bestimmte vorgesehene Verhaltensweise finden. Bei Bausätzen wie 
CodeSourcery und Yagarto, in denen der Anwender Linker-Script und 
Startup-Code ohnehin selbst definiert, ist alles offen.

Oft findet man optionale Szenarien für Debugging im RAM. Bei diesen ist 
alles im RAM, ob "const" oder nicht. In anderen Szenarien sind "const" 
Daten dann evtl. im Flash. Beim gleichen Compiler, beim gleichen 
Zielcontroller.

Klar ist nur, dass eine explizite Attributierung als .rodata genau das 
herstellt, was der Compiler von sich aus sowieso schon tut. Und damit 
keineswegs sichergestellt ist, dass diese Daten im Flash landen.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.