|
volatile не помагает |
|
|
|
Feb 10 2011, 13:16
|
Группа: Участник
Сообщений: 13
Регистрация: 10-02-11
Из: Украина
Пользователь №: 62 859

|
Есть некоторый код, проблема в том что имеется переменная которая после выхода из прерывания восстанавливает своё значение, т.е. независимо от 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(); } }
Помогите разобраться в ситуации...
|
|
|
|
|
 |
Ответов
|
Feb 11 2011, 10:22
|
Группа: Участник
Сообщений: 13
Регистрация: 10-02-11
Из: Украина
Пользователь №: 62 859

|
Попутно ещё вопросик: Например есть код
ISR() { adc_flags |= PROCESS_I_NEG; }
loop() { ................... if ( adc_flags & PROCESS_UOUT_POS ) { cli(); adc_flags &= ~PROCESS_UOUT_POS; sei(); } else { } .......... }
Компилятор превратит во чтото следующее
;if ( adc_flags & PROCESS_UOUT_POS )
R24,adc_flags
;///////////////////////////////// ; ТУТ ВОЗНИКАЕТ ВДРУГ ПРЕРЫВАНИЕ ;(где сохраняется регистр R24, затем добавляется бит PROCESS_I_NEG к adc_flags ;и воосстанавливается R24) ;/////////////////////////////////
;далее продолжается выполнение if SBRS R24,1<<PROCESS_UOUT_POS RJMP m1
;adc_flags &= ~PROCESS_UOUT_POS;
А вот тут вопрос: будет ли компилиться так (т.е. в R24 снова считывается adc_flag) CLI LDS R24,adc_flags ANDI R24,~PROCESS_UOUT_POS STS adc_flags,R24 SEI
или же возможна ситуация когда компилер не будет считывать в R24 переменную adc_flags, а посчитает что она ранее была считана в R24 и таким образом не учтёт изменение её в прерывании
Т.е. другими словами, необходимо ли и для if тоже использовать атомарность например в виде
cli() rez=adc_flags & PROCESS_UOUT_POS; sei()
if(rez) { ....... }
|
|
|
|
Сообщений в этой теме
vROMAv volatile не помагает Feb 10 2011, 13:16 sonycman Переменная сама по себе никак не может принимать п... Feb 10 2011, 13:40 vROMAv А где написано что event_flags принимает произволь... Feb 10 2011, 13:49 GetSmart Цитата(vROMAv @ Feb 10 2011, 18:49) Весь ... Feb 10 2011, 14:03 vROMAv Я же описал выше: Хожу по коду пошагово по F11,
По... Feb 10 2011, 14:15 GetSmart Ходите по асм-коду. Там всё предельно ясно - в рег... Feb 10 2011, 14:28 Oldring Цитата(vROMAv @ Feb 10 2011, 16:16) т.е. ... Feb 10 2011, 14:39 _Артём_ В AVRStudio добавте переменную в Watch и увидите г... Feb 10 2011, 14:50 vROMAv В файле mega32.map переменной event_flags нет вооб... Feb 10 2011, 14:56 ar__systems Дался вам этот волатайл. При чем тут вообще это? О... Feb 10 2011, 16:06 firstvald А есть опции оптимизатора? Если есть возможность ... Feb 10 2011, 16:28 demiurg_spb Цитата(vROMAv @ Feb 10 2011, 16:16) // ... Feb 10 2011, 17:19 ar__systems Цитата(demiurg_spb @ Feb 10 2011, 12:19) ... Feb 11 2011, 13:43  demiurg_spb Цитата(ar__systems @ Feb 11 2011, 16:43) ... Feb 11 2011, 15:39   Сергей Борщ QUOTE (demiurg_spb @ Feb 11 2011, 17:39) ... Feb 11 2011, 18:05   ar__systems Цитата(demiurg_spb @ Feb 11 2011, 10:39) ... Feb 11 2011, 18:30    demiurg_spb Цитата(ar__systems @ Feb 11 2011, 21:30) ... Feb 11 2011, 20:10 XVR А у вас в main_loop'е случайно нет локальной п... Feb 11 2011, 08:34 vROMAv Всем спасибо за помощь. Действительно в одном из у... Feb 11 2011, 08:53 _Pasha Цитата(vROMAv @ Feb 11 2011, 12:53) А вед... Feb 11 2011, 09:05  demiurg_spb Цитата(_Pasha @ Feb 11 2011, 12:05) Присм... Feb 11 2011, 09:08   _Pasha Цитата(demiurg_spb @ Feb 11 2011, 13:08) ... Feb 11 2011, 09:10    demiurg_spb Цитата(_Pasha @ Feb 11 2011, 12:10) Если ... Feb 11 2011, 09:46 GetSmart А я тоже без стеснений юзал битовые поля в неиспол... Feb 11 2011, 09:22 GetSmart Цитата(vROMAv @ Feb 11 2011, 15:22) Т.е. ... Feb 11 2011, 10:27 vROMAv ЦитатаПеременная однобайтовая. Какая атомарность?
... Feb 11 2011, 16:12
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|