Kann AVR-Studio nicht richtig rechnen?

Gast #108485
Lesenswert?

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
Gast #108486
Lesenswert?

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.
Gast #108487
Lesenswert?

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
Gast #108488
Lesenswert?

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
Gast #108489
Lesenswert?

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.
Gast #108490
Lesenswert?

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
Gast #108492
Lesenswert?

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
Gast #108494
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren