mikrocontroller.net

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


Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
 .data  APPL_DATA_START : AT (ADDR (.text) + SIZEOF (.text))
 {
   ...
 } > 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:
  /* Handle unexpected interrupts (enabled and no handler), which
     usually indicate a bug.  Jump to the __vector_default function
     if defined by the user, otherwise jump to the reset address.

     This must be in a different section, otherwise the assembler
     will resolve "rjmp" offsets and there will be no relocs.  */

  .text
  .global  __bad_interrupt
  .func  __bad_interrupt
__bad_interrupt:
  .weak  __vector_default
  .set  __vector_default, __vectors
  XJMP  __vector_default
  .endfunc

  .section .init0,"ax",@progbits
  .weak  __init
;  .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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
 .data  APPL_DATA_START : AT (ADDR (.text) + SIZEOF (.text))
 {
   ...
 } > 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...

"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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.