IO Register expanded extended I/O Atm88

Gast #366812
Lesenswert?
• ▲
▼
Guten Tag allseits,
nachdem ich nun "Spass und Freude" damit habe, mit WinAVR statt mit
FastAVR(BAsic) meine AVRs zu programmieren und mir schon allerhand
angesehen habe und auch sehr schnell mit dem ganzen warm geworden bin,
stellt sich mir folgende Frage: (langer Satz)
Woher weis der GCC eigntlich, das (auch) im ATmega88 zB die IO nicht
mehr mit IN und OUT, sondern mit ST/STS/STD bzw. mit LD/LDS/LDD zu
erreichen sind. Steht das in der IOmx8.h und er erkennt automatisch,
das ab 0x60 in/out nicht funktioniert, oder wie geht das?

Dankeschön... :-)

AxelR.
Gast #366813
Lesenswert?
• ▲
▼
Jedes I/O-Register ist in der entsprechenden Header-Datei mit seiner
absoluten Adresse definiert. Dadurch kennt der Compiler also schon mal
die Adresse. Da der in-Befehl nur 6 Bit für die Adresse zur Verfügung
hat, ist klar, dass bei Adressen höher als 63 (0x3F) dieser Befehl
nicht mehr verwendet werden kann. Selbiges gilt natürlich auch für
out... Bei den Bitzugriffsbefehlen sieht das genauso aus, nur dass dort
nur 5 Bit zur Verfügung stehen. Wenn ein einzelnes Bit in einem
I/O-Register mit einer Adresse > 0x1F gesetzt werden soll, weiß der
Compiler, dass er nicht sbi nehmen kann, sondern dass er in -> sbr ->
out nehmen muss.
#366814
Lesenswert?
• ▲
▼
Konkret wuerde ich das so machen:

Der Teil mit den Adressen, so wie du ihn beschrieben
hast ist schon ok. Nur würde ich den Compiler (zunächst)
immer den Zugriff über die Adresse machen lassen.

Teil des Compilierprozesses ist auch das Optimieren.
Beim Optimieren gibt es einen sehr, sehr simplen aber
höchst effektiven speziellen Optimierer: den Peephole-Optimizer.
So ein Peephole-Optimizer arbeitet nach einem ganz simplen
Verfahren: man gibt ihm ein bestimmtes Muster vor und teilt
ihm auch noch mit womit dieses Muster ersetzt werden kann.
Im konkreten Fall gebe ich ihm also die Portzugriffe über
die Adressen vor und definiere als Ersetzung denselben
Zugriff über in/out.
Im Endeffekt braucht dann nämlich fast nichts programmiert
zu werden sondern es läuft alles auf ein paar Einträge in
ein paar Tabellen hinaus.
Gast #366817
Lesenswert?
• ▲
▼
So, nun hab ichs verstanden.

war den Tag wohl schon etwas spät - das was jonny geschrieben hat,
leuchtet ein. Bis dato habe ich nur in Assembler programmiert (naja und
etwas FastAVR).
Für den Austausch der "älteren" durch "neuere" Typen (sgat man wohl
neuerdings "MIGRATION" zu)existiert bei ATMEL aud der Website ein
schönes ASM-Makro, welches so ähnlich arbeitet, wie Karl-Heinz es
beschrieb.

Allerdings wollte ich kein eigenen Compiler schreiben gg.
War nur reine Neugierde...

Ich bedanke mich also wie sich das gehört und
wünsche einen schönen (Sonn)Tag

AxelR.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.