Один общий подход заключается в делегировании сторожевого пиная к конкретной задаче (часто либо с наивысшим приоритетом, или самый низкий приоритет, компромиссах/мотиваций для каждого подхода), а затем все другие задачи «проверить в» с этой задачей.
Таким образом:
если прерывание подвешивают (100% CPU), задача кикер не будет работать, вы сбрасываете
если задача кикер подвешивают, вы сбрасываете
если другая задача подвешивают, кикер задача не видит проверку в, кикер задача не пинать ВДГ, вы сбрасываете
Теперь, конечно, детали реализации должны быть рассмотрены. У некоторых людей каждая задача задает свой собственный выделенный бит (атомарно) в глобальной переменной; задача кикера проверяет эту группу бит-флагов с определенной скоростью и очищает/сбрасывает, когда все проверили (наряду с ударом WDG, конечно). Я избегаю глобалов, таких как чума, и избегаю такого подхода. Флаги событий RTOS обеспечивают несколько схожий механизм, который является более элегантным.
Обычно я проектирую свои встроенные системы как управляемые событиями системы. В этом случае каждая задача блокируется в одном конкретном месте - в очереди сообщений. Все задачи (и ISR) общаются друг с другом, отправляя события/сообщения. Таким образом, вам не нужно беспокоиться о том, что задача не проверяется, потому что она заблокирована на семафоре «туда, где есть» (если это не имеет смысла, извините, не написав много больше, я не могу объяснить это лучше).
Также есть соображение - выполнять задачи в автономном режиме или отвечать или отвечать на запрос задания кикера. Автономный - например, один раз в секунду каждая задача получает событие в своей очереди «сообщите, что задача кикера еще жива».Ответ-запрос - раз в секунду (или что-то еще) задачи кикера говорят всем (через очереди) «время для регистрации» - и в конечном итоге каждая задача запускает свою очередь, получает запрос и отвечает. Учитываются приоритеты задач, теория массового обслуживания и т. Д.
Существует 100 способов скинуть этот кот, но основной принцип одной задачи, которая отвечает за то, чтобы пинать WDG и иметь другие задачи, выполняемые до задачи кикера, довольно стандартная.
Существует, по крайней мере, еще один аспект для рассмотрения - вне сферы действия этого вопроса - и это касается прерываний. Метод, описанный выше, вызовет сброс WDG, если ISR зацикливает CPU (хорошо), но как насчет противоположного сценария - ISR (к сожалению) случайно и непреднамеренно отключен. Во многих сценариях это не будет поймано, и ваша система все равно будет пинать WDG, но часть вашей системы искалечена. Забавный материал, вот почему я люблю встроенное развитие.
Мы принимаем сторожевой таймер, который является частью RTOS или фактическим сторожевым таймером оборудования, который предоставляет службы RTOS? –