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

How Can I save some data before hardware reset of microcontroller?

我正在研究一款 Freesacle 微控制器。该微控制器有多个复位源(例如时钟监视器复位、看门狗复位等)。 假设因为看门狗,我的微控制器被重置了。如何在重置发生之前保存一些数据。我的意思是,例如,我如何理解看门狗重置之前程序计数器在哪里。使用这种方法,我想知道导致看门狗重置的错误(换句话说,长过程)在哪里。

在你的手册里有写。

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

您需要 post 有关您的 Freescale μC 的更多具体信息才能正确回答此问题。

根据您的微控制器,您可能会收到重置原因,但无法在重置后获得之前的 program counter (PC/IP)

大多数现代微控制器都提供 Watchdog Interrupt 而不是 reset。 您可以配置看门狗外围设备以启用中断,在该 ISR 中,您可以检查堆栈上存储的上下文。 (您可以借助 JTAG 调试器来检查调用堆栈)。

如果您的微控制器支持上述方法,则有多种调试方法可用。

例如 在简单的基于 while(1) 的架构中,您可以使用硬件计时器并在一段代码后重新启动它。在定时器 ISR 中,您将知道哪个代码段比定时器消耗的时间足够长。

两件事:

  1. 写一篇日志!并轮换该日志以保留最后 30 分钟。或者您认为重现错误所需的任何合理时间。日志停止的地方,您可以看到之前发生的事情。即使在生产级设备中也有一定程度的日志记录。
  2. (较少,实用)您可以将 调试器 附加到几乎每个微控制器并单步执行代码。可能会在您进入代码的关键部分之前设置一个断点。一些 IDEs/uCs 允许在某些变量包含某些值时触发“data-breakpoints”。 免责声明:我不熟悉您使用的具体微控制器。

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

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

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

  • RAM 在看门狗重置后保留。但可能不是在 LVD 复位之后,当然也不是在上电复位之后。在大多数情况下,这完全没有记录。
  • MCU 要么有一个状态寄存器,您可以在其中检查复位原因(例如 HCS08、MPC5x、Kinetis),要么有针对不同复位原因的特殊复位向量(例如 HC11、HCS12、Coldfire) .

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

但是可以保留一块 RAM 作为特殊段。上电复位后,您可以通过将所有内容设置为零来初始化该段。如果看门狗复位,则可以假设此 RAM 段仍然有效且完好无损。所以你不初始化它,而是保持原样。此方法使您能够在复位时保存变量值。 可能 - 对于大多数 MCU 系列,这没有很好的记录。我至少在 HCS08、HCS12 和 MPC56 上使用过这个技巧。

至于程序计数器,你倒霉了。它已重置,无法恢复。这意味着找出看门狗重置发生位置的唯一方法是将断点一点一点地向下移动代码的乏味老派方法,运行 程序并检查它是否到达断点。

尽管对于 MPC56 或 Cortex M 等现代 MCU,您只需检查跟踪缓冲区并查看导致重置的代码。您不仅可以获得 PC,还可以查看 C 源代码。但是您可能需要一个专业的、无 Eclipse 的工具链来执行此操作。

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

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

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