Forum: Mikrocontroller und Digitale Elektronik Seltsame Warnung beim Assemblen (AVR)


von Hugoderwolf (Gast)


Lesenswert?

Ich hab mich jetzt endlich durchgerungen, meine AVR-Basteleien in
Assembler zu programmieren, da mein LCD mit C einfach keinen Mucks von
sich geben wollte. Bin jetzt auch erstaunlich weit gekommen und mein
LCD zeigt jetzt diese Zeilen auf den 16x4 Zeichen an:

59: string1:
60:  .db "Auf dieses LCD",0
61: string2:
62:  .db "passt eine Menge",0
63: string3:
64:  .db "nichtssagender",0
65:string4:
66:  .db "Text!",0

Wie man sieht, habe ich per ASM-Direktive die anzuzeigenden Strings in
den Programmspeicher gepackt. Das funktioniert auch wunderbar, nur
bekomme ich beim Assemblen eine verwirrende Warnung in den Zeilen 60,
63 u. 65:

warning: .cseg .db misalignment - padding zero byte

Nunja, mich verwirrt sowohl die Meldung als auch die Zeilen, in denen
sie auftaucht. Im Quellcode-Snippet seht ihr ja, welche das sind.
Wie gesagt, funktionieren tut es. Seltsamerweise sind im .hex-File nach
den String auch zwei 0-Stellen, außer beim letzten.

Forensuche hat nichts ergeben, weiß einer von euch was darüber?

von ...HanneS... (Gast)


Lesenswert?

Das ist normal.
Flash ist wortorientiert, wenn du Bytes definierst, sollte deren Anzahl
geradzahlig sein. Ist das nicht der Fall, hängt der Assembler eben eine
Null dran und meldet das mit dieser Warnung.

...

von dave w. (Gast)


Lesenswert?

Ist ganz einfach: du musst immer eine gerade Anzahl Bytes eintragen.
Wenn das nicht so ist, dann wird eines angehängt, und zwar ne 0...

Das ganze liegt darin, dass der Programmspeicher Wort-weise aufgebaut
ist.

dave

von Matthias (Gast)


Lesenswert?

Hi

Ich vermute mal das der Assembler labels mit Wortaddressen berechnet.
Hat das Datenfeld dann eine ungerade Anzahl Bytes wird eben zur
nächsten Wortaddresse mit 0-Bytes aufgefüllt. Sollte aber eigentlich
nicht nötig sein da der AVR ja auch Byteweise auf seinen
Programmspeicher zugreifen kann.

Matthias

von Hugoderwolf (Gast)


Lesenswert?

Mensch ihr seid ja schnell!

Danke für die Info. Da fällt mir nämlich ein, dass ich mich beim
eingeben des Quellcodes noch fragte, ob meine Strings eine gerade
Anzahl an Bytes haben muss, weil ja die Speicheradressen beim
Ansprechen im Programm mit 2 multipliziert werden, aufgrund von "Das
ist einfach so"(tm). ;)

von mmerten (Gast)


Lesenswert?

Beim Datenzugriff mit LPM Befehl ist zwar byteweiser Zugriff auf den
Programmspeicher möglich, aber als Programmspeicher und Zugriff mittels
PC nur mit 16 Bit Breite. Atmel hat sich bei seinem Assembler für die
Organisation Label im .CSEG als Word Adresse entschieden, während IAR
auch im .CSEG byte-orientiert arbeitet. Beim Atmel Assembler werden
automatisch immer gerade Adressen erzeugt.

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.