Правильная обработка переменных в контексте прерываний

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Сообщения: 430
Зарегистрирован: Вс апр 18, 2021 15:43:55

Сообщение Kalisnik »

Прочитал статью, что если переменная модифицируется как в основном цикле кода, так и в прерывании, то в основном цикле, при записи в такую переменную, необходимо запретить прерывания. Причем это касается даже 8-ми битных переменных. Иначе возможна потеря данных при модификации переменной в прерывании. И проблема эта может долго не всплывать, так что даже устройства уходят в серийное производство и только потом, уже у клиента, проблема проявляется. Вопрос к Ассамблерщикам, это действительно так?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Это вопрос к автору программы.
Ибо если задуман садомазохизьм - то тут уж....
:)))
Если данные принимаются подпрограммой прерывания (или какой-то дополнителоьной к основной программе) - то на такой случай есть буфер приема и флаг-семафор:
"данные готовы/данные считаны(обработаны)".
8)
Реклама
Мучитель микросхем
Сообщения: 430
Зарегистрирован: Вс апр 18, 2021 15:43:55

Сообщение Kalisnik »

BOB51 писал(а):есть буфер приема и флаг-семафор:
"данные готовы/данные считаны(обработаны)".
Хорошая идея! :)
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Всё завсит от того, как модифицируется переменная. В любом случае, ядро AVR завершит текущую ассемблерную команду и только потом уйдёт по адресу прерывания.
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 430
Зарегистрирован: Вс апр 18, 2021 15:43:55

Сообщение Kalisnik »

Читал здесь: http://easyelectronics.ru/avr-uchebnyj- ... racii.html
Как я понял на ассемблере процедура записи выглядит так: сначала значение переменной читается -> модифицируется -> а потом записывается новое значение. И если прерывание случится после чтения значения (на 1 шагу процедуры), то после выхода из прерывания ядро вернется к прерванной операции (модификация -> запись)... т.е. начнет работу с прочитанным ранее значением переменной... а переменная уже была изменена в прерывании. Получается что информация записанная в прерывании будет потеряна. Я так понял.

Добавлено after 5 minutes 9 seconds:
Речь идет про язык программирования Си - забыл упомянуть.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

На такие вопросы ответ даст только распечатка листинга конкретной программы.
8)
Реклама
Мучитель микросхем
Сообщения: 430
Зарегистрирован: Вс апр 18, 2021 15:43:55

Сообщение Kalisnik »

Это пример из статьи:
Спойлер

Код: Выделить всё

volatile char flag_byte; 	// Просто флаговая переменная под флаги на разные случаи жизни
ISR (USART_RXC_vect)	// Обработчик прерывания
{
flag_byte|=1<<rcv_buff;
...
...
}
 
int main (void)		// Главная программа
{
INIT_ALL();
SEI();
...
...
...
TCCR0A  |=1<<WGM01;
flag_byte |=1<<options;
PORTB &=~(2<<1);
...
}
Самсусамыч

Сообщение Самсусамыч »

[uquote="Kalisnik",url="/forum/viewtopic.php?p=4101125#p4101125"]Прочитал статью, что если переменная модифицируется как в основном цикле кода, так и в прерывании, то в основном цикле, при записи в такую переменную, необходимо запретить прерывания.[/uquote]
ИМХО не нужно ничего в таком случае запрещать… лучше при возникновении прерывания значение этой переменной сохранить в стек, а перед выходом из прерывания вернуть значение из стека в переменную. Тем самым ничего не пропадёт.
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Если программа пытается модифицировать одну и ту же переменную из прерывания и из основного цикла, то алгоритм программы не корректный.

Добавлено after 1 minute 16 seconds:
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=4101226#p4101226"]Тем самым ничего не пропадёт.[/uquote]
Как не пропадёт? А куда денется значение переменной, присвоенное ей в прерывании? Быть может, это прерывание и задумывалось ради этого. К примеру, значение АЦП.
Самсусамыч

Сообщение Самсусамыч »

[uquote="parovoZZ",url="/forum/viewtopic.php?p=4101236#p4101236"]Как не пропадёт? А куда денется значение переменной, присвоенное ей в прерывании? Быть может, это прерывание и задумывалось ради этого.[/uquote]
Имелось ввиду… при использовании переменной в прерывании для расчётов, а не сохранения значений полученных в прерывании.

Хранить разные значения (для двух источников) в одной переменно это вообще как? Вот использовать переменную кратковременно, на каком либо участке алгоритма без потере её первоначального значения это возможно, а вот хранить разные значения в одной переменной не получится (если это не массив какой-то).
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Как я понял на ассемблере процедура записи выглядит так: сначала значение переменной читается -> модифицируется -> а потом записывается новое значение.
Вы хотите использовать переменную как флаговую? Других причин писать туда и из основного цикла, и из прерываний я не вижу. В таком случае да, проще запрета прерываний вряд ли что найдется.
Имелось ввиду… при использовании переменной в прерывании для расчётов, а не сохранения значений полученных в прерывании.
А для какой извращенной цели это может пригодиться?
Потому что если в функции (в т.ч. прерывании) нужно завести временную переменную, то ее делают локальной и хранят на стеке, а не портят глобальные.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

Kalisnik, ты сначала отфильтруй АЦП хоч
шоб не стрибало
ohmycode!
primuss3.com
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="Kalisnik",url="/forum/viewtopic.php?p=4101125#p4101125"]Вопрос к Ассамблерщикам, это действительно так?[/uquote] Странный вопрос. Учитывая, что вопрошающий понимает всю суть происходящего и даже способен это описать.
Холивара ради вопрос ?
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

кому нужен асм?
никому.
разве что тем, кто иногда заглядывает в .lss
и то, только для правки сишного кода
ohmycode!
primuss3.com
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Сообщение Alex_641 »

А какое прерывание имеется ввиду ? А если в прерывании по таймеру считается время чего нить ... то как потом компенсировать запрет в основном цикле ?
Не спрашивай по ком звонит колокол, он звонит по тебе !
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

онэ даже в приведении типов не рубит
ohmycode!
primuss3.com
Контактная информация:
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

{кому нужен асм?
никому}
Да мне нужен. Чтоб не трахаться так с простыми вопросами. И не гадать, что компилятор с кодом сделает.
Я всё-всё узнAю и стану профессором.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

компилятор сделает все как надо
результат зависит от твоей писанины
ohmycode!
primuss3.com
Контактная информация:
Мучитель микросхем
Сообщения: 430
Зарегистрирован: Вс апр 18, 2021 15:43:55

Сообщение Kalisnik »

[uquote="Аlex",url="/forum/viewtopic.php?p=4101300#p4101300"]Холивара ради вопрос ?[/uquote]
Первое, убедиться что я правильно понял. Второе, рассмотреть вопрос с разных сторон и почерпнуть, по возможности, что-то новое.
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Вот именно. А я не совсем не виртуоз писать на си. Потому и нужен мне асм. Так что не надо горячиться насчёт асм.
Я всё-всё узнAю и стану профессором.
Ответить

Вернуться в «AVR»