我正在开发一款Freesacle微控制器。该微控制器具有多个复位源(例如时钟监视器复位,看门狗复位和……)。假设因为看门狗,我的微…
如果您的芯片支持嵌入式指令跟踪,唯一可靠的解决方案是使用具有跟踪功能的调试器。
某些设备可以选择将看门狗超时重定向到中断而不是重置。这将允许您像异常处理程序一样编写看门狗超时处理程序,并转储或存储堆栈信息,包括返回地址,该地址将指示中断发生的位置。
但在某些情况下,这两种解决方案都不是实现目标的可靠方法。在具有中断处理程序的多任务环境或系统中,发生监视程序超时时运行的代码可能不是导致问题的过程。
它写在您的手册中。
我不知道具体的处理器,但在大多数微处理器中,看门狗复位是软复位,这意味着某些寄存器将保留有关复位源的信息,有时还有原因。
您需要在飞思卡尔postC上发布更具体的信息才能正确回答。
即使你可以在复位之前得到程序计数器,也不建议在复位后盲目地将程序计数器设置为另一个程序计数器 - 因为可能存在堆栈和堆信息以及数据本身也可能已经改变。
这取决于您在重置后要保留的内容,某些行为或数据?看门狗后,易失性存储器可能已清除或未清除(请参阅您的uC数据表),并且您可以在检查复位寄存器后检测到复位(再次参见您的uC数据表)。通过检测复位并检查易失性存储器,您可能能够在不太可能发生复位事件之后以您希望的方式重新启动uC。您可以创建一个全局值并将其设置为全局范围内的特定值,然后如果它重置,则在发生重置事件时检查它的值 - 如果它是相同的,您可以假设其他内存也可能是相同的。如果易失性存储器不是一个选项,您需要查看非易失性选项的数据表,但是由于写入限制,建议不要连续写入非易失性存储器。
两件事情:
根据您的微控制器,您可能会获得重置原因,但前一步 program counter (PC/IP) 复位后无法进行。
program counter (PC/IP)
大多数现代微控制器都有规定 Watchdog Interrupt 代替 reset 。 您可以配置看门狗外设以启用中断,在该ISR中,您可以检查堆栈上存储的上下文。 (您可以从JTAG调试器获取帮助以检查调用堆栈)。
Watchdog Interrupt
reset
如果您的微控制器支持上述方法,则可以使用多种调试方法。
例如 简单来说 while(1) 基于体系结构,您可以使用HW计时器并在部分代码之后重新启动它。在Timer ISR中,您将知道哪个代码段比定时器消耗的时间长。
while(1)