Большинство микроконтроллеров Freescale работают следующим образом:
- ОЗУ сохраняется после сброса сторожевого таймера.Но, вероятно, не после сброса LVD и, конечно, не после сброса при включении питания.В большинстве случаев это полностью недокументировано.
- У MCU либо будет регистр состояния, в котором вы можете проверить причину сброса (например, HCS08, MPC5x, Kinetis), либо у него будут специальные векторы сброса для различных причин сброса.(например, HC11, HCS12, Coldfire).
Невозможно сохранить что-либо после сброса.Сброс происходит, и только после этого вы можете узнать, что послужило причиной сброса.
Однако можно зарезервировать часть оперативной памяти как специальный сегмент.После сброса при включении питания вы можете инициализировать этот сегмент, установив все в ноль.Если вы получите сброс сторожевого таймера, вы можете предположить, что этот сегмент ОЗУ все еще действителен и не поврежден.Таким образом, вы не инициализируете это, но оставляете это как есть.Этот метод позволяет сохранять значения переменных при сбросе. Вероятно, - это плохо документировано для большинства семейств MCU.Я использовал этот трюк по крайней мере на HCS08, HCS12 и MPC56.
Что касается счетчика программ, вам не повезло.Это сбрасывается без средств, чтобы восстановить его.Это означает, что единственный способ выяснить, где произошел сброс сторожевого таймера, - это утомительный способ старой школы постепенно перемещать точку останова в коде, запустить программу и проверить, достигла ли она точки останова.
Хотя в этом случаесовременных MCU, таких как MPC56 или Cortex M, вы просто проверяете буфер трассировки и видите, какой код вызвал сброс.Вы не только получаете ПК, но и видите исходный код языка Си.Но для этого вам может понадобиться профессиональная цепочка инструментов без Eclipse.