Forum: Compiler & IDEs p2align funktioniert nicht


von avr (Gast)


Lesenswert?

Hi

Ich brauche mehrere 256 Word Sprungtabelle, die so ausgerichtet ist, 
dass das Lowbyte der Adresse die Sprungposition bestimmt.

Irgendwie scheint p2align aber nur manchmal zu funktionieren. So 
funktioniert eine Sprungtabelle, eine andere wiederum nicht.

Die Sprungtabelle selbst sie ungefähr so aus:

.p2align 9
TABLE:
  rjmp func
  rjmp func2
  ...
  rjmp func256

Aufruf:
  ldi ZH, pm_hi8(TABLE)
  ijmp // ZL == index

Die Tabelle landet dann an der Wordadresse 0x4778. Auch andere Argumente 
für p2align werden nicht richtig umgesetzt.
Ich habe align schon früher genutzt und da hat es als funktioniert. Es 
scheint als wäre das ein Glücksfall gewesen.
Wie bringt man den avrgas und eher Linker dazu die Tabellen an die 
richtige Stellen zu setzen?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Genau so, wie es oben steht.  Oder steht es etwa anders da? Gibst du den 
Code so direkt zum Assembler, oder ist das Code der ausm avr-gcc kommt?

von avr (Gast)


Lesenswert?

Mit anderen Bezeichner steht es genauso im Code. Der Code steht in einer 
.inc-Datei, die über eine .s-Datei inkludiert wird (die Sprungtabelle 
selbst wurde mit einem Script generiert). Das ganze ist in einem 
AtmelStudio6-Projekt und das nutzt m.W. avrgcc. Die Adresse an der das 
ganze landet habe ich aus dem Listing.

Zwischen Assemblercode und Listing sollte doch (fast) kein Unterschied 
sein? Fast, weil mir aufgefallen ist, dass relax eingeschaltet ist. Das 
stört mich aber nicht (man darf halt keine jmp-Tabellen bauen), aber 
möglicherweise wird dieser Schritt nach dem Alignment ausgeführt und 
zerstört dieses. Ich weiß aber gerade nicht wie ich diesen Schalter 
deaktiviere - das Feld mit dem Argumenten ist readonly.

von avr (Gast)


Lesenswert?

ich habe den Schalter gefunden: Es ist leider -mrelax. Der Code wird 
dadurch kürzer und die Adressen stimmen nicht mehr. Kann man das 
irgendwie beheben? Ansonsten muss ich einen anderen Weg suchen um die 
Tabellen an richtige Adressen zu bringen.

Ein Makro um call durch rcall schon im Code zu ersetzen wäre auch eine 
Lösung, aber dafür scheinen die avrgas Makros nicht mächtig genug, oder 
irre ich mich da?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

avr schrieb:
> ich habe den Schalter gefunden: Es ist leider -mrelax.

Dann ist es m.E. ein Bug im avr-ld mit --relax.  Alignment-Direktiven 
sollten ihre Wirkung behalten, auch mit --relax.

Ist bislang wohl nicht aufgefallen weil auf AVRs praktisch nie ein 
Alignment > 2 gebraucht wird.

> Der Code wird
> dadurch kürzer und die Adressen stimmen nicht mehr. Kann man das
> irgendwie beheben? Ansonsten muss ich einen anderen Weg suchen um die
> Tabellen an richtige Adressen zu bringen.

Eigene Section und dieser in der Linker Description ein Alignment 
verpassen? Vielleicht greift dann der Bug nicht.

> Ein Makro um call durch rcall schon im Code zu ersetzen wäre auch eine
> Lösung, aber dafür scheinen die avrgas Makros nicht mächtig genug, oder
> irre ich mich da?

Das müsste dann eine Optimierung im avr-as sein, die es aber bislang 
nicht gibt.

Evtl. geht auch ein 2-schrittiger Link:

1) Relocatable Link: Die Tabelle wird ohne --relax gelinkt und
   unkritischer Code mit --mrelax

2) Alle pre-gelinkten Module werden in einem final Link kominiert.

Allerdings weiß ich nicht, ob avr-ld auch in 19 relaxt.  Wenn nicht hast 
du Pech.

Was auch gehen könnte, ist den Code in eine Section ohne x-Flag zu 
legen, in denen führt avr-ld nämlich kein Relaxing durch (weil es dann 
als Daten aufgefasst wird, nicht als Code).

von avr (Gast)


Lesenswert?

Ich würde die Sprungtabelle gerne in eine eigene Section packen, es gibt 
da nur ein paar Probleme weil die Sprungtabelle sehr groß ist. Deswegen 
müssen die Funktionen um die Sprungtabelle verteilt werden. Die eine 
Hälfte ist über ihr, die andere darunter und genauso muss es am Ende 
auch im Flash stehen.

Danke für den Tipp mit den Sections: Ich kann das Programm richtig 
"kompilieren", wenn ich sowohl die Sprungtabelle in eine eigene Section 
packe und den Funktionsblock davor ebenfalls in eine eigene. Mir gefällt 
nur nicht, dass der Linker vielleicht mal auf die Idee kommen würde die 
Sections anders zu verteilen (darf er das?). Daher weiß ich nicht ganz 
in wie weit diese Lösung sauber ist. Die Section habe ich übrigens mit 
"ax" erstellt.

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.