Немного не в тему, потому как речь о версии ИАР 4.3. Но опера та-же. Не понимаю, почему ИАР считает заранее известным условие с volatile переменными:
Код
volatile union { // для доступа к одной ячейке памяти разными способами
unsigned long all; // для доступа ко всем 4-м байтам
unsigned char byte[4]; // для побайтного доступа
} recbuf;
#pragma vector=INT0_vect
__interrupt void ext_int0_isr(void)
{
...
recbuf.all>>=1; // сдвиг буфера на 1 бит
if(bit)recbuf.byte[3]|=0x80; // добавили единичку, если это она
...
}
void main(void)
{
__enable_interrupt();
while (1)
{
if((recbuf.byte[0] ==~recbuf.byte[1]) // это условие даже не проверяется
&&(recbuf.byte[2]==~recbuf.byte[3])) // правда ругается на неопределенный порядок доступа
{
// чтото делаем - этот код компилятор выкидывает даже на низких уровнях оптимизации
}
}
}
Если то условие заменить таким - то все работает:
Код
tmp = ~recbuf.byte[1];
if(recbuf.byte[0] == tmp)
{
tmp = ~recbuf.byte[3];
if(recbuf.byte[2] == tmp)
Присоединяю файл проекта если у кого не развита телепатия