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

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

Сообщение slav0n »

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

Сообщение Kalisnik »

Как я понял, volatile запрещает оптимизацию переменной компилятором. Если переменная способна меняться из вне, ее надо помечать volatile. А вот как конкретно это работает, не знаю. Вот, например, переменная "А" меняется из вне. Значит помечаем ее как volatile. А если эта переменная периодически копируется в переменную "B", то переменную "B" тоже нужно помечать как volatile?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

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

Сообщение Kalisnik »

slav0n, работаешь без volatile методом инкапсуляции? В функциях переменные не модифицируются компилятором?
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

Kalisnik писал(а):методом инкапсуляции?
объясни, бо я самоучка
ohmycode!
primuss3.com
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

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

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

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

Сообщение COKPOWEHEU »

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

Сообщение slav0n »

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

Сообщение Kalisnik »

[uquote="slav0n",url="/forum/viewtopic.php?p=4101647#p4101647"]объясни, бо я самоучка[/uquote]
Я тоже. https://ru.wikipedia.org/wiki/Инкапсуля ... мирование)

Хотя, использование классов в программировании МК, наверно, не лучшая идея?
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

COKPOWEHEU писал(а):А как иначе работать с флагами событий? Прерывание выставляет биты, основной код снимает.
это совсем другая песня.
флаги - это не переменные. флаги для того и нужны, чтобы в одном мете поставить, а в другом проверить и если поставлен, выполнить действия и сбросить флаг.
COKPOWEHEU писал(а):А можно поподробнее?
на нелогичные действия я не в состоянии придумать нелогичный пример.
видимо, это так:
в основном коде решили, что переменная должна быть равна 3. тут же наступило прерывание и в прерывании было решено сделать переменную равной 5. а основной код продолжает думать, что она равна 3.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Starichok51",url="/forum/viewtopic.php?p=4101766#p4101766"]видимо, это так:
в основном коде решили, что переменная должна быть равна 3. тут же наступило прерывание и в прерывании было решено сделать переменную равной 5. а основной код продолжает думать, что она равна 3.[/uquote]
Именно так работают неправильно написанные кольцевые буферы. При чтении очередного элемента в регистр считывается их количество, допустим 3, затем вызывается прерывание в котором добавляется новый элемент для чего снова читается размер, инкрементится и сохраняется 4, но после возврата из прерывания в регистре по-прежнему 3, а после декремента уже 2, хотя в буфере находится 3 элемента.
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

дело не в кольцевом буфере, а в том, что так делать НЕЛЬЗЯ.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Друг Кота
Аватара пользователя
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

[uquote="Starichok51",url="/forum/viewtopic.php?p=4101766#p4101766"]флаги - это не переменные.[/uquote]
А что же тогда? Новый тип данных: переменные, константы и флаги?
----------------------------------
"Глядя на мир, нельзя не удивляться" ©
Изображение
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Сообщение Alex_641 »

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

Сообщение Starichok51 »

Jack_A, может, для тебя флаги являются переменными, но для меня флаги - это флаги. то есть, или "да" или "нет".
скажу больше, для меня в МК вообще не существует переменных - я пишу на ассемблере и у меня есть только регистры и ячейки памяти ОЗУ.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Друг Кота
Аватара пользователя
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

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

Сообщение Starichok51 »

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

Сообщение BOB51 »

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

Сообщение Alex_641 »

Три кнопки с подтяжкой на 0 или + ! И есть часы с мигалкой двоеточием. Прерывание по таймеру , установка флага смены секунды , в прервыании идёт счёт нажатия на кнопки ( три счётчика трёх кнопок) и три флага отпускания кнопок ( что бы знать длинну нажатия оных, от дребезга, или в общем цикле знать что делать по длинне нажатия), и флаг мигания двоеточием. В основном цикле тестим флаг смены секунды, инвертируем двоеточие, тестим флаг отпуска каждой трёх кнопок, выполняем соответствующие процедуры, обнуляем соответствующие флаги . А как запрещать прерывание ? Вы скажите пожалуйста ? Ведь идёт подсчёт времени !
Не спрашивай по ком звонит колокол, он звонит по тебе !
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

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

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