Forum: Compiler & IDEs I/O Register


von Bastian Sch. (Gast)


Lesenswert?

Hallo!

Ich weiß nicht ob das hier die richtige News Group für die Frage ist,
aber ich probiere es mal.

Wenn ich auf das DDRA Register zugreifen, dann ändert der Präprozessor
die Adresse des DDRA Registers (0x1A) auf folgendes: 0x1a+0x20. Wenn
maan die Dokumentation des ATmega 16 ansieht, ist dieses auch klar, da
im Data Adress Space das Register File vor den I/O Registern kommt und
die genau bis 0x20 gehen. Im daraus erzeugten Assembler steht dann aber
wieder 58-0x20. Der Wert wird also wieder abgezogen. Wenn man sich dann
ein Dissassemble vom Objekt Code ansieht, danns teht da wieder 0x1a.
Jetzt meine Frage: Wieso das ganze Gehampel?

Vielen Dank schonmal für eure Tips! ;-)

Viele Grüße

Bastian

von A.K. (Gast)


Lesenswert?

Weil der Compiler in absoluten Adressen rechnet, der Assembler für die
Adressen in I/O-Befehle jedoch einen eigenen um 0x20 verschobenen
Adressraum verwendet.

von Jörg Wunsch (Gast)


Lesenswert?

Um noch ein wenig weiter auszuholen:

Generell kann man auf alle IO-Register mit Speicherzugriffen arbeiten
(memory-mapped IO), nur auf einen Teil davon mit IN- und OUT-Befehlen
und wiederum auf einen noch kleineren Teil davon mit SBI- und
CBI-Befehlen (und das auch nur, wenn die Veränderung nur ein einzelnes
Bit betrifft, dessen Position zur Compilezeit bekannt ist).

Daher ist der Ansatz, über die Speicheradresse zu gehen, erstmal der
generische.  Der Rest wird dann über die Optimierung des Compilers
erledigt, falls er merkt, dass er eine effektivere Zugriffsmethode
anwenden kann (und dann weiß er auch, dass er die 0x20 abziehen kann).

Klar, man hätte gleich alle IO-Register direkt mit ihren
Speicheradressen in den Headerdateien angeben können (_SFR_MEM8 statt
_SFR_IO8), aber gerade für die älteren AVRs war die Sichtweise nach
Portadressen gängiger, durch die Verwendung eines eigenen Makros dafür
war es daher günstiger, die Datenblattangaben auf die Headerdateien
abzubilden.

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.