реклама на сайте
подробности

 
 
> WWDT у STM32, windows watchdog timer
123kill12
сообщение Oct 25 2011, 19:05
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 12-05-10
Пользователь №: 57 217



К контроллеру подключены разные микросхемы.
В коде есть пара циклов которые могут зависнуть если эти микросхемы вдруг откажут. вероятность очень маленькая но есть. Простая перезагрузка не выход. так как перезагрузка контроллера может нарушить работу устройств которые с ним связаны ну вообще не желательно. так же хотелось бы чтоб устройство себя могло сдиагностировать.

пришел к выводу что IWDT не выход. у STM есть WWDT, который имеет свое прерывание и накладывание этого таймера на циклы которые могут повиснуть очень удобно.
Вот у меня возник вопрос как им пользоваться. ну как настроить и запустит тут все ясно.
Но вот повис цикл у меня. WWDT досчитал до 0 и вызвал прерывание. Что делать в прерывании чтоб выйти из повисшего цикла.

Думаю можно сделать какой нить глобальный регистр с битами. выставлять соотвествующий бит перед заходом в цикл и сбрасывать после выхода. В прерывании по этим битам определять какой цикл и изменяет значения так чтоб программа вывалилась из цикла.

но может есть проще путь?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
maksimp
сообщение Oct 26 2011, 03:16
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



В прерывании WWDT выставить флаг (глобальной переменной типа unsigned char присвоить значение 1). В цикле его на каждой итерации проверять и как стал 1 то прекращать работу цикла. Перед началом цикла его установить в 0.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 26 2011, 04:38
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Можно и более жёскоsm.gif поступать (что-то на подобии исключений), ручками раскрутить/подправить стек так чтобы возврат из обработчика прерывания был совершён в точку вызова процедуры в которой возможно зависание, ну и конечно нужно чтобы код ошибки эта функция возвратила отличный от OK.
Таким макаром будут не нужны никакие маячащие в коде флаги лишь небольшой пролог-эпилог в виде:
Код
ENTER_EXCEPTION_BLOCK();
...
LEAVE_EXCEPTION_BLOCK();
Всё равно таймер нужно было где-то запускать и останавливать.

Остаётся вопрос как определить границы стекового фрейма функции. Может у кого есть идеи (в прологе фигачить что-то уникальное в стек)?

Я тоже заинтересован в подобного рода механизме. Предлагаю автору публиковать свои результаты, ну а мы по мере свободного времени тоже поучаствуем.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016