Ist schon jemandem aufgefallen, daß switch() R26 und R27 auf 0 setzt und dann aber nirgends verwendet: eor r26, r26 eor r27, r27 Ist mir auch erst im Interrupt aufgefallen, als da plötzlich soviele Register gepusht wurden. Peter
Das muß eine GCC-spezifische Sache sein. Hab eben mal in mein IAR-Programm geschaut. Der macht das nicht. Michael
"Das muß eine GCC-spezifische Sache sein." Ja stimmt, deshalb hab ichs ja im GCC-Forum geschrieben :-) Um genau zu sein, es ist der AVR-GCC Version 3.3.2 Peter
Ein Register würde ich noch verstehen: der switch-Ausdruck wird als `int' behandelt und daher auf 16 bits expandiert. Es gibt (bislang) keine Optimierung herauszufinden, ob das obere Byte dabei gar nicht benötigt würde und daher ignoriert werden kann. Zwei Register verstehe ich nicht wirklich.
Hier nochmal der komplette Sprungcode: switch( cmd ){ 3d4: 99 27 eor r25, r25 3d6: aa 27 eor r26, r26 3d8: bb 27 eor r27, r27 3da: fc 01 movw r30, r24 3dc: 4e 97 sbiw r24, 0x1e 3de: 08 f0 brcs .+2 3e0: 7e c0 rjmp .+252 3e2: ed 5c subi r30, 0xCD 3e4: ff 4f sbci r31, 0xFF 3e6: 09 94 ijmp R24 = cmd und R25 ist für die Erweiterung auf 16 Bit. Peter
kann ich nicht bestätigen Compiler: avr-gcc (GCC) 3.4.1 95:be_cmd.c **** 96:be_cmd.c **** UCHAR getaxisnumber(UCHAR c){ 185 .LM7: 186 /* prologue: frame size=0 */ 187 /* prologue end (size=0) */ 97:be_cmd.c **** switch( c ) { 189 .LM8: 190 0028 9927 clr r25 191 002a 8835 cpi r24,88 192 002c 9105 cpc r25,__zero_reg__ 193 002e 71F0 breq .L10 MooseC
Das tritt auch nur bei vielen "case" Anweisungen auf, wo es für den Compiler effektiver ist, eine Sprungtabelle zu verwenden (ijmp). Peter
gebe ich Dir Recht... 1975:be_cmd.c **** switch( ascii_cmd[0] ) { 5870 .LM680: 5871 20a4 892F mov r24,r25 5872 20a6 9927 clr r25 5873 20a8 AA27 clr r26 5874 20aa BB27 clr r27 5875 20ac FC01 movw r30,r24 5876 20ae B897 sbiw r30,40 5877 20b0 E333 cpi r30,51 5878 20b2 F105 cpc r31,__zero_reg__ 5879 20b4 08F0 brlo .+2 5880 20b6 4FC0 rjmp .L497 5881 20b8 E050 subi r30,lo8(-(pm(.L498))) MooseC 5882 20ba F040 sbci r31,hi8(-(pm(.L498))) 5
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.