luben111 0 12 декабря, 2009 Опубликовано 12 декабря, 2009 (изменено) · Жалоба У меня проблема такая возникла с компилятором IAR 5.3 для AVR, камень Tiny88 - оптимизатор не 'видит' что переменная можно менять в прерывание. В результате код не правильно оптимизирован - MoreCode() удален так как while (flagWasI2C != 1) всегда true. Код на уровне main() в MainCode.c модуле: extern uint8_t flagWasI2C; void main(void) { ....... Protect(); flagWasI2C = 0; UnProtect(); do // wait for I2C communication { __watchdog_reset(); } while (flagWasI2C != 1); MoreCode(); // this section is not compiled } Protect() - CLI, UnProtect - SEI и в перерывание для TWI (находиться в I2C.c модуле): uint8_t flagWasI2C; #pragma vector=TWI_vect __interrupt void TWI_ISR( void ) { DoSomething(); flagWasI2C = 1; } При компиляции с максимальной оптимизации можно увидеть что MoreCode() просто удален - переменная flagWasI2C установлена в нуль и в main() не видно что она можно меняться в TWI ISR. Как можно обмануть компилятор чтобы он не удалял MoreCode()? Нашел что если поставит операция с регистрами и как то оптимизатор начинает правилно 'смотреть' и код работает: extern uint8_t flagWasI2C; void main(void) { ....... Protect(); flagWasI2C = 0; UnProtect(); DDRA = 12; // и MoreCode() уже присуствует!!! do // wait for I2C communication { __watchdog_reset(); } while (flagWasI2C != 1); MoreCode(); // this section is not compiled } Изменено 12 декабря, 2009 пользователем Student2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 12 декабря, 2009 Опубликовано 12 декабря, 2009 · Жалоба Если flagWasI2C изменяется асинхронно по отношению к основному процессу, т. е. в прерывании, то надо было объявить её как volatile. extern volatile uint8_t flagWasI2C; // в файле с прерыванием: uint8_t volatile flagWasI2C; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
luben111 0 12 декабря, 2009 Опубликовано 12 декабря, 2009 · Жалоба Спасибо - сейчас работает! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться