Как работает ваша система? Я всегда использую комбинацию программных и аппаратных сторожевых псов. Позвольте мне объяснить ...
В моем примере предполагается, что вы работаете с вытесняющим ядром реального времени, и у вас есть поддержка сторожевого таймера в вашем процессоре / микроконтроллере. Этот сторожевой таймер выполнит сброс, если он не был активирован в течение определенного периода времени. Вы хотите проверить две вещи:
1) Периодический системный таймер («часы RTOS») работает (если нет, такие функции, как «сон», больше не будут работать, и ваша система не будет работать).
2) Все потоки могут работать в течение разумного периода времени.
Моя RTOS (www.lieron.be/micror2k) предоставляет возможность запуска кода в обработчике прерывания часов RTOS. Это единственное место, где вы обновляете аппаратный сторожевой таймер, поэтому вы уверены, что часы работают постоянно (если сторожевой таймер не перезагрузит вашу систему).
В свободном потоке (всегда работающем с самым низким приоритетом) обновляется «сторожевой таймер программного обеспечения». Это просто установка переменной на определенное значение (например, 1000). В прерывании часов RTOS (где вы запускаете аппаратный сторожевой таймер) вы уменьшаете и проверяете это значение. Если он достигает 0, это означает, что свободный поток не работает в течение 1000 тактов, и вы перезагружаете систему (это можно сделать бесконечным циклом внутри обработчика прерываний, чтобы перезагрузить аппаратный сторожевой таймер).
Теперь к вашему первоначальному вопросу. Я предполагаю, что системные часы продолжают работать, так что это программный сторож, который сбрасывает систему. В обработчике прерывания часов RTOS вы можете выполнить некоторый «сбор статистики» в случае возникновения программной сторожевой таймера. Вместо сброса системы вы можете видеть, какой поток запущен на каждом такте (после возникновения проблемы), и попытаться выяснить, что происходит. Это не идеально, но это поможет.
Другой вариант - добавить несколько программных сторожевых таймеров с разными приоритетами. Установите для незанятого потока значение VariableA равным 1000, а для (выделенного) потока среднего приоритета - переменную B. В обработчике прерывания часов RTOS вы проверяете обе переменные. С помощью этой информации вы узнаете, имеет ли зацикливающийся поток приоритет выше, чем «средний» или ниже, чем «средний». Если вы хотите, вы можете добавить 3-го или 4-го или сколько сторожевых программ программного обеспечения вам нравится. В худшем случае добавьте программный сторожевой таймер для каждого используемого приоритета (хотя это будет стоить вам столько же дополнительных потоков).