Цитата(_Pasha @ Dec 1 2008, 17:12)

Господа, внимание! Мой путь через ж%пу к звездам:
исходные те же
Код
int main(void)
{
while(1)
{
tty ? (void)(UR1=data) : (void)(UR0=data);
}
return(0);
}
Мдя... Тогда уж лучше, если так хочется поизвращаться, переходить на С++ (заодно и с атомарными фрагментами кода будет легче через класс критической секции).
В С++ несколько унифицировали понятие lvalue и он допускает не только возможное в С
Код
variable = (flag ? function1 : function2)(argument1, argument2);
вместо
Код
variable = (flag ? function1(argument1, argument2) : function2(argument1, argument2) );
но и такое:
Код
#include <avr/io.h>
void foo(uint8_t flag, uint8_t data)
{
(flag ? PORTB : PORTC) = data;
}
Код
.global _Z3foohh
.type _Z3foohh, @function
_Z3foohh:
/* prologue: frame size=0 */
/* prologue end (size=0) */
tst r24
breq .L2
out 37-0x20,r22
ret
.L2:
out 40-0x20,r22
ret
Кстати, это только более простая и логичная запись допустимого в С
Код
*(flag ? &PORTB : &PORTC) = data;
с шансами на упрощение работы оптимизатора - ему теперь не надо будет в "сыром" коде взятые по флагу указатели сводить назад в константные out, что он может и не потянуть. А пример выше с функциями - это по сути пример с указателями, поэтому и в чистом С катит.