您怎么知道微控制器何时复位?

时间:2019-02-18 11:46:49

标签: c embedded atmel

我正在学习ARM9处理器(SAM9G20)上的嵌入式系统。我对通用的过程编程更加熟悉。因此,我正在做的是遍历data sheet并了解其中有什么寄存器以及如何操作它们。

我的问题是,我怎么知道计算机何时重置?我知道有一个重置控制器可以管理重置。称为状态寄存器(RSTC_SR)的寄存器存储了复位源。我需要保持定期读取此寄存器吗?

我的解决方案是将复位次数存储在FRAM中(或通过将其设置为0开始),一旦发生复位,便将此变量与主函数中的寄存器值进行比较。如果寄存器值较高,则显然会复位。但是,我确信还有一种更优化的方法(也许使用中断)。还是这通常是怎么做的?

4 个答案:

答案 0 :(得分:2)

您不需要定期检查,因为每次重置计算机时,程序都会从​​头开始重新启动。

只需根据需要将检查添加到启动代码中,即在main()的早期。如果您想知道诸如经常重置的方式,那会比较困难,因为通常(没有SAM的经验,我是STM32类型的家伙)板上定时器等也将重置。最好是某种独立于现实世界的时钟,例如可以轮询并保存其值的RTC。不过,请考虑您是否真的需要这个。

答案 1 :(得分:1)

一个简单的解决方案是利用代码的结构。 嵌入式的许多代码库都采用这种形式:

int main(void)
{
  // setup stuff here
  while (1)
  {
    // handle stuff here
  }
  return 0;
}

您可以利用while(1)以上的代码在启动时仅运行一次。您可以在那里增加一个计数器,并将其保存在非易失性存储器中。那会告诉您微控制器已复位多少次。

另一个例子是在Arduino上,其中代码的结构使得一次调用名为setup()的函数,而连续调用名为loop()的函数。使用这种结构,您可以增加setup()函数中的变量以达到相同的效果。

答案 2 :(得分:0)

一种方法是在调试模式下运行代码(如果您有SAM的调试器)。复位后,程序计数器(PC)指向您的代码开始的地址。

答案 3 :(得分:0)

每当您的处理器启动时,根据定义,它都会复位。复位状态寄存器的作用是指示复位的来源或原因,例如上电,看门狗定时器,掉电,软件指令,复位引脚等。

知道何时重置处理器不是问题,因为代码已重新启动这一事实是隐含的。知道重置的原因是一个问题。

如果您的应用程序不需要它,则根本不需要监视或读取它的复位状态,但是在某些应用程序中,这可能是一个有用的诊断方法,例如维护各种复位原因的计数,因为它可能表明复位状态系统软件的稳定性,电源或操作员的行为。理想情况下,假设您在启动时就足够早地拥有合适的RTC源,则希望使用时间戳记录原因。重置的时间通常是有用的诊断方法,只需简单地对它们进行计数就不会。

在允许任何中断之前,应该在代码启动的早期就对复位原因进行任何计数(因为中断本身可能会引起复位)。在启动代码可能允许中断的情况下,这可能需要您在启动main()之前在启动代码中实现计数器-例如为stdio或文件系统提供支持。