Forum: Mikrocontroller und Digitale Elektronik Kann AVR-Studio nicht richtig rechnen?


von Andi (Gast)


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

von Profi (Gast)


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.

von Andi (Gast)


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

von Andi (Gast)


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

von Profi (Gast)


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.

von Ingo Henze (Gast)


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

von Benedikt (Gast)


Lesenswert?

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 !

von Ingo Henze (Gast)


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

von Benedikt (Gast)


Lesenswert?

Eben doch !

Ein Befehl ist 16bit lang, und da der Abstand zwischen zwei Befehlen 1
ist -> Word !

von Ingo Henze (Gast)


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

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.