Hallo Leute,
ich habe jetzt schon diverse stellen gefunden, die der GCC einfach mal
miserabel löst. Hier die für mich bedeutenste:
1 | 44:dcf77.c **** if ((unsigned char)((unsigned
|
2 | char)dcf77_State & (unsigned char)DCF77_StateMask) != (unsigned
|
3 | char)DCF77_StateSense) return;
|
4 | 147 .LM5:
|
5 | 148 0016 8091 0000 lds r24,dcf77_State
|
6 | 149 001a 9927 clr r25
|
7 | 150 001c 8C70 andi r24,lo8(12)
|
8 | 151 001e 9070 andi r25,hi8(12)
|
9 | 152 0020 0C97 sbiw r24,12
|
10 | 153 0022 41F4 brne .L2
|
Es ist alles nach (unsigned char) gecastet und dennoch macht der gcc
daraus eine Integer operation (16 Bit). Erst wenn ich eine Register
variable definiere, die den berechneten Wert erhält, wird der Vergleich
ein simpler 8-Bit-Vergleich:
1 | 43:dcf77.c **** register unsigned char temp = (dcf77_State &
|
2 | DCF77_StateMask);
|
3 | 146 .LM5:
|
4 | 147 0014 8091 0000 lds r24,dcf77_State
|
5 | 148 0018 8C70 andi r24,lo8(12)
|
6 | 45:dcf77.c **** if (temp != DCF77_StateSense) return;
|
7 | 150 .LM6:
|
8 | 151 001a 8C30 cpi r24,lo8(12)
|
9 | 152 001c 41F4 brne .L2
|
Wieso bekommt er das nicht auch schon beim casten hin oder merkt es gar
selber, dass nur 8-bit-Werte beteiligt sind?
Irgendwie hat Assembler schon so seine Vorteile.
Schöne Grüße, Clemens