Fehlerhaftes Linker-Ergebnis

#3620556
Lesenswert?

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
}
#3620723
Lesenswert?

Danke für den Tipp. Mit dieser Änderung bekomme ich wie gewünscht sowohl 
eine Fehlermeldung als auch keine .elf Datei:
1
  ASSERT( (_sidata + (_edata - _sdata)) <= 0x00080000, "Initialization Data blow up")

Gibt es noch eine chance auf das Literal 0x00080000 zu verzichten und 
die FLASH Endadresse aus MEMORY Definition zu benutzen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren