Hi! Bei meinen Optimierungen wollte ich die Konstantentabelle, welche 256 Byte nicht überschreiten, am Ende des Flash setzen. Habe dazu folgendes versucht: .org 1024-(FlashEnd-Tabellen) ;Das Flash ist 1024 Words groß. Tabellen: .db 5, 0, 2, 0 .db 3, 0, 0, 1 .db 4, 2, 0, 2 .db ..... ......... FlashEnd: Auf diese Art und Weise setzt mir AVR-Studio die Konstannten-Liste tatsächlich an das Ende des Flash (laut Pony-Prog). Allerdings vergisst AVR-Studio die Adresse "Tabellen" für das Programm anzupassen und diese ist nach unten versetzt. Die Adresse sollte bei 3BC sein (0x44 Words) ist aber auf 397 direkt nach dem letzten Befehl im Programm-Code. Wenn ich ".org 1024-(FlashEnd-Tabellen)" durch ".org 1024-68" ersetze dann passt alles (Tabellen am Ende des Flash und auch die Adresse richtig). Und ich denk mir schon ob ich nicht tot-optimiert habe. Gibt es ne Möglichkeit, das mit dem .org auf eine komfortable Art und Weise zu machen ohne das man jedesmal was beim .org ändern muß, damit die Tabellen beim wachsen immer direkt am Ende des Flash bleiben? Gruß Andi
Salve, hmmm, aber er weiß doch zum Zeitpunkt, wenn er den org berechnet, noch nicht, wie lange die Tabelle ist. und: wenn FlashEnd 1024 ist und Du die Klammern auflöst: 1024-(FlashEnd-Tabellen)=1024-1024+Tabellen=Tabellen also wird er die Tabelle gleich an den Code anschließen. Du mußt vor dem Org wissen, wie lange die Tabelle ist.
Was besseres als FlashEnd ist mir nicht eingefallen. Es ist einfach nur eine Marke für das Ende was sich alles im Flash befindet. Kann auch heißen ProgEnd oder einfach nur End. Habe auch folgendes probiert: .set Konstanten=FlashEnd-Tabelle .org 1024-Konstanten Tabelle: .db .... .db .... ........ FlashEnd: Aus FlashEnd - Tabelle müßte er doch die Größe der Tabelle zusammenrechnen und bei ORG von 1024 subtrahieren. Klappt auch nicht :-( Muß ich wohl noch bißchen probieren. Gruß Andi
Ach ja, der Witz an dem ganzen ist ja gerade, das AVR-Studio die Tabelle auf beide Arten an das Ende des Flash setzt aber eben nicht die Adresse "Tabelle" anpasst. Komisch ist ja, das, obwohl die Marke "Tabelle" erst nach dem .ORG kommt, .ORG richtig ist aber die Adresse "Tabelle" falsch. Vielleicht ein Fehler im AVR-Studio? Gruß Andi
Versuch mal rauszufinden, welche Werte Konstanten, FlashEnd, Tabellen haben. Versuch auch mal, nach dem FlashEnd noch einen NOP oder ein db zu setzen, damit er es auch wirklich für ernst nimmt. Kann er kein Listing erzeugen, aus dem das alles hervorgeht.
Ist FLASHEND nicht eh schon in den Include-Dateien mit den uC-Definitionen enthalten? Dann sollte man dafür kein Label verwenden, denke ich. Na egal, hier eine Variante, etwas kompliziert, aber so sollte es gehen: ; FLASHSIZE entspricht der Flashgröße ; z.B. FLASHEND+1, oder gegbenfalls BOOTSTART ; oder einfach Festwert 1024 .equ FLASHSIZE = FLASHEND+1 ; Tabellengröße ermitteln .set tabsize = tabellenende-tabellenanfang ; Adresse setzen .org FLASHSIZE-tabsize ; die beiden Label dienen nur der Größenberechnung tabellenanfang: .db 5, 0, 2, 0 .db 3, 0, 0, 1 .db 4, 2, 0, 2 .db ..... tabellenende: ; nun das Label "tabellen" mit dem richtigen ; Wert belegen .set tabellen = FLASHSIZE-tabsize Gruß Ingo
Das mit dem org ist ziemlich komisch: org 0x80 in AVR Studio landet auf 0x100 im fertigen Programm. org verlangt hier keine Byte sonden die Word Angabe !
Hmmm, bei mir nicht. LIST-File Ausschnitt: --------------------------------------------- .org 0x00 000000 c07f rjmp main .org URXCaddr 000016 c07b rjmp int_rxc .org 0x80 ; Hauptprogramm main: 000080 e50f ldi temp, LOW(RAMEND) 000081 bf0d out SPL, temp 000082 e004 ldi temp, HIGH(RAMEND) 000083 bf0e out SPH, temp AVRASM ver. 1.75.6
Eben doch ! Ein Befehl ist 16bit lang, und da der Abstand zwischen zwei Befehlen 1 ist -> Word !
Ooops. Also das stimmt natürlich. Ich hatte Deine Aussage völlig falsch interpretiert. Ich hatte angenommen, Du meinst, das bei .org immer 16-Bit Werte angegeben werden müssen, das also ein 8-Bit Wert nicht reicht. Also man muß beispielsweise .org 0x0080 schreiben, anstelle von .org 0x80, damit es funktioniert. Ich weiß auch nicht, wie ich darauf gekommen bin :-) Naja, aber das mit dem .org und auch den Labeln, die sich ja ebenso verhalten, ist zu Anfang schon etwas verwirrend. Ich hatte mich zunächst auch erstmal über die Sache mit ldi ZL, LOW(daten*2) ldi ZH, HIGH(daten*2) gewundert. Hää, wieso muß man da *2 rechnen?!? Wenn man aber verinnerlicht hat, das der Flash vom Programmzähler Wordweise addresiert wird, kommt man ganz gut damit zurecht. Man muß halt nur aufpassen, wenn man sich dann im RAM oder EEPROM (.dseg bze. .eseg) bewegt, da ist dann alles wieder byteweise organisiert und ein .org 0x80 adressiert dann tatsächlich die Speicherzelle 128. Gruß Ingo
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.