hallo, ich möchte gerne ereeichen, dass meine anwendung einen anderen bereich aus dem SRAM verwendet als sonst. gesagt, getan. linker-script geändert und auf geht's: data (rw!x) : ORIGIN = 0x802000, LENGTH = 0xffa0 aber dennoch, im map-file wird immer in adresse 0x00800100 begonnen. avr-readelf bestätigt mir das: [ 1] .data PROGBITS 00800100 00395e 00022a 00 WA 0 wie mache ich es statt dessen, so dass es funktioniert? danke, bye kosmo
kosmonaut pirx wrote: > aber dennoch, im map-file wird immer in adresse 0x00800100 begonnen. Vermutlich, weil der Compiler das überschreibt. Das ist bei allen AVRs der Fall, bei denen der SRAM nicht auf 0x800060 anfängt. > wie mache ich es statt dessen, so dass es funktioniert? Du überschreibst es dem Compiler nochmal. ;-) ... -Wl,--section-start=.data=0x802000
hallo jörg, das ist genau das, was ich nicht will. nicht in jedem Makefile den compiler- bzw. linkerswitch benutzen. verstehe nicht, warum der compiler das überschreiben sollte .. das linkerscript gehört dem linker, niemandem sonst. aber er kann das vorgeben, ja, das akzeptiere ich. ich habs nun so gemacht, dass ich die data-section explizit über eine konstante ändere:
1 | .data APPL_DATA_START : AT (ADDR (.text) + SIZEOF (.text)) |
2 | {
|
3 | ...
|
4 | } > data |
nicht so schön, aber geht erstmal. darf ich noch eine frage zur gcrt stellen? (rhetorische frage, ich weiß :) ich versuche, einzelen sections zu discarden. ich will die .vectors raus haben. das geht per /DISCARD/-ab schnitt im script. der linker beschwert sich zu recht über eine .text aus der gcrt, die .vectors referenziert. die kommt hier her:
1 | /* Handle unexpected interrupts (enabled and no handler), which
|
2 | usually indicate a bug. Jump to the __vector_default function
|
3 | if defined by the user, otherwise jump to the reset address.
|
4 | |
5 | This must be in a different section, otherwise the assembler
|
6 | will resolve "rjmp" offsets and there will be no relocs. */
|
7 | |
8 | .text |
9 | .global __bad_interrupt |
10 | .func __bad_interrupt |
11 | __bad_interrupt: |
12 | .weak __vector_default |
13 | .set __vector_default, __vectors |
14 | XJMP __vector_default |
15 | .endfunc |
16 | |
17 | .section .init0,"ax",@progbits |
18 | .weak __init |
19 | ; .func __init |
gibts vielleicht schon eine lösung für sowas? ich verstehe das problem auf anhieb auch nicht, davon mal abgesehen. könnte man nicht einfach eine explizite .bad-vectors schaffen, die sich um sowas kümmert? die anweisungen in .text zu packen finde ich höchst unschön, weil ja jeder .text benutzt. danke, bye kosmo
kosmonaut pirx wrote: > verstehe nicht, warum der compiler das überschreiben sollte .. Weil das Linkerscript derzeit nur pro AVR-Klasse (avr1...avr6) da ist, aber die einzelnen Mitglieder der Klasse unterschiedliche RAM-Startadressen haben. Daher gibt der Compiler für alle AVRs, bei denen der RAM nicht auf 0x800060 ist eine -Tdata-Option mit an den Linker. > ich versuche, einzelen sections zu discarden. ich will die .vectors > raus haben. Mir wäre es lieber, wenn wir diesen Teil von gcrt1.S customizable bekämen, sodass man das nicht via Linkerscript machen muss. Vielleicht magst du ja ein Schema entwickeln, mit dem man die Vektoren optional bekommt? Du kannst das auch gern auf der avr-libc-dev Mailingliste diskutieren. > beschwert sich zu recht über eine .text aus der gcrt, die .vectors > referenziert. die kommt hier her: Istallier' doch einen anderen __vector_default, das müsste im Zweifelsfalle mit --defsym=__vector_default=0 gehen.
guten morgen, >Weil das Linkerscript derzeit nur pro AVR-Klasse (avr1...avr6) da ist, >aber die einzelnen Mitglieder der Klasse unterschiedliche >RAM-Startadressen haben. Daher gibt der Compiler für alle AVRs, bei >denen der RAM nicht auf 0x800060 ist eine -Tdata-Option mit an den >Linker. ok, kann man mit leben. nur ärgerlich, dass man das auf diese weise erfährt und vorher schon am linkerscript zu zweifeln beginnt. sollte ich bei gelegenheit mal einen eintrag im tutorial oder wo es sich eben anbietet machen. aber so eine richtige stelle fällt mir da grad nicht ein. na mal gucken. >Mir wäre es lieber, wenn wir diesen Teil von gcrt1.S customizable >bekämen, sodass man das nicht via Linkerscript machen muss. >Vielleicht magst du ja ein Schema entwickeln, mit dem man die Vektoren >optional bekommt? >Du kannst das auch gern auf der avr-libc-dev Mailingliste diskutieren. hab ich auch schon dran gedacht, ja. wenn ich eine idee habe, wie das optional gehen könnte, werde ich das dort auch kund tun. >Istallier' doch einen anderen __vector_default, das müsste im >Zweifelsfalle mit --defsym=__vector_default=0 gehen. falls das auch per linkerscript geht, ist das bestens. werde ich ausprobieren. vielen dank für die hilfe, bye kosmo
hallo, nur zur info, vielleicht brauchts ja mal wer: muss mich selber korrigieren: >ich habs nun so gemacht, dass ich die data-section explizit über eine >konstante ändere:
1 | .data APPL_DATA_START : AT (ADDR (.text) + SIZEOF (.text)) |
2 | {
|
3 | ...
|
4 | } > data |
>nicht so schön, aber geht erstmal. das verschieben der start-adresse im SRAM funktioniert so nicht. die explizite angabe der VMA soll laut ld-doku zwar stets funktionieren. aus http://sourceware.org/binutils/docs-2.17/ld/Output-Section-Address.html#Output-Section-Address "The address is an expression for the VMA (the virtual memory address) of the output section." das tut der avr-ld aber anders. hier gilt nur die compilervorgabe. frust hth irgendwann irgend jemandem, bye kosmo
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.