Forum: Mikrocontroller und Digitale Elektronik Wie lang darf define byte sein?


von Dominik L (Gast)


Lesenswert?

Hallo!
Wenn ich im AVR Studio mit .db eine Reihe von Bytes definiere, wie lang
darf dann die Reihe nach rechts sein? Bis zu 36 Byte macht der Compiler
ohne Probleme, aber ab 36 bekomme ich dann die Warnung:

warning: .cseg .db misalignment - padding zero byte
Was bedeutet das?

Und nochmal was grundsätzliches zum Speicherzugriff. Im AVR Tutorial
steht, dass man bei der Zuweisung zum Z-Pointer nicht die eigentliche
Sprungmarke einsetzen soll, sondern das ganze *2 nehmen soll. Warum
muss ich das machen? Steht im Tutorial nicht erklärt. Und wenn ich das
beim einer Zuweisung so machen muss, muss ich das dann auch bei dem
Befehl:

adiw ZL, 1

beachten und für einen Schritt im Speicher weiter auch *2 nehmen?

MFG Dominik

von Rolf Magnus (Gast)


Lesenswert?

> Wenn ich im AVR Studio mit .db eine Reihe von Bytes definiere, wie
> lang darf dann die Reihe nach rechts sein? Bis zu 36 Byte macht
> der Compiler ohne Probleme,

Wenn du Probleme hast, alle in eine Zeile zu packen, dann pack sie halt
in mehrere Zeilen.

> aber ab 36 bekomme ich dann die Warnung:


> warning: .cseg .db misalignment - padding zero byte
> Was bedeutet das?

Daß der Assembler eine ungerade Anzahl von Bytes vorgefunden hat. Da
der Programmspeicher 16bit breit ist, muß es immer eine gerade Anzahl
sein. Er sagt dir, daß er noch ein Byte mit dem Wert 0 eingefügt hat,
um das zu erreichen.

> Und nochmal was grundsätzliches zum Speicherzugriff. Im AVR
> Tutorial steht, dass man bei der Zuweisung zum Z-Pointer nicht die
> eigentliche Sprungmarke einsetzen soll, sondern das ganze *2
> nehmen soll. Warum muss ich das machen?

Die Sprungmarke rechnet auch in 16bit-Schritten. Da Daten aber immer
8bit breit sind, gibt es pro 16bit-Adresse zwei Werte, und damit man
die zweite Hälfte jedes Speicherworts auch lesen kann, ist die Adresse
beim Datenzugriff doppelt so groß.

> Steht im Tutorial nicht erklärt. Und wenn ich das beim einer
> Zuweisung so machen muss, muss ich das dann auch bei dem
> Befehl:
>
> adiw ZL, 1
>
> beachten und für einen Schritt im Speicher weiter auch *2 nehmen?

Nur, wenn du ein Byte überspringen willst.

von Dominik L (Gast)


Lesenswert?

OK danke für die ausführliche Erklärung. Is jetzt schon um einiges
klarer geworden.
Wenn ich es in mehrere Zeilen schreiben möchte, brauche ich ja
anscheinend vor jeder Zeile ein neues .db. Werden die dann vom Linker
direkt hintereinander gehängt? Wo finde ich eigentlich die Datei, die
vom Linker ausgegeben wird, also die .lst ist das glaube ich, wo der
komplette Code mit den zusammenhängenden Adressen drinstehen?
Mein AVR Studio erzeugt die irgendwie nicht. Zumindest finde ich sie
nicht im Projektordner.

Gruß Dominik

von Mark H. (haemi)


Lesenswert?

Salve,

ja, aufeinanderfolgende .db-Zeilen werden auch im Speicher
zusammengehängt. Was soll dazwischen auch kommen?
Du mußt halt nur drauf achten, daß nicht nur ein .db-Block, sondern
wirklich jede einzelne Zeile eine gerade Anzahl von Bytes enthält,
sonst paddet der Assembler jede Zeile mit einem Zero-Byte. Und dann
kommt Murks raus.

Mark

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.