Forum: Mikrocontroller und Digitale Elektronik C-Compiler und Assembler


von Martin (Gast)


Lesenswert?

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!

von crazy horse (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.