你怎么知道微控制器何时复位?
How do you know when a micro-controller reset?
我正在学习基于 ARM9 处理器 (SAM9G20) 的嵌入式系统。我更熟悉通用的过程编程。因此,我正在做的是浏览 data sheet 并了解有哪些寄存器以及如何操作它们。
我的问题是,我如何知道计算机何时重置?我知道有一个管理重置的重置控制器。称为状态寄存器 (RSTC_SR
) 的寄存器存储复位源。我需要定期读取这个寄存器吗?
我的解决方案是将重置次数存储在 FRAM 中(或从将其设置为 0 开始),一旦发生重置,我将此变量与主函数中的寄存器值进行比较。如果寄存器值更高,那么显然它会重置。但是我确信有一种更优化的方法(可能使用中断)。或者这就是通常的做法?
一个简单的解决方案是利用代码的结构。
许多嵌入式代码库采用这种形式:
int main(void)
{
// setup stuff here
while (1)
{
// handle stuff here
}
return 0;
}
你可以利用上面的代码 while(1)
在启动时只 运行 一次。您可以在那里增加一个计数器,并将其保存在非易失性存储中。那会告诉你微控制器重置了多少次。
另一个例子是在 Arduino 上,其中代码的结构是调用一次名为 setup()
的函数,然后连续调用一个名为 loop()
的函数。使用此结构,您可以增加 setup()
函数中的变量以达到相同的效果。
您不需要定期检查,因为每次重置机器时您的程序都会从头开始。
只需在启动代码中添加检查,即根据需要在 main()
的早期添加检查。如果您想弄清楚 经常 重置的方式,那么这会更加困难,因为通常(没有使用 SAM 的经验,我是 STM32 类型的人)机载计时器等也会重置。最好是某种真实世界的独立时钟,例如可以轮询并保存其值的 RTC。不过,请考虑您是否真的需要它。
一种方法是 运行 调试模式下的代码(如果您有 SAM 的调试器)。重置后,程序计数器 (PC) 指向代码开始的地址。
每当您的处理器启动时,根据定义,它已退出重置状态。复位状态寄存器的作用是指示复位的来源或原因,例如上电、看门狗定时器、掉电、软件指令、复位引脚等。
这不是知道处理器何时重置的问题 - 这是隐含的,因为您的代码已重新启动。而是了解重置的原因。
如果您的应用程序不需要它,您根本不需要监视或读取重置状态,但在某些应用程序中,它可能是一种有用的诊断,例如维护各种重置原因的计数,因为它可能具有指示性系统软件的稳定性、电源或操作员的行为。理想情况下,假设您在启动时足够早地拥有合适的 RTC 源,那么您希望使用时间戳记录原因。重置时间通常是一种有用的诊断方法,而简单地计算它们可能不是。
任何对重置原因的计数都应该在代码启动的早期发生,然后再启用任何中断(因为中断本身可能会导致重置)。在启动代码可能启用中断的情况下,这可能需要您在调用 main()
之前在启动代码中实现计数器 - 例如,对于 stdio 或文件系统支持。
我正在学习基于 ARM9 处理器 (SAM9G20) 的嵌入式系统。我更熟悉通用的过程编程。因此,我正在做的是浏览 data sheet 并了解有哪些寄存器以及如何操作它们。
我的问题是,我如何知道计算机何时重置?我知道有一个管理重置的重置控制器。称为状态寄存器 (RSTC_SR
) 的寄存器存储复位源。我需要定期读取这个寄存器吗?
我的解决方案是将重置次数存储在 FRAM 中(或从将其设置为 0 开始),一旦发生重置,我将此变量与主函数中的寄存器值进行比较。如果寄存器值更高,那么显然它会重置。但是我确信有一种更优化的方法(可能使用中断)。或者这就是通常的做法?
一个简单的解决方案是利用代码的结构。 许多嵌入式代码库采用这种形式:
int main(void)
{
// setup stuff here
while (1)
{
// handle stuff here
}
return 0;
}
你可以利用上面的代码 while(1)
在启动时只 运行 一次。您可以在那里增加一个计数器,并将其保存在非易失性存储中。那会告诉你微控制器重置了多少次。
另一个例子是在 Arduino 上,其中代码的结构是调用一次名为 setup()
的函数,然后连续调用一个名为 loop()
的函数。使用此结构,您可以增加 setup()
函数中的变量以达到相同的效果。
您不需要定期检查,因为每次重置机器时您的程序都会从头开始。
只需在启动代码中添加检查,即根据需要在 main()
的早期添加检查。如果您想弄清楚 经常 重置的方式,那么这会更加困难,因为通常(没有使用 SAM 的经验,我是 STM32 类型的人)机载计时器等也会重置。最好是某种真实世界的独立时钟,例如可以轮询并保存其值的 RTC。不过,请考虑您是否真的需要它。
一种方法是 运行 调试模式下的代码(如果您有 SAM 的调试器)。重置后,程序计数器 (PC) 指向代码开始的地址。
每当您的处理器启动时,根据定义,它已退出重置状态。复位状态寄存器的作用是指示复位的来源或原因,例如上电、看门狗定时器、掉电、软件指令、复位引脚等。
这不是知道处理器何时重置的问题 - 这是隐含的,因为您的代码已重新启动。而是了解重置的原因。
如果您的应用程序不需要它,您根本不需要监视或读取重置状态,但在某些应用程序中,它可能是一种有用的诊断,例如维护各种重置原因的计数,因为它可能具有指示性系统软件的稳定性、电源或操作员的行为。理想情况下,假设您在启动时足够早地拥有合适的 RTC 源,那么您希望使用时间戳记录原因。重置时间通常是一种有用的诊断方法,而简单地计算它们可能不是。
任何对重置原因的计数都应该在代码启动的早期发生,然后再启用任何中断(因为中断本身可能会导致重置)。在启动代码可能启用中断的情况下,这可能需要您在调用 main()
之前在启动代码中实现计数器 - 例如,对于 stdio 或文件系统支持。