Столкнулся с очень интересным эффектом. Есть два кода, с моей точки зрения, которые должны работать идентично. Но первый случай не работает, второй работает безупречно.
Код
tty ? (UDR1 = data) : (UDR0 = data);
disasm code:
+000023EA: 91E010C5 LDS R30,0x10C5 Load direct from data space
+000023EC: 91F010C6 LDS R31,0x10C6 Load direct from data space
+000023EE: 0FE9 ADD R30,R25 Add without carry
+000023EF: 1DF1 ADC R31,R1 Add with carry
+000023F0: 8180 LDD R24,Z+0 Load indirect with
+000023F1: 938000CE STS 0x00CE,R24 Store direct to data space
+000023F3: 918000CE LDS R24,0x00CE Load direct from data space
Код
if (tty > 0)
UDR1 = data;
else
UDR0 = data;
disasm come:
+000023E8: 91E010C5 LDS R30,0x10C5 Load direct from data space
+000023EA: 91F010C6 LDS R31,0x10C6 Load direct from data space
+000023EC: 0FE9 ADD R30,R25 Add without carry
+000023ED: 1DF1 ADC R31,R1 Add with carry
+000023EE: 8180 LDD R24,Z+0 Load indirect with
+000023EF: 938000CE STS 0x00CE,R24 Store direct to data space
При дизасме в первом случае, вижу на мой взгляд абсолютно бесполезную строчку
Код
LDS R24,0x00CE Load direct from data space
но которая(мне кажется) ломает функционал uart начисто (проявляется следующим образом: из регистра приёмника вычитывается байт, который был вычитан до этого. То есть вижу иногда в общем пакете по два одинаковых байта).
Кто-нибудь может пояснить значение этой строчки??? Рботающий и неработающий коды отличаются только ей. И чем собственно коснтрукция ? : ; для компилятора отличается от if else?