Forum: Compiler & IDEs IO Register expanded extended I/O Atm88


von AxelR. (Gast)


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.

von johnny.m (Gast)


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.

von Karl heinz B. (kbucheg)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Genau so funktioniert es.  Daher wird es auch mittelmäßig
uneffektiv, wenn man die Optimierung ausschaltet, dann wird
nämlich immer und für alles MMIO (memory-mapped IO) benutzt.

von Axel R. (Gast)


Lesenswert?

ich antworte nur deshalb nicht, weil ich mit lesen beschäftigt bin
(Solange, bis ich es verstanden habe)  ;-))

von Axel R. (Gast)


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.

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.