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

问题描述 投票:2回答:6

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

c embedded microcontroller nxp-microcontroller
6个回答
2
投票

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

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

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

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

至于程序计数器,你运气不好。它被重置,无法恢复它。这意味着找出看门狗复位发生位置的唯一方法是在学校代码中逐位移动断点的繁琐的旧学校方式,运行程序并检查它是否到达断点。

虽然在现代MCU(如MPC56或Cortex M)的情况下,您只需检查跟踪缓冲区并查看导致重置的代码。你不仅可以获得PC,还可以看到C源代码。但是,您可能需要一个专业的,不含Eclipse的工具链来完成此任务。


1
投票

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

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

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

例如,在简单的基于while(1)的体系结构中,您可以使用HW计时器并在部分代码之后重新启动它。在Timer ISR中,您将知道哪个代码段比定时器消耗的时间长。


1
投票

两件事情:

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

0
投票

它写在您的手册中。

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

您需要在飞思卡尔μC上发布更具体的信息才能正确回答。


0
投票

即使你可以在复位之前得到程序计数器,也不建议在复位后盲目地将程序计数器设置为另一个程序计数器 - 因为可能存在堆栈和堆信息以及数据本身也可能已经改变。

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.