Навеяло недавним вопросом на сахаре насчет изменения тетрады порта.
Простенькая ситуация. Оптимизатор ИАР (3-10 или 4-21) жжот (потеря одного ANDI):
2 int main( void )
\ main:
3 {
4 char qq=PORTC;
\ 00000000 B315 IN R17, 0x15
5 char tt=PINE;
\ 00000002 B101 IN R16, 0x01
6
7 qq |= ((qq&0xf0)|(tt&0x0f));
8 PORTС = qq;
\ 00000004 700F ANDI R16, 0x0F
\ 00000006 2B01 OR R16, R17
\ 00000008 BB05 OUT 0x15, R16
9
10 return 0;
\ 0000000A E000 LDI R16, 0
\ 0000000C E010 LDI R17, 0
\ 0000000E 9508 RET
11 }Лечение ситуации:
- делать в разных строках (это понятно и почти всегда выручает),
- делать все без переменных,сразу на портах, или переменные volatile (но коипилер предупредит насчет behavior).
- поменять местами операнды (вот это круто).