Forum: Mikrocontroller und Digitale Elektronik Grundsatzfrage 16Bit-Variablen im SRAM


von Andi (Gast)


Lesenswert?

Hi!

Ich progge schon ne Weile mit AVR-Studio und mir ist jetzt in der
Simulation aufgefallen, das AVR-Studio 16Bit-Variablen als Hi:Lo
darstellt.
Also Adresse 0 als Hi-Byte und Adresse 1 als Lo-Byte.
Da bei allen 16Bit-Registern, z. B. für Timer1, Adresse 0 das Lo-Byte
und Adresse 1 das Hi-Byte ist, habe ich mir angewöhnt, auch im SRAM die
Variablen so zu schreiben/lesen (lo:hi).
Gibt es bestimmte Richtlinien ob 16Bit-Variablen im SRAM nun lo:hi oder
hi:lo geschrieben/gelesen werden an die man sich halten kann?
Oder kann man dem AVR-Studio sagen, er möchte doch 16Bit nicht als
hi:lo sondern lo:hi auslesen und anzeigen?
Wie rum machen es die C-Compiler?
Nicht, das ich vielleicht mal in C eine ASM einfüge und es dann falsch
herum lese oder schreibe.

Gruß
Andi

von Jürgen Schuhmacher (Gast)


Lesenswert?

IMHO kann man das nicht.

"Wie rum machen es die C-Compiler?"

Die generelle Reihenfolge ist ja eine Frage der CPU: Schon immer musste
man hier das Intel- vom Motorolaformat unterscheiden. Ich würde die
Reihenfolge immer direkt lesefähig schreiben.

von Andi (Gast)


Lesenswert?

OK, bei 16/32Bit-CPUs hängt es wirklich von der CPU ab.
Aber bei 8Bit-CPUs (AVR) doch eigentlich vom Compiler.
Wegen dem direkt lesefähig meinst Du damit z. B., wenn in XL lo und in
XH hi dann lo auf Adresse+0 und hi auf Adresse+1?

Gruß
Andi

von Christof Krüger (Gast)


Lesenswert?

So viel ich weiss legt der AVR-GCC Variablen mit Breite>8 als
Litte-Endian ab, also wäre der Wert 1 als 16-Bit-Wert im Speicher als
0100 gespeichert

von Andi (Gast)


Lesenswert?

Dann werde ich wohl beim Little-Endian bleiben.
Vielen Dank für eure Antworten!

Gruß
Andi

von Andi (Gast)


Lesenswert?

Sorry nochmal!
Wenn man in der Simulation den Databereich als 16 Bit Decimal anzeigt,
gibt es da eine Möglichkeit, die 16Bit-Werte in Little-Endian umrechnen
zu lassen?
Ich kann mich auf den Kopf stellen, der Simulator rechnet das für
Decimal-Darstellung immer mit Adresse0 * 256 + Adresse1, also in
Big-Endian um.

Gruß
Andi

von A.K. (Gast)


Lesenswert?

Auf dem Stack liegen Return-Adressen sinnigerweise Big-Endian.

von Andi (Gast)


Lesenswert?

Dann ist der AVR in einem Zwiespalt.
Einerseits werden Rücksprungadressen in Big-Endian auf den Stack (SRAM)
geschrieben und andererseits werden die 16 Bit Pointer-Register X, Y und
Z im Little-Endian verwendet
 ldi zl,low(...)  (r30)
 ldi zh,high(...) (r31)
oder die sind im Zusammenhang mit LD, LDD, ST oder STD andersrum
verschaltet.
Zusätzlich wird man von den APP-Notes noch dazu bewegt, alles im
Little-Endian zu machen.
Einen einheitlichen Standard, so rum für alles, gibts wolh nicht.

Wie dem auch sei, mir ging es eigentlich nur um die Darstellung des
Databereiches als 16 Bit Decimal ob man da was umdrehen kann.

Gruß
Andi

von Christian Zietz (Gast)


Lesenswert?

Für den Flash gibt's im Kontextmenü die Option "Swap Bytes", die
genau das macht. Um die auch für den RAM freizuschalten, müsste man
AVRStudio.exe patchen (sind nur 4 Bytes).

von Andi (Gast)


Lesenswert?

Habe das gerade für den Program-Bereich ausprobiert und genau so was
habe ich gesucht.
Wie geht der Patch, das es auch für den Data-Bereich geht?
Habe AVR-Studio 4.11 Build 401.

Gruß
Andi

von Christian Zietz (Gast)


Lesenswert?

@Andi: Ich habe leider noch eine ältere Version. Trotzdem hast Du Post.

von Christian Zietz (Gast)


Lesenswert?

Möglicherweise wollen auch andere Leser den Kontextmenü-Befehl "Swap
bytes" im Memory-Fenster auch für SRAM, Register und EEPROM
freischalten. Daher hier noch einmal öffentlich.

Zuerst der Disclaimer: Mit dem Patchen der Datei AVRStudio.exe verletzt
man Rechte von Atmel. Das Patchen geschieht komplett auf eigenes Risiko,
ich komme für evtl. juristische Folgen, Datenverlust, Fehlfunktionen
etc. nicht auf.

Gepatcht werden muss AVRStudio.exe:

Adresse    Byte alt    Byte neu

AVR-Studio 4.10, Build 356
00080C61:  75          90
00080C62:  26          90
00080FD4:  75          90
00080FD5:  2E          90

AVR-Studio 4.11, Build 401
00081661:  75          90
00081662:  26          90
000819D4:  75          90
000819D5:  2E          90

Christian

von Andi (Gast)


Lesenswert?

Bedanke mich hier auch bei Christian für seine Hilfe was ja schon per
Mail geschah.
Habe mir heute (gestern) die neueste Version AVR-Studio 4.11 SP2 Build
406 heruntergeladen und bin der Sache genauer auf den Grund gegangen.
Man muß mit einem HEX-Editor folgender maßen vorgehen um die Funktion
"Swap Bytes" für alle Bereiche freizuschalten:
1. Suchen nach der HEX-Kolonne (4 Bytes) 75 26 8A 87.
2. 75 26 ändern in 90 90.
3. Suchen nach der HEX-Kolonne 75 2E 8A 87.
4. 75 2E ändern in 90 90.

Die oben genannten HEX-Kolonnen gibt es jeweils nur ein mal in der
kompletten AVRStudio.exe.

MfG
Andi

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.