-
- Раз у вас M3, то напрашивается вопрос: счетчик DWT->CYCCNT чем
не устраивает? - LightElf(Вчера, 08:41)
- Вах! Спасибо! - IBAH(Вчера, 11:15)
- Хиляет, хиляет, просто нужно по очереди читать, старший/младший.
Между двумя одинаковыми старшими как-раз корректный младший. - =AlexD=(16.09.2025 16:40)
- я это и делаю, но это как-то неспортивно - IBAH(16.09.2025 17:37)
- А в чём сложность? С чем столкнулся?... POV(161 знак., 16.09.2025 16:28, картинка, картинка)
- неасилил... слишком много букв. В чем идея? - IBAH(16.09.2025 17:38)
- флаг обновления данных TimHigt (семафор). В прерывании
устанавливаете. Перед чтением данных сбрасываете, если после чтения
флаг установлен, еще раз сбрасываете и еще раз читаете данные, если
и после этого флаг установлен, генерируете исключение. - Anvar(16.09.2025 16:11)
- я в принципе это и делаю TimH0=TimHigt; TimL=TIM2->CNT;
TimH1=TimHigt; if(TimH0==TimH1) {return TimH0|TimL; } - IBAH(16.09.2025 17:41)
- У вас обычное ошибочное предположение нереалтаймщика, что после "unsigned long TimH1=TimHigt;" TimHigt не увеличивается еще на 1. - Anvar(16.09.2025 19:34)
- Только надо do{....}while(TimH0!=TimH1);return TimH0|TimL; - AlexBi(16.09.2025 18:43)
- я в принципе это и делаю TimH0=TimHigt; TimL=TIM2->CNT;
TimH1=TimHigt; if(TimH0==TimH1) {return TimH0|TimL; } - IBAH(16.09.2025 17:41)
- Это как? Какие могут быть потоки на одноядерном МК? Или имеется в
виду, чтобы не было проблем, если в промежуточных вычислениях будет
вызвано прерывание? Это да: может быть считан "старый" старший
разряд и "новый" младший, что даст неплохую ошибку. Предлагаю
просто запрещать прерывания в начале функции, делать просто
`uint32_t result = TimHigh | Tim2->CNT;`, а потом разрешать
прерывания и возвращать result. Eddy_Em(15 знак., 16.09.2025 15:59)
- 1)Прерывание это тоже поток. 2)Не безопасно. Запрет прерываний не
останавливает таймер. Если таймер переполнится, те же яйца - IBAH(16.09.2025 16:07)
- 1) Ну, условно говоря - да, прерывание переключает контест,
получается как бы поток. Но чтобы это был настоящий поток, нужна
таки операционная система... 2) Ничего подобного! Таймер не нужно
останавливать! Флаг прерывания не уйдет в /dev/null, если пока ты
будешь считывать показания, оно произойдет: как только ты разрешишь
прерывания, МК уйдет в обработчик прерывания от таймера и не
пропустит инкремент. Eddy_Em(226 знак., 16.09.2025 16:11)
- Еще раз. Задача сводится к синхронизации трех потоков. Блокировка
прерывания синхронизирует только два. При каскадировании таймеров,
получаем те же три потока. - IBAH(16.09.2025 17:45)
- Каких еще трех? Тут только два условных конкурирующих "потока":
суперлуп и прерывание. И чтобы не было конкуренции, достаточно
запретить на время прерывания. Третьего никакого здесь нет. Eddy_Em(156 знак., 16.09.2025 17:55)
- Запрет прерываний не поможет, т.к. таймер считает аппаратно и можно прочитать старшее слово до переполнения таймера, а младшее слово после переполнения. - AlexBi(16.09.2025 18:45)
- а TIM2->CNT кто меняет? со стороны других потоков, это тоже
поток - IBAH(16.09.2025 18:41)
- Shit! Я - болван. Признаюсь. - Eddy_Em(16.09.2025 19:27)
- Каких еще трех? Тут только два условных конкурирующих "потока":
суперлуп и прерывание. И чтобы не было конкуренции, достаточно
запретить на время прерывания. Третьего никакого здесь нет. Eddy_Em(156 знак., 16.09.2025 17:55)
- Еще раз. Задача сводится к синхронизации трех потоков. Блокировка
прерывания синхронизирует только два. При каскадировании таймеров,
получаем те же три потока. - IBAH(16.09.2025 17:45)
- 1) Ну, условно говоря - да, прерывание переключает контест,
получается как бы поток. Но чтобы это был настоящий поток, нужна
таки операционная система... 2) Ничего подобного! Таймер не нужно
останавливать! Флаг прерывания не уйдет в /dev/null, если пока ты
будешь считывать показания, оно произойдет: как только ты разрешишь
прерывания, МК уйдет в обработчик прерывания от таймера и не
пропустит инкремент. Eddy_Em(226 знак., 16.09.2025 16:11)
- 1)Прерывание это тоже поток. 2)Не безопасно. Запрет прерываний не
останавливает таймер. Если таймер переполнится, те же яйца - IBAH(16.09.2025 16:07)
- Не нужен такой 32-разрядный таймер. Это по-другому делается. - SciFi(16.09.2025 15:55)
- Хорош интриговать. Как? - IBAH(16.09.2025 16:03)
- А что делать собираемся? Как будет использоваться этот 32-разрядный
счётчик? Но один из рабочих рецептов такой: SciFi(361 знак., 16.09.2025 16:08)
- Спасибо. Тоже неплохой вариант. - IBAH(16.09.2025 17:46)
- А что делать собираемся? Как будет использоваться этот 32-разрядный
счётчик? Но один из рабочих рецептов такой: SciFi(361 знак., 16.09.2025 16:08)
- Хорош интриговать. Как? - IBAH(16.09.2025 16:03)
- Раз у вас M3, то напрашивается вопрос: счетчик DWT->CYCCNT чем
не устраивает? - LightElf(Вчера, 08:41)