Wo ist da eine "Lücke" in C? 
Ist vielleicht etwas umständlich hinzuschreiben, dafür bleibt man bei den Standards:
Code:
extern uint8_t command_rc5, Ir_data_tmp;
void foo()
{
if (Ir_data_tmp & (1<<5))
command_rc5 |= (1<<7);
else
command_rc5 &= ~(1<<7);
}
Sieht doch gut aus, was avr-gcc daraus macht, oder?! sbic/sbis sind eh nur auf einige SFRs anwendbar...
Code:
foo:
lds r24,Ir_data_tmp
lds r25,command_rc5
sbrs r24,5
rjmp .L5
ori r25,lo8(-128)
rjmp .L7
.L5:
andi r25,lo8(127)
.L7:
sts command_rc5,r25
ret
Und falls das immer noch zu lange ist:
Code:
void foo()
{
uint8_t cmd = command_rc5 & ~(1<<7);
if (Ir_data_tmp & (1<<5))
cmd |= (1<<7);
command_rc5 = cmd;
}
gibt:
Code:
foo:
lds r25,command_rc5
andi r25,lo8(127)
lds r24,Ir_data_tmp
sbrc r24,5
ori r25,lo8(-128)
.L5:
sts command_rc5,r25
ret
Kürzer oder schneller schreibt das niemand.
Lesezeichen