C-Compiler und Assembler

Gast #44474
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!
Gast
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.
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.