Forum: Compiler & IDEs [F] GCC Optimierung


von Drobel (Gast)


Lesenswert?

Unten ein Codeauszug, bei dem ich meine, dass der GCC (avr-gcc (WinAVR 
20100110) 4.3.3) Optimierungen (Stufe S(ize)) nicht oder nicht 
vollständig durchführt.

*1 Da in R24 der Wert schon steht, braucht er nicht extra gelesen 
werden.

*2 SUBI setz das Z-Flag, so dass der Testvefehl überflüssig ist.

Sehe ich das richtig?



54:          --timeout;
+000001F0:   8189        LDD       R24,Y+1        Load indirect with 
displacement
+000001F1:   5081        SUBI      R24,0x01       *2 Subtract immediate
+000001F2:   8389        STD       Y+1,R24        *1 Store indirect
55:          if (timeout == 0)
+000001F3:   8189        LDD       R24,Y+1        *1 Load indirect
+000001F4:   2388        TST       R24            *2 Test for Zero or 
Minus
+000001F5:   F099        BREQ      PC+0x14        Branch if equal

von (prx) A. K. (prx)


Lesenswert?

Ich nehme an, timeout ist volatile. Dann darf er nicht optimieren.

von Drobel (Gast)


Lesenswert?

A. K. schrieb:

> Ich nehme an, timeout ist volatile. Dann darf er nicht optimieren.

Ja.

Heisst das, dass ich auf Assembler umsteigen muss, um die Routine zu 
kürzen und damit schneller zu machen?

von (prx) A. K. (prx)


Lesenswert?

Assembler ist nicht unbedingt nötig. Sinngemäss:
1
   uint8_t t = timeout - 1;
2
   timeout = t;
3
   if (t == 0)
4
      ...
Den redundanten 0-Test hast du dann aber vmtl. immer noch.

von Drobel (Gast)


Lesenswert?

Funktioniert. Danke für deinen Tipp.

1
    unsigned char t = timeout - 1;
2
3
    if (t == 0)
4
      {
5
       return (errTimeOut);
6
      }

von Yalu X. (yalu) (Moderator)


Lesenswert?

Bist du sicher, dass die automatische Variable timeout volatile sein
muss? Üblicherweise ist dies nur bei statischen Variablen sinnvoll.
Ausnahmen bestätigen aber auch hier die Regel.

von Drobel (Gast)


Lesenswert?

Yalu X. schrieb:

> Bist du sicher, dass die automatische Variable timeout volatile sein
> muss? Üblicherweise ist dies nur bei statischen Variablen sinnvoll.
> Ausnahmen bestätigen aber auch hier die Regel.

Die Varianle ist auto. Es geht ohne volatile. Danke.

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.