Hallo Leute! Ich bastle gerade eine zeitkritische Anwendung unter C mit dem Atmega8. Ich benutze den C-Compiler Codevision AVR. Es würde sich alles ausgehen, wenn da nicht folgendes wäre: Wenn ich z.B. bei PortB was hinausschicken möchte PORTB=0x00; ,dann benötigt das Programm 9 Takte. Folgender Assemblercode wurde dabei generiert: 99: PORTB=0x00; +0000005B: D067 RCALL +0x0067 Relative call subroutine Wenn ich aber auf PortC was hinausschicke dan benötigt der Kontroller nur 2 Takte. PORTC=0x00; Folgender Assemblercode wurde dabei erstellt: 91: PORTC=0x00; +00000058: 27EE CLR R30 Exclusive OR +00000059: BBE5 OUT 0x15,R30 Out to I/O location Meine Frage: Ist das ein Fehler vom C-Compiler oder braucht der Kontroller für PORTB immer 9 Takte? Warum sind hier zwei völlig verschiedene Anweisungen für zwei verschiedene PORTS? Bitte helft mir ich bin in Assembler nicht besonders Sattelfest. Danke für eure Hilfe. Martin!
Wahrscheinlich wird derselbe Befehl an anderer Stelle nochmal gebraucht, deshalb fasst der Codeoptimierer das zu einem UP zusammen. Stelle mal die Compiler-Options statt auf "size" auf "speed", damit sollte es behoben sein.
Hi Huch. Ein UP-Aufruf um einen Port auf 0 zu setzen? Kennt der Codevision denn kein 0-Register? Der AVRGCC reduziert PORTB=0; auf OUT PORTB,R1 Matthias
Hallo crazy horse! Danke für deinen Tipp. Ich weiß jetzt auch, warum der Compiler beim PORTB ein Unterprogramm aufgerufen hat. Dieser PORT gibt nämlich Daten aus. Für die Ausgabe wird er öfters benutzt. Aus diesem Grund hat der Compiler ein Unterprogramm angelegt, um Code zu sparen. Genial. Ein Umschalten auf Speed-Optimierung hilft. Danke nochmal. Martin
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.