Hallo Leute,
bei meinem aktuellen Projekt (CortexM4) würde ich gerne den Flashbereich
"splitten":
Sector0 - Applikation
Sector1 - Seperates File
Sector2 und folgend - Applikation
Sinn dahinter ist der dass das File klein ist, nicht mit der Applikation
geflasht wird und ich keinen der großen Sektoren dafür verwenden möchte.
Unter Keil geht das definitiv, nur wie funktioniert es unter gcc?
Ich vermute mal im Linkersript.
/* Specify the memory areas */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K
FLASH_2 (rx) : ORIGIN = 0x08010000, LENGTH = 192K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112K
}
Funktioniert so leider nicht, da ich später in den SECTIONS eine
Location angeben muss:
/* The program code and other data goes into FLASH */
.text :
{
.....
.....
} >FLASH
Wie macht man sowas am besten?
Vielen Dank,
Mike
Man kann z.B. die Funktionen die in den "Sector0" in eine extra
Input-Section legen (vgl. gcc Dokumentation zu function attributes),
diese Section dann im Linker-Script in den Block Output-Section "FLASH"
eintragen und "Sector2"-Funktionen, die in *.text* input-sections liegen
in eine Output-Section für "FLASH_2". Eine weitere Möglichkeit besteht
darin Objekte aus bestimmten Dateien in die jeweiligen Output-Sections
inzutragen (w.r.e. kann man das bei Scatter-Load-Files auch). Vgl. dazu
binutils-Dokumentation->ld (so in der Art *objectfile.o(.text.*) und
*(EXCLUDE_FILE (*objectfile.o) .text - genauen Syntax gerade nicht im
Kopf). Falls es nur darum geht die Vektortabelle im "Sector 1"
unterzubringen: die hat ohnehin schon eine eigen Input-Section, die man
im Linker-Script dann in eine weitere Output-Section eintragen kann.
Hallo Martin Thomas,
vieln Dank für den Beitrag.
Klingt schön kompliziert und ich muss zugeben davon nichts verstanden zu
haben.
Im Prinzip möchte ich das Programm ganz normal flashen, beginnend von
Sector 0 aufsteigend, nur eben dass Sector 1 nicht verwendet wird.
Mfg,
Michael
Das ist nicht wirklich kompliziert nur leider sind die Begriffe etwas
ungewohnt und die Dokumentation ist keine allzu leichte Kost. Wie auch
immer: Falls "section 0" nicht randvoll sein muss, also nur die
Vektortabelle am Beginn des Flash-Speichers stehen muss, damit der
Cotroller den Einstieg findet, kann man so etwas machen:
Hallo Martin Thomas,
nochmals vielen Dank, dass hat so geklappt!
Dass ganze sieht jetzt so aus (im Atollic Linkerscript für den STM32F4):
1
/* Define output sections */
2
SECTIONS
3
{
4
/* The startup code goes first into FLASH */
5
.isr_vector:
6
{
7
.=ALIGN(4);
8
KEEP(*(.isr_vector))/* Startup code */
9
.=ALIGN(4);
10
}>FLASH
11
12
/* The program code and other data goes into FLASH */
13
.text:
14
{
15
.=ALIGN(4);
16
17
.=0x7E78;
18
......
Die 0x7E78 ergeben sich aus Sector2 Adresse 8000 (0x8008000) minus 0x188
Bytes Startup Code.
Der Bereich von 0x8000188 bis 0x8008000 wird dann mit 0x00 aufgefüllt
;-)
Martin Thomas schrieb:> Also der Linker kann einfach> um Löcher im Speicherbereich herumlinken?
Ja, das kann er. In den Projektsettings lassen sich (unter anderem)
IROM1 und IROM2 Bereich angeben.
Danke,
Michael
Hi,
bin auch GCC Neuling und muß zu dem Thema noch was Fragen:
> Der Bereich von 0x8000188 bis 0x8008000 wird dann mit 0x00 aufgefüllt
Für ein Binärfile ist das klar, dass der Bereich aufgefüllt werden muß.
Kann man denn aber kein Hex (Intel-Hex, Motorola-Hex, etc) generieren
lassen, hier sind im Format 'Lücken' erlaubt. Dadurch bekäme man das
Programm schneller geflasht.
Geht das irgendwie mit GCC?
Gruß,
Mic Roller
Mic Roller schrieb:> Für ein Binärfile ist das klar, dass der Bereich aufgefüllt werden muß.> Kann man denn aber kein Hex (Intel-Hex, Motorola-Hex, etc) generieren> lassen, hier sind im Format 'Lücken' erlaubt. Dadurch bekäme man das> Programm schneller geflasht.> Geht das irgendwie mit GCC?
Ich lasse ein hexfile generieren, in diesem sind aber die 0x00
enthalten.
Hallo Michael,
danke, aber genau das ist ja das "Problem" - dann dauert das Flashen
'ewig' ... ist irgendwie ein großer Nachteil vom GCC, dass die
HEX-Ausgabe anscheinend nicht optimiert ist.
Schade :-(
Gruß,
Mic Roller
Mic Roller schrieb:> Hallo Michael,> danke, aber genau das ist ja das "Problem" - dann dauert das Flashen> 'ewig' ... ist irgendwie ein großer Nachteil vom GCC, dass die> HEX-Ausgabe anscheinend nicht optimiert ist.
zwar nicht Michael, dennoch: mit einer Aufteilung in output-sections
wird von objcopy augenscheinlich eine "optimierte" Ausgabe erzeugt.
Beispiel in Kurzform folgt, Erläuterungen siehe Betrag weiter oben. Ist
zwar für anderen ARM-Kern aber sollte relativ leicht übertragbar sein.
Toolchain: GNU Tools for ARM Embedded Processors Q2/2012
(launchpad.net).
im Linker-Script (nur Ausschnitt):