-
- По ссылке вроде бы вполне дельно про volatile. Ну и бывает ещё атомарность, конечно. Кстати, обычно отключение оптимизации среди прочего делает так, что вообще все переменные ведут себя как volatile, так что у тебя есть простой способ быстро узнать, имеет ли volatile отношение к твоим проблемам. - SciFi(08.08.2021 23:28, ссылка)
- например, в фоне можно критическую секцию организовать. ну а в ней данные читать/модифицировать Vit(281 знак., 08.08.2021 22:39)
- Изобретать велосипед — неблагодарное занятие, мне лень. Просто
подумай немного на тему "а что если прерывание произойдёт в самый
неудобный момент, когда главный поток читает или пишет в
переменную, используемую в обработчике"? Там может получиться много
интересного. Если найду ссылочку на годный ликбез, поделюсь,
конечно. - SciFi(08.08.2021 22:37)
- Не-не, там другое. Телодвижения с расчетами в прерывании, например,
АЦП, портят переменные завязанные на разбор протокола входящего по
УАРТ. В итоге связь через пень-колоду, больше ни на чем не
сказывается. - _P0V(09.08.2021 09:20, )
- Кусками уменьшай проект Tyмблep(392 знак., 09.08.2021 14:22)
- У вас расчеты в прерывании случайно плавучку и/или вычисления
квадратного корня не используют? - rezident(09.08.2021 09:29)
- Не припомню, чтобы в стм32 это было чем-то чревато. Чем напугать
хочешь? Колись! - SciFi(09.08.2021 09:38)
- Так может у него АЦП с частотой 1 МГц сэмплирует. Я еще раз
напоминаю, что я не программист, но помнится для MSP430F149
включение всего одной функции деления float увеличивало процедуру
на ~800 тактов. При тактовой частоте 8МГц это было весьма
драматическим эффектом для расчетов в прерывании. - rezident(09.08.2021 09:43)
- Хе-хе. Тогда уж сразу sprintf(). Там легко можно отъесть килобайт
стека и миллисекунду времени. И про стек, и про время я ему уже
напомнил >>> - SciFi(09.08.2021 09:45, ссылка)
- Но если стека достаточно и во времени недостатка нет - Tyмблep(110 знак., 09.08.2021 14:06)
- Шож вы такой ревнивый-то? :) Ну считайте, что я конкретизировал общё обрисованную вами проблему. - rezident(09.08.2021 09:49)
- Хе-хе. Тогда уж сразу sprintf(). Там легко можно отъесть килобайт
стека и миллисекунду времени. И про стек, и про время я ему уже
напомнил >>> - SciFi(09.08.2021 09:45, ссылка)
- Так может у него АЦП с частотой 1 МГц сэмплирует. Я еще раз
напоминаю, что я не программист, но помнится для MSP430F149
включение всего одной функции деления float увеличивало процедуру
на ~800 тактов. При тактовой частоте 8МГц это было весьма
драматическим эффектом для расчетов в прерывании. - rezident(09.08.2021 09:43)
- Не припомню, чтобы в стм32 это было чем-то чревато. Чем напугать
хочешь? Колись! - SciFi(09.08.2021 09:38)
- Данунафиг. Ты там где-то глобально накосячил, вот оно и вылазит в
разных местах. Типа переполнение стека, или времени на обработку
прерывания не хватает, или ещё какая-нибудь фигня. - SciFi(09.08.2021 09:25)
- Переполнение стека ловится аппаратно, наверное. Скорее всего там
использование нереентерабельных функций в прерывании и в основной
программе, или другом, вытесняемом, прерывании. Функции могут быть
как самодельные (придется как-то переписать/разделить), так и из
стандартной библиотеки (использовать многопоточную, или какую-то
аналогичную) - AlexBi(09.08.2021 09:40)
- +1. Что-то я не вспомнил про это дело. - SciFi(09.08.2021 09:42)
- Переполнение стека ловится аппаратно, наверное. Скорее всего там
использование нереентерабельных функций в прерывании и в основной
программе, или другом, вытесняемом, прерывании. Функции могут быть
как самодельные (придется как-то переписать/разделить), так и из
стандартной библиотеки (использовать многопоточную, или какую-то
аналогичную) - AlexBi(09.08.2021 09:40)
- Не-не, там другое. Телодвижения с расчетами в прерывании, например,
АЦП, портят переменные завязанные на разбор протокола входящего по
УАРТ. В итоге связь через пень-колоду, больше ни на чем не
сказывается. - _P0V(09.08.2021 09:20, )
- Переменные которые изменяются в прерывании и основной программе
должны быть объявлены как "volatile". - BlackMorda(08.08.2021 22:36)
- слегка доебусь - не обязательно изменяются и там и там, достаточно чтобы использовались и там и там (и в основном теле, и в прерываниях). и всё,
здравствуй глюк - Mahagam(09.08.2021 00:43)
- Только при условии использовании оптимизации. - PlainUser(03.09.2021 07:36)
- угу, без неё они все как volatile. и прошивка раза в три жирнее. - Mahagam(03.09.2021 10:34)
- Только при условии использовании оптимизации. - PlainUser(03.09.2021 07:36)
- слегка доебусь - не обязательно изменяются и там и там, достаточно чтобы использовались и там и там (и в основном теле, и в прерываниях). и всё,
здравствуй глюк - Mahagam(09.08.2021 00:43)