Прочитал статью, что если переменная модифицируется как в основном цикле кода, так и в прерывании, то в основном цикле, при записи в такую переменную, необходимо запретить прерывания. Причем это касается даже 8-ми битных переменных. Иначе возможна потеря данных при модификации переменной в прерывании. И проблема эта может долго не всплывать, так что даже устройства уходят в серийное производство и только потом, уже у клиента, проблема проявляется. Вопрос к Ассамблерщикам, это действительно так?
Это вопрос к автору программы. Ибо если задуман садомазохизьм - то тут уж....
Если данные принимаются подпрограммой прерывания (или какой-то дополнителоьной к основной программе) - то на такой случай есть буфер приема и флаг-семафор: "данные готовы/данные считаны(обработаны)".
Всё завсит от того, как модифицируется переменная. В любом случае, ядро AVR завершит текущую ассемблерную команду и только потом уйдёт по адресу прерывания.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Читал здесь: http://easyelectronics.ru/avr-uchebnyj- ... racii.html Как я понял на ассемблере процедура записи выглядит так: сначала значение переменной читается -> модифицируется -> а потом записывается новое значение. И если прерывание случится после чтения значения (на 1 шагу процедуры), то после выхода из прерывания ядро вернется к прерванной операции (модификация -> запись)... т.е. начнет работу с прочитанным ранее значением переменной... а переменная уже была изменена в прерывании. Получается что информация записанная в прерывании будет потеряна. Я так понял.
Добавлено after 5 minutes 9 seconds: Речь идет про язык программирования Си - забыл упомянуть.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
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); ... }
Прочитал статью, что если переменная модифицируется как в основном цикле кода, так и в прерывании, то в основном цикле, при записи в такую переменную, необходимо запретить прерывания.
ИМХО не нужно ничего в таком случае запрещать… лучше при возникновении прерывания значение этой переменной сохранить в стек, а перед выходом из прерывания вернуть значение из стека в переменную. Тем самым ничего не пропадёт.
Как не пропадёт? А куда денется значение переменной, присвоенное ей в прерывании? Быть может, это прерывание и задумывалось ради этого. К примеру, значение АЦП.
Как не пропадёт? А куда денется значение переменной, присвоенное ей в прерывании? Быть может, это прерывание и задумывалось ради этого.
Имелось ввиду… при использовании переменной в прерывании для расчётов, а не сохранения значений полученных в прерывании.
Хранить разные значения (для двух источников) в одной переменно это вообще как? Вот использовать переменную кратковременно, на каком либо участке алгоритма без потере её первоначального значения это возможно, а вот хранить разные значения в одной переменной не получится (если это не массив какой-то).
Как я понял на ассемблере процедура записи выглядит так: сначала значение переменной читается -> модифицируется -> а потом записывается новое значение.
Вы хотите использовать переменную как флаговую? Других причин писать туда и из основного цикла, и из прерываний я не вижу. В таком случае да, проще запрета прерываний вряд ли что найдется.
Цитата:
Имелось ввиду… при использовании переменной в прерывании для расчётов, а не сохранения значений полученных в прерывании.
А для какой извращенной цели это может пригодиться? Потому что если в функции (в т.ч. прерывании) нужно завести временную переменную, то ее делают локальной и хранят на стеке, а не портят глобальные.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения