Например TDA7294

Форум РадиоКот • Просмотр темы - Правильная обработка переменных в контексте прерываний
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 19:54:01

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 85 ]  1, , , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 13:10:29 
Мучитель микросхем

Зарегистрирован: Вс апр 18, 2021 15:43:55
Сообщений: 422
Рейтинг сообщения: 0
Прочитал статью, что если переменная модифицируется как в основном цикле кода, так и в прерывании, то в основном цикле, при записи в такую переменную, необходимо запретить прерывания. Причем это касается даже 8-ми битных переменных. Иначе возможна потеря данных при модификации переменной в прерывании. И проблема эта может долго не всплывать, так что даже устройства уходят в серийное производство и только потом, уже у клиента, проблема проявляется. Вопрос к Ассамблерщикам, это действительно так?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 13:30:39 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Это вопрос к автору программы.
Ибо если задуман садомазохизьм - то тут уж....
:)))
Если данные принимаются подпрограммой прерывания (или какой-то дополнителоьной к основной программе) - то на такой случай есть буфер приема и флаг-семафор:
"данные готовы/данные считаны(обработаны)".
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 13:40:58 
Мучитель микросхем

Зарегистрирован: Вс апр 18, 2021 15:43:55
Сообщений: 422
Рейтинг сообщения: 0
BOB51 писал(а):
есть буфер приема и флаг-семафор:
"данные готовы/данные считаны(обработаны)".

Хорошая идея! :)


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 14:49:13 
Мудрый кот

Карма: 11
Рейтинг сообщений: 114
Зарегистрирован: Пт июн 01, 2018 07:28:45
Сообщений: 1759
Рейтинг сообщения: 0
Всё завсит от того, как модифицируется переменная. В любом случае, ядро AVR завершит текущую ассемблерную команду и только потом уйдёт по адресу прерывания.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 15:15:06 
Мучитель микросхем

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

Добавлено after 5 minutes 9 seconds:
Речь идет про язык программирования Си - забыл упомянуть.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 15:36:09 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
На такие вопросы ответ даст только распечатка листинга конкретной программы.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 15:50:27 
Мучитель микросхем

Зарегистрирован: Вс апр 18, 2021 15:43:55
Сообщений: 422
Рейтинг сообщения: 0
Это пример из статьи:
Спойлер
Код:
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);
...
}


Вернуться наверх
 
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 16:42:00 
Прочитал статью, что если переменная модифицируется как в основном цикле кода, так и в прерывании, то в основном цикле, при записи в такую переменную, необходимо запретить прерывания.

ИМХО не нужно ничего в таком случае запрещать… лучше при возникновении прерывания значение этой переменной сохранить в стек, а перед выходом из прерывания вернуть значение из стека в переменную. Тем самым ничего не пропадёт.


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 16:56:12 
Мудрый кот

Карма: 11
Рейтинг сообщений: 114
Зарегистрирован: Пт июн 01, 2018 07:28:45
Сообщений: 1759
Рейтинг сообщения: 0
Если программа пытается модифицировать одну и ту же переменную из прерывания и из основного цикла, то алгоритм программы не корректный.

Добавлено after 1 minute 16 seconds:
Тем самым ничего не пропадёт.

Как не пропадёт? А куда денется значение переменной, присвоенное ей в прерывании? Быть может, это прерывание и задумывалось ради этого. К примеру, значение АЦП.


Вернуться наверх
 
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 17:07:55 
Как не пропадёт? А куда денется значение переменной, присвоенное ей в прерывании? Быть может, это прерывание и задумывалось ради этого.

Имелось ввиду… при использовании переменной в прерывании для расчётов, а не сохранения значений полученных в прерывании.

Хранить разные значения (для двух источников) в одной переменно это вообще как? Вот использовать переменную кратковременно, на каком либо участке алгоритма без потере её первоначального значения это возможно, а вот хранить разные значения в одной переменной не получится (если это не массив какой-то).


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 17:37:16 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
Цитата:
Как я понял на ассемблере процедура записи выглядит так: сначала значение переменной читается -> модифицируется -> а потом записывается новое значение.

Вы хотите использовать переменную как флаговую? Других причин писать туда и из основного цикла, и из прерываний я не вижу. В таком случае да, проще запрета прерываний вряд ли что найдется.
Цитата:
Имелось ввиду… при использовании переменной в прерывании для расчётов, а не сохранения значений полученных в прерывании.

А для какой извращенной цели это может пригодиться?
Потому что если в функции (в т.ч. прерывании) нужно завести временную переменную, то ее делают локальной и хранят на стеке, а не портят глобальные.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 17:58:14 
Опытный кот
Аватар пользователя

Карма: -14
Рейтинг сообщений: -98
Зарегистрирован: Ср дек 01, 2010 00:38:15
Сообщений: 882
Откуда: Харьков
Рейтинг сообщения: 0
Kalisnik, ты сначала отфильтруй АЦП хоч
шоб не стрибало

_________________
ohmycode!
primuss3.com


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 19:26:30 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Вопрос к Ассамблерщикам, это действительно так?
Странный вопрос. Учитывая, что вопрошающий понимает всю суть происходящего и даже способен это описать.
Холивара ради вопрос ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 20:01:18 
Опытный кот
Аватар пользователя

Карма: -14
Рейтинг сообщений: -98
Зарегистрирован: Ср дек 01, 2010 00:38:15
Сообщений: 882
Откуда: Харьков
Рейтинг сообщения: 0
кому нужен асм?
никому.
разве что тем, кто иногда заглядывает в .lss
и то, только для правки сишного кода

_________________
ohmycode!
primuss3.com


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 20:08:39 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: -14
Рейтинг сообщений: 103
Зарегистрирован: Вт янв 26, 2021 22:33:21
Сообщений: 2323
Рейтинг сообщения: 0
А какое прерывание имеется ввиду ? А если в прерывании по таймеру считается время чего нить ... то как потом компенсировать запрет в основном цикле ?

_________________
Не спрашивай по ком звонит колокол, он звонит по тебе !


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 20:24:00 
Опытный кот
Аватар пользователя

Карма: -14
Рейтинг сообщений: -98
Зарегистрирован: Ср дек 01, 2010 00:38:15
Сообщений: 882
Откуда: Харьков
Рейтинг сообщения: 0
онэ даже в приведении типов не рубит

_________________
ohmycode!
primuss3.com


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 20:24:30 
Вымогатель припоя

Карма: -8
Рейтинг сообщений: 49
Зарегистрирован: Вс дек 28, 2014 21:54:05
Сообщений: 615
Рейтинг сообщения: 3
{кому нужен асм?
никому}
Да мне нужен. Чтоб не трахаться так с простыми вопросами. И не гадать, что компилятор с кодом сделает.

_________________
Я всё-всё узнAю и стану профессором.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 20:31:22 
Опытный кот
Аватар пользователя

Карма: -14
Рейтинг сообщений: -98
Зарегистрирован: Ср дек 01, 2010 00:38:15
Сообщений: 882
Откуда: Харьков
Рейтинг сообщения: 0
компилятор сделает все как надо
результат зависит от твоей писанины

_________________
ohmycode!
primuss3.com


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 21:17:26 
Мучитель микросхем

Зарегистрирован: Вс апр 18, 2021 15:43:55
Сообщений: 422
Рейтинг сообщения: 0
Холивара ради вопрос ?

Первое, убедиться что я правильно понял. Второе, рассмотреть вопрос с разных сторон и почерпнуть, по возможности, что-то новое.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильная обработка переменных в контексте прерываний
СообщениеДобавлено: Вт окт 05, 2021 21:17:55 
Вымогатель припоя

Карма: -8
Рейтинг сообщений: 49
Зарегистрирован: Вс дек 28, 2014 21:54:05
Сообщений: 615
Рейтинг сообщения: 0
Вот именно. А я не совсем не виртуоз писать на си. Потому и нужен мне асм. Так что не надо горячиться насчёт асм.

_________________
Я всё-всё узнAю и стану профессором.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 85 ]  1, , , ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y