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.
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.
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.
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.
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.
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.
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?
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"?
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.
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.
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.