реклама на сайте
подробности

 
 
> volatile не помагает
vROMAv
сообщение Feb 10 2011, 13:16
Сообщение #1





Группа: Участник
Сообщений: 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();
}
}


Помогите разобраться в ситуации...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
demiurg_spb
сообщение Feb 10 2011, 17:19
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 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) *
Дался вам этот волатайл. При чем тут вообще это?
При том... Читайте стандарт там всё подробно описано.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Feb 11 2011, 13:43
Сообщение #3


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(demiurg_spb @ Feb 10 2011, 12:19) *
При том... Читайте стандарт там всё подробно описано.


Переменная однобайтовая. Какая атомарность?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 11 2011, 15:39
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 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 уже неоднократно всплывала.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 11 2011, 18:05
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (demiurg_spb @ Feb 11 2011, 17:39) *
если эта переменная используется (пишется или только читается) в прерываниях или является частью SFR.
Если эта переменная используется и в прерываниях и в основном цикле (или в нескольких потоках при использовании ОС).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - 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
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 03:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016