Mein Cortex-M3 bietet 525kByte Flash Memory. Dazu habe ich im
Linker-Script diese Regions definiert:
1 | MEMORY {
|
2 | FLASH (rx) : ORIGIN = 0x00010000, LENGTH = 448K
|
3 | RAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
|
4 | }
|
Der gesamte Code von der .text Section geht in den FLASH. Das ist okay.
Wenn ich zuviel Code habe, wird das vom Linker erkannt und das Erzeugen
der .elf Datei unterlassen.
Einige Daten-Sections wie .fine_arra gehen auch in den Flash. Wenn ich
aber .data Sections habe, werden diese erwartungsgemäß im RAM abgelegt.
Werden aber Daten initialisiert, fügt der Linker die
Initialisierungsdaten bei _sidata ab. Wenn diese Daten zusammen mit den
bereits in FLASH enthaltenen Sections die Größe der Region FLASH
überschreiten, wird dieses still schweigend über dem Ende der 512k
hinausgeschrieben.
Natürlich ist das erzeugte Image nicht benutzbar. Wie kann ich dem
Linker erzählen, dass er das unterlassen soll und bei zu großen
Initialisierungs-Daten einen Fehler melden soll?
1 | SECTIONS {
|
2 | .text : {
|
3 | *(.text)
|
4 | } > FLASH
|
5 |
|
6 | .fini_array : {
|
7 | PROVIDE_HIDDEN (__fini_array_start = .);
|
8 | KEEP (*(.fini_array*))
|
9 | PROVIDE_HIDDEN (__fini_array_end = .);
|
10 | _eflash = .;
|
11 | } >FLASH
|
12 |
|
13 | /* used by the startup to initialize data */
|
14 | _sidata = .;
|
15 |
|
16 | /* Durch die AT Anweisung landet die Initialisierung der Daten im FLASH */
|
17 | .data : AT ( _sidata ) {
|
18 | _sdata = .;
|
19 | *(.data)
|
20 | *(.data*)
|
21 | _edata = .;
|
22 | } >RAM
|
23 | }
|