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.
Oder alternativ in der Assemblerdatei mit einer Alignment-Anweisung arbeiten, statt mit einer absoluten Adresse.
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.
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
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.
1 | ldi ZL, lo8(pm(Tones)) |
2 | ldi ZH, hi8(pm(Tones)) |
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) |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.