Как отладить тайм-аут сторожевого пса
У меня есть сторожевой пес в моем микроконтроллере, который, если его не пнуть, перезагрузит процессор. Мои приложения работают нормально некоторое время, но в конечном итоге сбрасываются, потому что сторожевой пес не получил пинка. Если я пройду через программу, она будет работать нормально.
Каковы некоторые способы отладки этого?
изменить: Вывод: Мой жучок я нашел в хлебных крошках сторожевого пса.
Я использую рис, который имеет высокий и низкий вектор ISR. Высокий вектор должен был отрегулируйте матрицу Сид и низкий вектор должен был отрегулировать отметчик времени. Но я поместил оба обработчика ISR в высокий вектор. Поэтому, когда я отключил светодиодную матрицу ISR и таймер tick ISR, необходимый сервис, процессор застрял бы в низком ISR для обработки таймера, но обработчика таймера не было.
хлебные крошки ограничили мой поиск функцией, которая обрабатывала светодиодную матрицу и, в частности, отключила прерывание светодиодной матрицы.
7 ответов
добавьте неинициализированную глобальную переменную, которая имеет разные значения по всему коду. В частности, установите его до и после основных вызовов функций.
поставьте точку останова в начале main.
когда процессор сбрасывает глобальная переменная будет иметь последнее значение. Продолжайте добавлять эти "хлебные крошки", чтобы сузить до проблемной функции.
многие программные сторожевые псы автоматически отключаются при подключении отладчика (чтобы предотвратить его перезапуск, пока отладчик остановил приложение).
Что сказал, Вот некоторые основы:
Это многопоточные приложения? Вы используете планировщик RT? Если да, то ваша задача сторожевого пса голодает?
убедитесь, что ваша задача сторожевого пса не может застрять ни на чем (ожидающий семафор, ожидание сообщения и т. д.). Иногда функции могут блокировать например, у меня есть платформа Linux, над которой я работаю прямо сейчас, где я могу легко заблокировать printf.
Если он однопоточный, профилировщик может помочь вам определить проблемы с синхронизацией.
Если это новая система, убедитесь, что сторожевой работает правильно; проверьте простой код, который просто попадает в WD, а затем спит в бесконечном цикле.
Я использую государственное программирование, и трюк, который я всегда хотел использовать, - зарезервировать один выходной порт для текущего состояния в двоичном формате. Затем подключите логический анализатор и посмотрите тайминги изменений состояния. Вы можете сделать что-то подобное здесь: сделайте то, что сказал Роберт, и создайте глобальную переменную и измените ее значение в ключевых точках-предпочтительно с помощью функции, которая немедленно устанавливает значение порта в текущее состояние(т. е. changeState (nextState);) измените состояние при вводе функция, которая пинает собаку, а затем изменить его обратно в предыдущее состояние перед выходом из функции. Вы должны иметь возможность видеть, из каких функций он не пинается, а затем вы можете работать над ними.
удачи, это звучит как проблема времени, и их трудно решить.
обычно задача/поток сторожевого пса выполняется с низким приоритетом. Поэтому, если сторожевого пса не пинают, это должно быть потому, что процессор занят чем - то другим-вероятно, чем-то, что он не должен делать.
было бы очень полезно выгрузить контекст выполнения(локальный стек, состояние планирования и т. д.) для каждой задачи / потока непосредственно перед сбросом процессора. С немного удачи и работы, вы сможете определить, что мешает сторожевой задачи от пинаю таймер.
Я бы использовал дополнительный выходной pin-код, установил высокий, затем низкий в соответствующих точках кода, чтобы ограничить область поиска. Затем я отслеживал его на цифровом прицеле или логическом анализаторе. Это эквивалентно методу хлебных крошек, упомянутому другим плакатом,но вы сможете намного лучше коррелировать с импульсом сброса.
подвергайте сомнению каждое предположение, которое вы делаете, дважды:
- убедитесь, что Барбос is kicked (я не знаю средств регистрации на процессоре).
- убедитесь, что сторожевой пес, когда его пнули, не сбрасывает процессор.
и интересно, какие различия существуют между "прохождением" и запуском в одиночку; временные ограничения, безусловно, будут иметь значение.
вы можете вставить цикл while в свой код и переключить светодиод внутри цикла while. Это эффективный способ проверить, сбрасывается ли плата.