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.
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.
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.
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.
ich antworte nur deshalb nicht, weil ich mit lesen beschäftigt bin (Solange, bis ich es verstanden habe) ;-))
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.