我正在研究Freesacle微控制器之一。该微控制器具有多个复位源(例如时钟监视器复位,看门狗复位和...)。 假设由于看门狗,我的微控制器被重置了。重置之前如何保存一些数据。我的意思是,例如,我如何才能了解看门狗复位之前程序计数器在哪里。通过这种方法,我想知道哪里有导致看门狗重置的错误(换句话说,就是很长的过程)。
答案 0 :(得分:2)
大多数飞思卡尔MCU的工作方式如下:
重置后无法保存任何内容。重置会发生,只有在此之后,您才能找出导致重置的原因。
但是可以保留一部分RAM作为特殊段。上电复位后,可以通过将所有内容都设置为零来初始化此段。如果重置了看门狗,则可以假定此RAM段仍然有效且完好无损。因此,您无需初始化它,而是保持原样。此方法使您可以在重置期间保存变量值。 可能-对于大多数MCU系列来说,这没有得到很好的记录。我至少在HCS08,HCS12和MPC56上使用过这种技巧。
至于程序计数器,您很不走运。重置它无法恢复它。这意味着找出看门狗复位发生位置的唯一方法是乏味的老派方法,即逐步降低代码的断点位置,运行程序并检查其是否达到断点。
尽管对于MPC56或Cortex M之类的现代MCU,您只需检查跟踪缓冲区并查看导致复位的代码。您不仅可以获得PC,还可以看到C源代码。但是您可能需要一个专业的,无Eclipse的工具链来完成此操作。
答案 1 :(得分:1)
根据您的微控制器,您可能会收到“重置原因”,但无法在重置后获得先前的program counter (PC/IP)
。
大多数现代微控制器都提供Watchdog Interrupt
而不是reset
。
您可以配置看门狗外设以启用中断,在该ISR中,您可以检查堆栈上存储的上下文。 (您可以从JTAG调试器获取帮助以检查调用堆栈)。
如果您的微控制器支持上述方法,则有多种调试方法可用。
例如
在简单的基于while(1)
的体系结构中,您可以使用硬件计时器,并在某些代码段后重新启动它。在Timer ISR中,您将知道哪个代码段消耗的时间比计时器长。
答案 2 :(得分:1)
两件事:
答案 3 :(得分:0)
它写在您的手册中。
我不知道特定的处理器,但是在大多数微处理器中,看门狗复位是一种软复位,这意味着某些寄存器将保留有关复位源的信息,有时还会保留原因。
您需要在FreescaleμC上发布更多具体信息,以便正确回答。
答案 4 :(得分:0)
即使您可以在重置之前获得程序计数器,也不建议在重置后盲目地将程序计数器设置为另一个计数器-因为可能会有堆栈和堆信息以及数据本身也改变了。
这取决于您要在重置后保留什么,某些行为或数据?看门狗之后,可能会清除或未清除易失性内存(请参见uC数据表),并且您可以在检查复位寄存器后再次检测到复位(再次请参见uC数据表)。通过检测复位并检查易失性存储器,您可能能够以不太可能的复位事件发生后希望的方式,准备好重启uC。您可以创建一个全局值并将其设置为全局范围内的特定值,然后如果它重置,请在发生重置事件时对照该值进行检查-如果相同,则可以假定其他内存也可以相同。如果不是易失性存储器,那么您需要查看数据表中的非易失性选项,但是,由于写入限制,建议不要连续写入非易失性存储器。
答案 5 :(得分:0)
唯一可靠的解决方案是,如果您的芯片支持嵌入式指令跟踪,则使用具有跟踪功能的调试器。
某些设备可以选择将看门狗超时重定向到中断而不是复位。这样,您就可以像编写异常处理程序一样编写看门狗超时处理程序,并转储或存储包括返回地址的堆栈信息,该地址将指示中断发生的位置。
但是,在某些情况下,这两种解决方案都不是实现目标的可靠方法。在多任务环境或具有中断处理程序的系统中,看门狗超时发生时运行的代码可能不是导致问题的过程。