|
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 10 2011, 17:19
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(vROMAv @ Feb 10 2011, 16:16)  // WinAVR-20090313 // Есть и посвежее - рекомендую... Цитата volatile uint8_t event_flags; Сделайте 8 байтовых переменных вместо битовых флагов - это самое простое. Или работайте с битами атомарно (при запрещённых прерываниях, что может быть более накладно). Цитата(ar__systems @ Feb 10 2011, 19:06)  Дался вам этот волатайл. При чем тут вообще это? При том... Читайте стандарт там всё подробно описано.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 11 2011, 15:39
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(ar__systems @ Feb 11 2011, 16:43)  Переменная однобайтовая. Какая атомарность? Да байтовая но в ней 8 бит-флагов: как происходит изменение бита в ОЗУ, а вот так: 1 load 2 modify 3 store так если произойдёт прерывание между пунктами 1-3 изменяющее этот же байт, то все изменения сделанные в прерывании будут похерены пунктом 3. И напоследок: volatile нужен для любой переменной хоть битовой хоть байтовой, хоть QWORD , если эта переменная используется (пишется или только читается) в прерываниях или является частью SFR. Всё! Учим наизусть и повторяем вместо мантры:-) Не хотите читать стандарт - поищите по форуму, тема про volatile уже неоднократно всплывала.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 11 2011, 18:30
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(demiurg_spb @ Feb 11 2011, 10:39)  Да байтовая но в ней 8 бит-флагов: как происходит изменение бита в ОЗУ, а вот так: 1 load 2 modify 3 store
так если произойдёт прерывание между пунктами 1-3 изменяющее этот же байт, то все изменения сделанные в прерывании будут похерены пунктом 3. Да volatile к этой проблеме никакого отношения не имеет, и никак не поможет! Тут единственное что поможет, так это запрет прерываний на время доступа! Цитата Если эта переменная используется и в прерываниях и в основном цикле (или в нескольких потоках при использовании ОС). Да ради бога, только если у вас разграничение доступа не организвано должным образом, работать не будет все равно, volatile или нет. Иными словами, от критических секций вы все равно не избавитесь.
|
|
|
|
Сообщений в этой теме
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   Сергей Борщ QUOTE (demiurg_spb @ Feb 11 2011, 17:39) ... Feb 11 2011, 18:05    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 vROMAv Попутно ещё вопросик:
Например есть код
ISR()
{
... Feb 11 2011, 10:22 GetSmart Цитата(vROMAv @ Feb 11 2011, 15:22) Т.е. ... Feb 11 2011, 10:27 vROMAv ЦитатаПеременная однобайтовая. Какая атомарность?
... Feb 11 2011, 16:12
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|