Forum: Compiler & IDEs .comm adresse angeben - avrgcc assembler


von Sam .. (sam1994)


Lesenswert?

Hi

Kann man bei der Definition einer Variable (.comm) die Speicheradresse 
angeben? Es geht darum einen 256 Byte Buffer aus 
Geschwindigkeitstechnischen Gründen auf eine freie 256Byte "Seite" zu 
legen.

In reinem Assembler war dies so möglich:
[avrasm]
.org 0x100
BUF:  .BYTE  BUFLEN
BUFEND:

;oder

tempaddr:
.org (tempaddr + 255) & 0xF00
[avrasm]

Beides aber nur im .dseg Bereich (den es hier nicht mehr gibt) wenn man 
es für Variablen gelten lassen wollte.

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


Lesenswert?

Samuel K. schrieb:
> Kann man bei der Definition einer Variable (.comm) die Speicheradresse
> angeben?

Nein, natürlich nicht.  Schließlich legt erst der Linker die
Adressen fest.  .org ist eine "don't use this"-Direktive, wenn
man mit verschieblichen Objekten und einem Linker arbeitet.

Der korrekte Weg wäre es, dafür eine eigene section zu allozieren,
und dieser dann im Linker die passende Adresse zuzuweisen.
Allerdings musst du dich natürlich um die Platzierung selbst
kümmern, der Linker wird nicht versuchen, andere sections um deine
"herum fließen" zu lassen.

Die Frage ist halt, ob der dergestalt gewonnene Taktzyklus wirklich
den Aufwand für den ganzen Zirkus rechtfertigt.

von Stefan E. (sternst)


Lesenswert?

Oder alternativ in der Assemblerdatei mit einer Alignment-Anweisung 
arbeiten, statt mit einer absoluten Adresse.

von Sam .. (sam1994)


Lesenswert?

Danke für die Antworten! Ich denke .org verbaut nichts wenn man es an 
den Anfang des Rams legt (sofern es gehen sollte).


Sparen tut das ganze schon mehrere Takte, wobei der Aufwand (zumindest 
in Assembler) minimal ist.

Alignment-Anweisung: ISt das eine Direktive? Google spuckt nichts 
verwertbares aus.

von Sam .. (sam1994)


Lesenswert?

Wenn es möglich sein sollte die Ramadresse zu bestimmen, dann sollte es 
auch möglich sein, Tabellen an bestimmten Stellen (z.B hinten) 
abzulegen. Das bräuchte ich nämlich auch noch. Allerdings kenne ich mich 
dafür zuwenig mit avrgcc aus

Hintergrund des ganzen ist das portieren meines 17 Kanal Synthesizer 
nach C. Wenn ich das Programm in C neuschreiben würde, wäre die 
Effizienz hin.

von Andreas B. (andreas_b77)


Lesenswert?

Möglich wäre es, die Variable in eine eigene Sektion zu legen und mit 
einem Linkerscript dafür zu sorgen, dass diese Sektion mit einem 
bestimmten Alignment oder an eine gewünschte Adresse gelegt wird.

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


Lesenswert?

Samuel K. schrieb:
> Allerdings kenne ich mich
> dafür zuwenig mit avrgcc aus

Dann solltest du die Doku studieren.  Die Stichworte hast du ja
schon genannt bekommen:

. eigene section
. Linker legt die Adressen fest
. Linker lässt sich über Linkerscript steuern, aber sections kann
  man auch per Linker-Kommandozeile (--section-start) platzieren

Ans Ende des SRAM ist sicher eine sinnvolle Variante, dann musst du
nur den Stack drunter legen.

Samuel K. schrieb:
> Ich denke .org verbaut nichts wenn man es an
> den Anfang des Rams legt (sofern es gehen sollte).

Vergiss .org.  Das hat man schon zu Z80-Zeiten nicht mehr benutzt.
Sowie ein Linker im Spiel ist, hat der das Sagen über die endgültigen
Adressen.  Alles andere sollte maximal verschieblich bleiben.

> Sparen tut das ganze schon mehrere Takte, wobei der Aufwand (zumindest
> in Assembler) minimal ist.

Die Frage ist halt nur: sind diese "mehrere Takte" denn wirklich
relevant?  Ich habe bislang ein einziges Mal Code für den AVR
geschrieben, bei dem ich wirklich die Takte gezählt habe (und
anschließend den RC-Oszillator per Finetuning noch ein wenig
schneller gedreht ;), und ein anderes Mal vor reichlich 20 Jahren
auf dem Z80.

von Stefan E. (sternst)


Lesenswert?

Samuel K. schrieb:
> Alignment-Anweisung: ISt das eine Direktive? Google spuckt nichts
> verwertbares aus.

http://sourceware.org/binutils/docs/as/Balign.html#Balign
http://sourceware.org/binutils/docs/as/P2align.html#P2align

von Sam .. (sam1994)


Lesenswert?

Jörg Wunsch schrieb:
> Die Frage ist halt nur: sind diese "mehrere Takte" denn wirklich
> relevant?

Im Ram könnte man es vernachlässigen, das würde vielleicht um 0.5% 
verlangsamen, aber die Daten im Flash müssen wirklich auf einer 256Byte 
Page liegen, sonst wird das Programm im 2stelligen Prozentbereich 
langsamer.

Da das ganze Projekt am Ende ein Modul werden soll, wäre eine schnellere 
und effizientere Lösung ideal.

Wenn ich das mit dem align richtig verstanden habe, kann ich einfach 
eine Flashadresse auf x00 mit folgender Direktive setzen:
1
.p2align 8
2
.byte MeineDaten
Reicht es wenn ich das an den Anfang der Asmdatei schreibe oder muss ich 
vorher noch die section definieren?

von Stefan E. (sternst)


Lesenswert?

Samuel K. schrieb:
> Reicht es wenn ich das an den Anfang der Asmdatei schreibe oder muss ich
> vorher noch die section definieren?

Gegenfrage: soll MeineDaten in eine bestimmte Section, oder 
"irgendwohin"?

von Sam .. (sam1994)


Lesenswert?

Das ist egal, hauptsache die Daten beginnen bei xx00 und hören bei xxFF 
auf.

das Align gilt aber nicht für .comm, nur für den Flash. D.h. für den Ram 
bräuchte ich eine andere Lösung.

von Sam .. (sam1994)


Lesenswert?

Die festen Flashaddressen funktionieren mit .p2align. Danke für den Tip.
Nur das auslesen funktioniert nicht wirklich:
Ich lade die Adressen per lo8/hi8(pm(Adresse)), aber laut Disassembler 
müsste ich mit 2 multiplizieren um die gewünschte Adresse zu erhalten.

Wo aber kann ich das *2 einfügen ohne das der Assembler meckert? Vor pm, 
nach pm und mit Klammern um pm habe ich schon ausprobiert, doch er 
findet immer einen Fehler.
1
ldi ZL, lo8(pm(Tones))
2
ldi ZH, hi8(pm(Tones))

von Stefan E. (sternst)


Lesenswert?

Samuel K. schrieb:
> Wo aber kann ich das *2 einfügen

Lass doch einfach das /2 in Form des pm() weg:
1
ldi ZL, lo8(Tones)
2
ldi ZH, hi8(Tones)

von Sam .. (sam1994)


Lesenswert?

omg, das geht ja. Danke!

Ich glaube ich habe das einfügt, weil an anderer Stelle -Label nicht 
ging. Schon verwirrend, dass er das in -(Label) Form braucht.

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.