Der Bereich für die Interrupteinsprünge des AT90USB128x erstreckt sich von Byteadresse 0x00000 – 0x00097. Danach beginnt üblicherweise der Programmcode. Meine Aufgabe ist es das Makefile so zu gestalten, dass der Bereich von 0x00100 bis 0x001FF mit 0xFF ausgefüllt wird, weil dort applikationsspezifische Daten untergebracht werden sollen, die ein Bootloader reinprogrammieren soll. Dazu habe ich im Makefile -Wl,-section-start=.devicedata=0x00100 versucht eine Section zu erstellen und im C-Code mit const unsigned char str3[] _attribute_ ((section(".devicedata"))) = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; mit Daten zu befüllen. Jetzt meckert der Linker section .devicedata [00000100 -> 0000010f] overlaps section .text [00000000 -> 00001575] , weil er an dieser Stelle seinen Programmcode plazieren möchte. Das Konstrukt funktioniert nur dann, wenn ich meine Section in einem Bereich plaziere, wo (derzeit) noch kein Code vorgesehen ist. Da ich meine Sourcen auch für andere AVR-Derivate flexibel halten will, möchte ich meine Section nicht am Ende des Flashs, sondern möglichst weit vorne plazieren, in einem Bereich, der bei allen AVR-Derivaten vorhanden ist. Gibt es einen Trick, um diesen Konflikt zu umgehen ? In den zahlreichen Threads zu diesem Thema ist mir nichts untergekommen, was mein Problem lösen würde.
Den Start der Section .text auf das Ende der section .devicedata legen. Ich weiß nicht, ob das über Parameter geht (--section-start nimmt nur absolute Adressen) oder nur in einem eigenen Linkerscript (sowas wie "AT ((LOADADDR (section) + SIZEOF (section)" + ggf Alignment).
.text zu verschieben ist keine gute Idee, weil sich damit auch die Vektor-Tabelle (.vectors) verschiebt. Hier das Default ld-Skript avr5.x:
1 | /* Internal text space or external memory. */ |
2 | .text : |
3 | { |
4 | *(.vectors) |
5 | KEEP(*(.vectors)) |
6 | /* For data that needs to reside in the lower 64k of progmem. */ |
7 | *(.progmem.gcc*) |
8 | *(.progmem*) |
9 | . = ALIGN(2); |
10 | __trampolines_start = . ; |
11 | /* The jump trampolines for the 16-bit limited relocs will reside here. */ |
12 | *(.trampolines) |
13 | *(.trampolines*) |
14 | __trampolines_end = . ; |
15 | /* For future tablejump instruction arrays for 3 byte pc devices. |
Nack .bectors deine Section mit den gewünschten Eigenschaften einfügen und die Anwendung mit dem neuen Skript generieren anstatt mit dem default-Skript. Beachte daß es für jede Architektur ein eigenes Skript gibt.
Vielen Dank für die schnellen Inputs. In der Tat, das Verschieben der .text-Section bedeutet auch ein Verschieben der Interrupttabelle und das ist in der AVR-Architektur nun mal nicht möglich. Der Ansatz mit dem ld-Skript funktioniert bestens, Johann L, Danke. Es ist aber große Vorsicht geboten, weil dieses ld-Skript für alle weiteren AVR-Projekte dieser Architektur ebenfalls Verwendung finden würde.
M. H. schrieb: > Es ist aber große Vorsicht geboten, weil dieses ld-Skript für alle > weiteren AVR-Projekte dieser Architektur ebenfalls Verwendung finden > würde. Man ändert ja auch nicht das Default-Skript an Ort und Stelle. Man kopiert es in sein Projekt, ändert es, und teilt dem Linker dann auf der Kommandozeile mit, dass er jenes Skript nutzen soll anstelle des Default-Skripts.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.