| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Правильная обработка переменных в контексте прерываний https://radiokot.ru/forum/viewtopic.php?f=57&t=178983 |
Страница 1 из 5 |
| Автор: | Kalisnik [ Вт окт 05, 2021 13:10:29 ] |
| Заголовок сообщения: | Правильная обработка переменных в контексте прерываний |
Прочитал статью, что если переменная модифицируется как в основном цикле кода, так и в прерывании, то в основном цикле, при записи в такую переменную, необходимо запретить прерывания. Причем это касается даже 8-ми битных переменных. Иначе возможна потеря данных при модификации переменной в прерывании. И проблема эта может долго не всплывать, так что даже устройства уходят в серийное производство и только потом, уже у клиента, проблема проявляется. Вопрос к Ассамблерщикам, это действительно так? |
|
| Автор: | BOB51 [ Вт окт 05, 2021 13:30:39 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Это вопрос к автору программы. Ибо если задуман садомазохизьм - то тут уж.... Если данные принимаются подпрограммой прерывания (или какой-то дополнителоьной к основной программе) - то на такой случай есть буфер приема и флаг-семафор: "данные готовы/данные считаны(обработаны)". |
|
| Автор: | Kalisnik [ Вт окт 05, 2021 13:40:58 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
BOB51 писал(а): есть буфер приема и флаг-семафор: "данные готовы/данные считаны(обработаны)". Хорошая идея! |
|
| Автор: | parovoZZ [ Вт окт 05, 2021 14:49:13 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Всё завсит от того, как модифицируется переменная. В любом случае, ядро AVR завершит текущую ассемблерную команду и только потом уйдёт по адресу прерывания. |
|
| Автор: | Kalisnik [ Вт окт 05, 2021 15:15:06 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Читал здесь: http://easyelectronics.ru/avr-uchebnyj- ... racii.html Как я понял на ассемблере процедура записи выглядит так: сначала значение переменной читается -> модифицируется -> а потом записывается новое значение. И если прерывание случится после чтения значения (на 1 шагу процедуры), то после выхода из прерывания ядро вернется к прерванной операции (модификация -> запись)... т.е. начнет работу с прочитанным ранее значением переменной... а переменная уже была изменена в прерывании. Получается что информация записанная в прерывании будет потеряна. Я так понял. Добавлено after 5 minutes 9 seconds: Речь идет про язык программирования Си - забыл упомянуть. |
|
| Автор: | BOB51 [ Вт окт 05, 2021 15:36:09 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
На такие вопросы ответ даст только распечатка листинга конкретной программы. |
|
| Автор: | Kalisnik [ Вт окт 05, 2021 15:50:27 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Это пример из статьи: СпойлерКод: 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); ... } |
|
| Автор: | Самсусамыч [ Вт окт 05, 2021 16:42:00 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Прочитал статью, что если переменная модифицируется как в основном цикле кода, так и в прерывании, то в основном цикле, при записи в такую переменную, необходимо запретить прерывания. ИМХО не нужно ничего в таком случае запрещать… лучше при возникновении прерывания значение этой переменной сохранить в стек, а перед выходом из прерывания вернуть значение из стека в переменную. Тем самым ничего не пропадёт. |
|
| Автор: | parovoZZ [ Вт окт 05, 2021 16:56:12 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Если программа пытается модифицировать одну и ту же переменную из прерывания и из основного цикла, то алгоритм программы не корректный. Добавлено after 1 minute 16 seconds: Тем самым ничего не пропадёт. Как не пропадёт? А куда денется значение переменной, присвоенное ей в прерывании? Быть может, это прерывание и задумывалось ради этого. К примеру, значение АЦП. |
|
| Автор: | Самсусамыч [ Вт окт 05, 2021 17:07:55 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Как не пропадёт? А куда денется значение переменной, присвоенное ей в прерывании? Быть может, это прерывание и задумывалось ради этого. Имелось ввиду… при использовании переменной в прерывании для расчётов, а не сохранения значений полученных в прерывании. Хранить разные значения (для двух источников) в одной переменно это вообще как? Вот использовать переменную кратковременно, на каком либо участке алгоритма без потере её первоначального значения это возможно, а вот хранить разные значения в одной переменной не получится (если это не массив какой-то). |
|
| Автор: | COKPOWEHEU [ Вт окт 05, 2021 17:37:16 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Цитата: Как я понял на ассемблере процедура записи выглядит так: сначала значение переменной читается -> модифицируется -> а потом записывается новое значение. Вы хотите использовать переменную как флаговую? Других причин писать туда и из основного цикла, и из прерываний я не вижу. В таком случае да, проще запрета прерываний вряд ли что найдется. Цитата: Имелось ввиду… при использовании переменной в прерывании для расчётов, а не сохранения значений полученных в прерывании. А для какой извращенной цели это может пригодиться? Потому что если в функции (в т.ч. прерывании) нужно завести временную переменную, то ее делают локальной и хранят на стеке, а не портят глобальные. |
|
| Автор: | slav0n [ Вт окт 05, 2021 17:58:14 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Kalisnik, ты сначала отфильтруй АЦП хоч шоб не стрибало |
|
| Автор: | Аlex [ Вт окт 05, 2021 19:26:30 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Вопрос к Ассамблерщикам, это действительно так? Странный вопрос. Учитывая, что вопрошающий понимает всю суть происходящего и даже способен это описать.Холивара ради вопрос ? |
|
| Автор: | slav0n [ Вт окт 05, 2021 20:01:18 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
кому нужен асм? никому. разве что тем, кто иногда заглядывает в .lss и то, только для правки сишного кода |
|
| Автор: | Alex_641 [ Вт окт 05, 2021 20:08:39 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
А какое прерывание имеется ввиду ? А если в прерывании по таймеру считается время чего нить ... то как потом компенсировать запрет в основном цикле ? |
|
| Автор: | slav0n [ Вт окт 05, 2021 20:24:00 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
онэ даже в приведении типов не рубит |
|
| Автор: | dgrett [ Вт окт 05, 2021 20:24:30 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
{кому нужен асм? никому} Да мне нужен. Чтоб не трахаться так с простыми вопросами. И не гадать, что компилятор с кодом сделает. |
|
| Автор: | slav0n [ Вт окт 05, 2021 20:31:22 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
компилятор сделает все как надо результат зависит от твоей писанины |
|
| Автор: | Kalisnik [ Вт окт 05, 2021 21:17:26 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Холивара ради вопрос ? Первое, убедиться что я правильно понял. Второе, рассмотреть вопрос с разных сторон и почерпнуть, по возможности, что-то новое. |
|
| Автор: | dgrett [ Вт окт 05, 2021 21:17:55 ] |
| Заголовок сообщения: | Re: Правильная обработка переменных в контексте прерываний |
Вот именно. А я не совсем не виртуоз писать на си. Потому и нужен мне асм. Так что не надо горячиться насчёт асм. |
|
| Страница 1 из 5 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


