Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在微控制器硬件复位之前保存一些数据?_C_Embedded_Microcontroller_Nxp Microcontroller - Fatal编程技术网

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

C 如何在微控制器硬件复位之前保存一些数据?,c,embedded,microcontroller,nxp-microcontroller,C,Embedded,Microcontroller,Nxp Microcontroller,我在做一个Freesacle微控制器。该微控制器具有多个复位源(例如时钟监视器复位、看门狗复位和…)。 假设由于看门狗的原因,我的微控制器被重置。如何在重置发生之前保存一些数据。我的意思是,例如,我如何理解在看门狗复位之前程序计数器在哪里。使用这种方法,我想知道哪里有导致看门狗复位的错误(换句话说是长过程)。它写在您的手册中 我不知道具体的处理器,但在大多数微处理器中,看门狗复位是软复位,这意味着某些寄存器将保留有关复位源的信息,有时还有原因 您需要在飞思卡尔μC上发布更具体的信息,以便正确回答

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

它写在您的手册中

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


您需要在飞思卡尔μC上发布更具体的信息,以便正确回答此问题。

根据您的微控制器,您可能会得到重置原因,但重置后无法获得先前的
程序计数器(PC/IP)

大多数现代微控制器都提供了
看门狗中断
,而不是
复位
。 您可以将看门狗外围设备配置为启用中断,在这种情况下,您可以检查堆栈上存储的上下文。(您可以从JTAG调试器获取帮助以检查调用堆栈)

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

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

两件事:

  • 写一篇日志!并旋转日志,以保持最后30分钟,或任何你认为需要重现错误的合理时间。在日志停止的地方,你可以看到之前发生了什么。即使在生产级设备中,也存在一定程度的日志记录
  • (不太实用)您可以将调试器附加到几乎每个micrcontroller,并逐步完成代码。可能在您进入代码的关键部分之前放置一个断点。某些IDE/uCs允许在某些变量包含某些值时触发“数据断点”。 免责声明:我不熟悉您使用的确切微控制器

  • 即使您可以在重置之前获取程序计数器,也不建议在重置之后盲目地将程序计数器设置为另一个,因为可能存在堆栈和堆信息以及数据本身也可能发生了更改


    这取决于重置后要保留的内容、某些行为或数据?易失性存储器可能在看门狗(参见您的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的工具链来完成这项工作。

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

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


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

    这实际上通常不在任何飞思卡尔MCU的手册中。依靠RAM中的内容