C 如何在微控制器硬件复位之前保存一些数据?
我在做一个Freesacle微控制器。该微控制器具有多个复位源(例如时钟监视器复位、看门狗复位和…)。C 如何在微控制器硬件复位之前保存一些数据?,c,embedded,microcontroller,nxp-microcontroller,C,Embedded,Microcontroller,Nxp Microcontroller,我在做一个Freesacle微控制器。该微控制器具有多个复位源(例如时钟监视器复位、看门狗复位和…)。 假设由于看门狗的原因,我的微控制器被重置。如何在重置发生之前保存一些数据。我的意思是,例如,我如何理解在看门狗复位之前程序计数器在哪里。使用这种方法,我想知道哪里有导致看门狗复位的错误(换句话说是长过程)。它写在您的手册中 我不知道具体的处理器,但在大多数微处理器中,看门狗复位是软复位,这意味着某些寄存器将保留有关复位源的信息,有时还有原因 您需要在飞思卡尔μC上发布更具体的信息,以便正确回答
假设由于看门狗的原因,我的微控制器被重置。如何在重置发生之前保存一些数据。我的意思是,例如,我如何理解在看门狗复位之前程序计数器在哪里。使用这种方法,我想知道哪里有导致看门狗复位的错误(换句话说是长过程)。它写在您的手册中 我不知道具体的处理器,但在大多数微处理器中,看门狗复位是软复位,这意味着某些寄存器将保留有关复位源的信息,有时还有原因
您需要在飞思卡尔μC上发布更具体的信息,以便正确回答此问题。根据您的微控制器,您可能会得到重置原因,但重置后无法获得先前的
程序计数器(PC/IP)
大多数现代微控制器都提供了看门狗中断
,而不是复位
。
您可以将看门狗外围设备配置为启用中断,在这种情况下,您可以检查堆栈上存储的上下文。(您可以从JTAG调试器获取帮助以检查调用堆栈)
如果您的微控制器不支持上述方法,则可以使用多种调试方法
e、 g
在基于简单while(1)
的体系结构中,您可以使用硬件计时器,并在某段代码后重新启动它。在定时器ISR中,您将知道哪个代码段比定时器消耗的时间足够长。两件事:
即使您可以在重置之前获取程序计数器,也不建议在重置之后盲目地将程序计数器设置为另一个,因为可能存在堆栈和堆信息以及数据本身也可能发生了更改
这取决于重置后要保留的内容、某些行为或数据?易失性存储器可能在看门狗(参见您的uC数据表)后被清除,也可能没有被清除,并且您将能够在检查重置寄存器(再次参见您的uC数据表)后检测到重置。通过检测重置并检查易失性存储器,您可以在发生重置这一不太可能的事件后,以您喜欢的方式准备uC重新启动。您可以创建一个全局值并将其设置为全局范围中的特定值,然后如果它重置,则在发生重置事件时对照它检查该值——如果它相同,则可以假定其他内存也相同。如果非易失性内存选项,您需要查看数据表中的非易失性选项,但由于写入限制,建议不要继续写入非易失性内存。大多数飞思卡尔MCU的工作方式如下:
- 看门狗复位后,RAM被保留。但可能不是LVD重置后,当然也不是上电重置后。在大多数情况下,这是完全没有记录的
- MCU将具有一个状态寄存器,您可以在其中检查复位原因(例如HCS08、MPC5x、Kinetis),或者它将具有针对不同复位原因(例如HC11、HCS12、Coldfire)的特殊复位向量
虽然对于MPC56或Cortex M等现代MCU,您只需检查跟踪缓冲区,看看是什么代码导致了复位。您不仅可以使用PC,还可以查看C源代码。但是您可能需要一个专业的、无Eclipse的工具链来完成这项工作。如果您的芯片支持嵌入式指令跟踪,唯一可靠的解决方案是使用具有跟踪功能的调试器 有些设备可以选择将看门狗超时重定向到中断,而不是重置。这将允许您像编写异常处理程序一样编写看门狗超时处理程序,并转储或存储堆栈信息,包括指示中断发生位置的返回地址
然而,在某些情况下,这两种解决方案都不是实现目标的可靠方法。在具有中断处理程序的多任务环境或系统中,看门狗超时时运行的代码可能不是导致问题的进程。这实际上通常不在任何飞思卡尔MCU的手册中。依靠RAM中的内容