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