Forum: Compiler & IDEs benutzen anderer SRAM-adressen durch linker-script


von kosmonaut pirx (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von kosmonaut pirx (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von kosmonaut pirx (Gast)


Lesenswert?

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

von kosmonaut pirx (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.