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
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?
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.
Funktioniert. Danke für deinen Tipp.
1 | unsigned char t = timeout - 1; |
2 | |
3 | if (t == 0) |
4 | {
|
5 | return (errTimeOut); |
6 | }
|
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.