微控制器硬件复位前如何保存数据?

时间:2019-02-06 08:09:32

标签: c embedded microcontroller nxp-microcontroller

我正在研究Freesacle微控制器之一。该微控制器具有多个复位源(例如时钟监视器复位,看门狗复位和...)。 假设由于看门狗,我的微控制器被重置了。重置之前如何保存一些数据。我的意思是,例如,我如何才能了解看门狗复位之前程序计数器在哪里。通过这种方法,我想知道哪里有导致看门狗重置的错误(换句话说,就是很长的过程)。

6 个答案:

答案 0 :(得分:2)

大多数飞思卡尔MCU的工作方式如下:

    看门狗复位后,
  • RAM被保留。但是可能不是在LVD复位之后,而且肯定不是在上电复位之后。在大多数情况下,这是完全没有记录的。
  • MCU将具有状态寄存器,您可以在其中检查复位原因(例如HCS08,MPC5x,Kinetis),或者具有用于不同复位原因的特殊复位向量(例如HC11,HCS12,Coldfire)。 / li>

重置后无法保存任何内容。重置会发生,只有在此之后,您才能找出导致重置的原因。

但是可以保留一部分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)

两件事:

  1. 写一个日志!并旋转该日志以保留最后30分钟。或您认为需要重现该错误的任何合理时间。在日志停止的地方,您可以看到之前发生的情况。即使在生产级设备中,也存在某些级别的日志记录。
  2. (较少,实用),您可以将调试器附加到几乎每个micrcontroller上,并逐步执行代码。可能会在您输入代码的关键部分之前放置一个被击中的断点。某些IDE / uC允许“ 数据断点”在某些变量包含某些值时触发。 免责声明:我不熟悉您使用的确切微控制器。

答案 3 :(得分:0)

它写在您的手册中。

我不知道特定的处理器,但是在大多数微处理器中,看门狗复位是一种软复位,这意味着某些寄存器将保留有关复位源的信息,有时还会保留原因。

您需要在FreescaleμC上发布更多具体信息,以便正确回答。

答案 4 :(得分:0)

即使您可以在重置之前获得程序计数器,也不建议在重置后盲目地将程序计数器设置为另一个计数器-因为可能会有堆栈和堆信息以及数据本身也改变了。

这取决于您要在重置后保留什么,某些行为或数据?看门狗之后,可能会清除或未清除易失性内存(请参见uC数据表),并且您可以在检查复位寄存器后再次检测到复位(再次请参见uC数据表)。通过检测复位并检查易失性存储器,您可能能够以不太可能的复位事件发生后希望的方式,准备好重启uC。您可以创建一个全局值并将其设置为全局范围内的特定值,然后如果它重置,请在发生重置事件时对照该值进行检查-如果相同,则可以假定其他内存也可以相同。如果不是易失性存储器,那么您需要查看数据表中的非易失性选项,但是,由于写入限制,建议不要连续写入非易失性存储器。

答案 5 :(得分:0)

唯一可靠的解决方案是,如果您的芯片支持嵌入式指令跟踪,则使用具有跟踪功能的调试器。

某些设备可以选择将看门狗超时重定向到中断而不是复位。这样,您就可以像编写异常处理程序一样编写看门狗超时处理程序,并转储或存储包括返回地址的堆栈信息,该地址将指示中断发生的位置。

但是,在某些情况下,这两种解决方案都不是实现目标的可靠方法。在多任务环境或具有中断处理程序的系统中,看门狗超时发生时运行的代码可能不是导致问题的过程。