Forum: Compiler & IDEs Fehlerhaftes Linker-Ergebnis


von Harper B. (harper)


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
}

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?


von Harper B. (harper)


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?

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.