Обсуждаем контроллеры компании Atmel.
Ответить

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

Ср окт 06, 2021 11:43:22

а модификатор volatile до сих пор не въеду как он работает, поэтому и не применяю
зато static везде и всюду

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

Ср окт 06, 2021 11:54:13

Как я понял, volatile запрещает оптимизацию переменной компилятором. Если переменная способна меняться из вне, ее надо помечать volatile. А вот как конкретно это работает, не знаю. Вот, например, переменная "А" меняется из вне. Значит помечаем ее как volatile. А если эта переменная периодически копируется в переменную "B", то переменную "B" тоже нужно помечать как volatile?

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

Ср окт 06, 2021 11:56:37

от глобальных переменных рекомендовано избавляться при первом же удобном случае
локальные рулят

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

Ср окт 06, 2021 12:03:56

slav0n, работаешь без volatile методом инкапсуляции? В функциях переменные не модифицируются компилятором?

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

Ср окт 06, 2021 12:05:14

Kalisnik писал(а):методом инкапсуляции?
объясни, бо я самоучка

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

Ср окт 06, 2021 13:09:21

волатиль работает так:
переменная хранится в ОЗУ, АЛУ с данными из ОЗУ действий производить не может, поэтому копирует значение переменной в тегистр и уже с ним работает.
если переменная не волатиль, то компилятор может держать значение в регистре столько, сколько считает нужным, т.е. в ОЗУ мало того может оказаться старое значение (если к нему обратится прерывание) да ещё и запись туда извне безполезна - первое, что сделает программа, работающая с переменной - вернёт в ОЗУ значение из регистра...

модификатор волатиль запрещает программе кэшировать переменную в регистре. (она водвращается на место после каждой с ней операции, а тегистр освобождается (не стирается, а лишь считается свободным - при следующем обращении к переменной она опять прочтётся из ОЗУ)).

так, конечно тоже существует риск потери данных, но он значительно меньше, чем с неволатильными переменными.

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

Ср окт 06, 2021 14:02:50

вообще, изменение одной переменной в двух разных местах - в прерывании м основном коде - чистый идиотизм.

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

А можно поподробнее?

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

Ср окт 06, 2021 14:56:16

асмовие закидоны никак не уходят
а нельзя ли от них избавиться, ну, например, стилем программирования, или еще как

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

Ср окт 06, 2021 15:19:59

объясни, бо я самоучка

Я тоже. https://ru.wikipedia.org/wiki/Инкапсуля ... ммирование)

Хотя, использование классов в программировании МК, наверно, не лучшая идея?

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

Ср окт 06, 2021 15:25:26

COKPOWEHEU писал(а):А как иначе работать с флагами событий? Прерывание выставляет биты, основной код снимает.
это совсем другая песня.
флаги - это не переменные. флаги для того и нужны, чтобы в одном мете поставить, а в другом проверить и если поставлен, выполнить действия и сбросить флаг.
COKPOWEHEU писал(а):А можно поподробнее?
на нелогичные действия я не в состоянии придумать нелогичный пример.
видимо, это так:
в основном коде решили, что переменная должна быть равна 3. тут же наступило прерывание и в прерывании было решено сделать переменную равной 5. а основной код продолжает думать, что она равна 3.

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

Ср окт 06, 2021 16:08:42

видимо, это так:
в основном коде решили, что переменная должна быть равна 3. тут же наступило прерывание и в прерывании было решено сделать переменную равной 5. а основной код продолжает думать, что она равна 3.

Именно так работают неправильно написанные кольцевые буферы. При чтении очередного элемента в регистр считывается их количество, допустим 3, затем вызывается прерывание в котором добавляется новый элемент для чего снова читается размер, инкрементится и сохраняется 4, но после возврата из прерывания в регистре по-прежнему 3, а после декремента уже 2, хотя в буфере находится 3 элемента.

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

Ср окт 06, 2021 19:50:29

дело не в кольцевом буфере, а в том, что так делать НЕЛЬЗЯ.

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

Ср окт 06, 2021 20:33:55

флаги - это не переменные.

А что же тогда? Новый тип данных: переменные, константы и флаги?
----------
"Глядя на мир, нельзя не удивляться" ©

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

Ср окт 06, 2021 20:38:47

Вот я пишу прогу для АВР , и давай думать про БУФЕРЫ ! Я конечно про них всегда думаю , хоть уже и не молодой ))) Но уже много проектов создано . И все они работают . Хотя и есть некоторые непонятки , которые приходиться решать програмно . То есть вводить коррекцию в показания считанных АЦП, при наличае прерывания считающего время . В общем опытным путём ввожу коррекцию ! И она работает.

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

Ср окт 06, 2021 20:50:00

Jack_A, может, для тебя флаги являются переменными, но для меня флаги - это флаги. то есть, или "да" или "нет".
скажу больше, для меня в МК вообще не существует переменных - я пишу на ассемблере и у меня есть только регистры и ячейки памяти ОЗУ.

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

Ср окт 06, 2021 21:17:38

Я тоже пишу (писал, точнее :( ) на асме, хотя Си знаю достаточно хорошо и даже теперь на другом форуме решаю иногда ленивым студеням их немудрёные задачки. Но для меня Си - на ПК.
И для меня понятия "флаг, переменная" тоже чисто мнемонические в асме. Вот здесь, к примеру, у меня 2 байта измеренного значения с АЦП (это вроде short int), вот здесь 4 байта вычисленного значения для дальнейшей работы(оно, наверное, float) , а вот в этом байтике (сhar) я ставлю бит 0 в 1 при выполнении условия alfa, а бит 1 - при выполнении условия beta (это мой пользовательский регистр флагов, не путаем с процессорным, где N,Z,V,C и пр.) Называй как хошь - флаги, семафоры, хрен_те_что -- лишь бы оно правильно работало.
Только, извиняюсь, мой регистр флагов - всё-таки переменная в её изначальном смысле слова. Можем называть его "ячейка", как в дремучие годы на Минск-2. Абсолютно никто не может мне запретить использовать его и на языке высокого уровня.
"Это же элементарно, Холмс" :shock:

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

Ср окт 06, 2021 21:34:53

а никто и не собирается тебе запрещать использовать понятие "переменная".
ты высказал свое мнение, а я - свое. и на этом остановимся.
на компе (ПК) я программирую на С++, и там я вполне естественно использую понятие "переменная".

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

Ср окт 06, 2021 22:31:15

"Флаг" может быть и отдельным битом в байте/слове и отдельной переменной любого формата, отвечающей требованиям ложь/истина.
Это уже зависит от конкретных замыслов программиста.
В "чистом ассемблере" чаще используется бит в регистре, а в Си - любая переменная (элемент структуры с битовыми полями таки по сложнее).
8)
Только для топикстартера похоже смысл так и остался непонятным...
У него своя задача, в которой вероятнее всего допущена ошибка от которой в силу обстоятельств очень не хочется отказываться.
8)

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

Ср окт 06, 2021 23:04:24

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

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

Чт окт 07, 2021 06:29:00

Да легко! запрещаешь все прерывания если случится событие, вызывающее прерывание - взведётся его аппаратный флаг и прерывание выполнится тут-же, как олько будет разрешено(ы). если конечно отключать надолго - могут случиться проблемы: пришло событие - взвело флаг, прерывания отключены, пришло опять событие.... и потерялось - флаг то уже взведён...
т.ч. просто не отключай прерывания надолго и всё
Ответить