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

 
 
> 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
ar__systems
сообщение Feb 11 2011, 18:30
Сообщение #5


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 или нет. Иными словами, от критических секций вы все равно не избавитесь.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 11 2011, 20:10
Сообщение #6


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

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



Цитата(ar__systems @ Feb 11 2011, 21:30) *
Да ради бога, только если у вас разграничение доступа не организвано должным образом, работать не будет все равно, volatile или нет. Иными словами, от критических секций вы все равно не избавитесь.
Для байтовой переменной на AVR избавлюсь от критической секции. И работать будет только если volatile.
Я Вас не пойму. Вы что-то из пустого в порожнее всё переливаете и переливаете. К чему это?
Перечитайте Ваши сообщения в этой ветке. Либо странные утверждения либо повторение за кем-то прописных истин после доходчивого разъяснения...

Цитата(Сергей Борщ @ Feb 11 2011, 21:05) *
Если эта переменная используется и в прерываниях и в основном цикле (или в нескольких потоках при использовании ОС).
Ваша формулировка как всегда более точная:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
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
|- - Сергей Борщ   QUOTE (demiurg_spb @ Feb 11 2011, 17:39) ...   Feb 11 2011, 18:05
- - 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 - 16:32
Рейтинг@Mail.ru


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