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

 
 
> 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
Ответов
vROMAv
сообщение Feb 11 2011, 10:22
Сообщение #2





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


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

 


RSS Текстовая версия Сейчас: 25th July 2025 - 16:24
Рейтинг@Mail.ru


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