我正在学习ARM9处理器(SAM9G20)上的嵌入式系统。我对通用的过程编程更加熟悉。因此,我正在做的是遍历data sheet并了解其中有什么寄存器以及如何操作它们。
我的问题是,我怎么知道计算机何时重置?我知道有一个重置控制器可以管理重置。称为状态寄存器(RSTC_SR
)的寄存器存储了复位源。我需要保持定期读取此寄存器吗?
我的解决方案是将复位次数存储在FRAM中(或通过将其设置为0开始),一旦发生复位,便将此变量与主函数中的寄存器值进行比较。如果寄存器值较高,则显然会复位。但是,我确信还有一种更优化的方法(也许使用中断)。还是这通常是怎么做的?
答案 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或文件系统提供支持。