Есть некоторый код, проблема в том что имеется переменная которая после выхода из прерывания восстанавливает своё значение, т.е. независимо от volatile компилятор по ходу разместил переменную event_flag в регистре??!!! При чём данная ситуация возникает не часто, иногда установленное значение в прерывании остаётся и после выхода из него((
///////////////////////////////// // AVR Studio 4.16 Build 628 // // WinAVR-20090313 // // Atmega8535 // /////////////////////////////////
............................ volatile uint8_t event_flags; #define START 0x01 ............................ #define PACK_NOW 0x20
volatile uint8_t macro_rx = 0;
ISR (USART_RX_vect) { ............. ............. event_flags |= PACK_NOW; macro_rx = 1;
//тут PACK_NOW устанавливается, но после выхода из прерывания, //в event_flags восстанавливается предыдущее значение
}
void main_loop() { ............ ............ if(macro_rx) { if(!(event_flags & PACK_NOW)) { //!!!!!! ОШИБКА !!!!!! //т.е. macro_rx так и осталась в установленном в прерывании значении //а event_flags нет!!! } } ............ ............ }
int main() { while (true) { main_loop(); } }
Помогите разобраться в ситуации...
|