mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Compiler und Assembler


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.