2016-05-19 11 views
2

Ich arbeite an einem eingebetteten C-Projekt mit GCC für ARM V-4.8.3 Toolchain. Ich habe ein Array von Suchstrukturen, die nur während des Lebenszyklus des gesamten Programms gelesen werden. Da mir der Arbeitsspeicher knapp wird (und ich habe nicht genug Flash), ist es besser, sie in den Flash zu stecken, was die Funktion des Programms nicht beeinträchtigt. Das Problem ist wie.Was ist der allgemeinste Ansatz, um eine Struktur in den Flash (Mikrocontroller) zu setzen

Eine Möglichkeit, dies zu tun, ist die Verwendung der variable __attribute__ ((section ("TEXT"))) von GCC zur Verfügung gestellt. In diesem Fall ist mein Code compilerabhängig. Wenn ich meinen Code zum Beispiel mit dem Microchip-Compiler verwenden möchte, muss ich den Code für den Anschluss an die neue Umgebung bearbeiten.

Die andere Möglichkeit, die mir in den Sinn kommt, ist die Verwendung des Linker-Skript. Die Struktur wird nur in den Code deklariert.

Es scheint mir, dass der zweite Ansatz ein bisschen tragbarer ist. Obwohl es noch benötigt wird, um das Linker-Skript anzupassen, ist es für mich besser. Gibt es einen allgemeineren Ansatz, der den Code im Kontext des Platzierens von Variablen im Flash portierbarer macht?

Wenn Sie sie als Konstante qualifizieren, bedeutet dies, dass sie in den Abschnitt gestellt werden. Nicht in den Textbereich, in den sie "gehören".

+1

Linker-Skripts sind ebenfalls nicht portierbar und ändern sich je nach verwendetem Linker. –

Antwort

4

Wenn es keine Rolle spielt wo im Flash sie am Ende, erklärte einfach die Struktur als static const sollte ausreichen und 100% tragbar.

__attribute__ und andere Nicht-Standard-Dinge sollten nur benötigt werden, wenn Sie etwas an einer bestimmten Adresse zuweisen müssen.

+0

'const' würde ausreichen, keine Notwendigkeit für' static' – berendi

+0

@berendi Nein, da lokale Scope-Variablen in der Laufzeit als 'const' deklariert und initialisiert werden können. In diesem Fall landen sie im RAM. 'const' statische Speicherdauervariablen enden jedoch immer im Flash. – Lundin

+0

Ja, ich habe festgestellt, dass diese Bezeichner, die als 'const' qualifiziert sind, in den Abschnitt '.rodata' gestellt werden, der selbst bei' .text' liegt. Der '.text'-Bereich befindet sich im Flash-Speicherbereich der MCU. Du musst @Lundin also recht haben. Ich wusste nicht, dass "Rodata" innerhalb von "Text" ist. Ich verstehe nur nicht, warum Sektionsbezeichner mit vorangestelltem Punkt ('.') geschrieben werden, wie zum Beispiel' .text', '.bss',' .data' usw. – Hairi

0

Sie müssen sich Ihren spezifischen Compiler/Linker ansehen, um zu bestimmen, wie er in Flash platziert wird.
Manchmal const funktioniert manchmal wird es immer noch in RAM.
static const ist tragbar, aber es kann nicht die Platzierung in Flash garantieren.

Das liegt daran, dass Ansi-C nichts über Flash oder RAM weiß.

Es gibt sogar Systeme, in denen Sie Pragmas verwenden müssen, um in Flash zu platzieren.

#pragma define_section myFlash_table ".calibTable.text" RW 
#pragma section myFlash_table begin 
... 
#pragma section myFlash_table end 

Eine portable Version sollte Würmer verwenden, aber Sie müssen daran denken, dass es nicht kugelsicher ist.