mikrocontroller.net

Forum: Compiler & IDEs I/O Register


Autor: Bastian Sch. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.