mikrocontroller.net

Forum: Compiler & IDEs Compiler Ergebnis unverständlich


Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Umgebung Attiny2313 1Mhz, neuestes Winavr


wollte mal das Timingverhalten bei Portpins testen und hab mir dazu das
Assembler-Listing angeschaut.

#define LED_rot_an   (PORTD |= (1<<LED_rot))
#define LED_rot_aus  (PORTD &= ~(1<<LED_rot))

In der main Routine dann
   do
  {
    LED_rot_aus;
    LED_rot_an;

  }
   while (1);

Daraus erzeugt der Compiler fogendes:
   do
  {
    LED_rot_aus;
  78:  95 98         cbi  0x12, 5  ; 18
    LED_rot_an;
  7a:  95 9a         sbi  0x12, 5  ; 18
  7c:  95 98         cbi  0x12, 5  ; 18
  7e:  95 9a         sbi  0x12, 5  ; 18
  80:  fb cf         rjmp  .-10       ; 0x78


Wieso wird vor rjmp nochmals ein cbi und sbi gemacht, obwohl ich das
gar nicht programmiert habe.

Sollte es nicht so aussehen:
   do
  {
    LED_rot_aus;
  78:  95 98         cbi  0x12, 5  ; 18
    LED_rot_an;
  7a:  95 9a         sbi  0x12, 5  ; 18
  rjmp

Bitte erklärt mir das, danke

Volker

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-Os statt -O2
Willst Du Platz sparen, oder Zeit?
Stichwort: "loop unrolling".

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab noch was vergessen:

#define LED_rot 5

natürlich macht es keinen Sinn eine LED mit so hoher Frequenz zu
takten, mir geht es lediglich ums Prinzip, dass der Compiler manches
wegoptimiert ist klar, aber dass er einiges hinzufügt verstehe ich
nicht ganz.

Viele Grüße

Volker

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@A.K.

danke, mit -Os gehts wunderbar, nur verstehe ich eines immer noch
nicht, durch den Zusatz ist weder Geschwindigkeit noch Platz optimiert
(beides ist schlechter).

Nun ja, du hast mir ja ein Stichwort gegeben, werde mal auf die Suche
gehen.

Volker

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Code ist schneller? Die von dir erwartete Version (6 Takte pro
Iteration) oder die von GCC erzeugte Version (10 Takte pro 2
Iterationen, also effektiv 5 pro Iteration)? Du hast dem Compiler
gesagt, er soll auf Laufzeit optimieren. Das hat er getan.

Siehe http://www.nullstone.com/htmls/category/unroll.htm

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt hab ichs kapiert, hab auch noch einen anderen Thread gefunden,
da hatte jemand das gleiche Problem:

http://www.mikrocontroller.net/forum/read-2-214013...

vielen Dank nochmals, man lernt halt nie aus...

Volker

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.