C 您如何知道微控制器何时复位?

C 您如何知道微控制器何时复位?,c,embedded,atmel,C,Embedded,Atmel,我正在学习ARM9处理器SAM9G20上的嵌入式系统。我更熟悉一般用途的过程编程。因此,我所做的是通过这些测试,了解寄存器的存在以及如何操作它们 我的问题是,我如何知道计算机何时复位?我知道有一个重置控制器可以管理重置。称为状态寄存器RSTC_SR的寄存器存储复位源。我是否需要定期阅读此注册表 我的解决方案是将重置次数存储在FRAM中,或将其设置为0,一旦重置发生,我将此变量与主函数中的寄存器值进行比较。如果寄存器值较高,则显然会重置。然而,我确信有一种更优化的方法,也许是使用中断。或者通常是这

我正在学习ARM9处理器SAM9G20上的嵌入式系统。我更熟悉一般用途的过程编程。因此,我所做的是通过这些测试,了解寄存器的存在以及如何操作它们

我的问题是,我如何知道计算机何时复位?我知道有一个重置控制器可以管理重置。称为状态寄存器RSTC_SR的寄存器存储复位源。我是否需要定期阅读此注册表


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

一个简单的解决方案是利用代码的结构。 嵌入式系统的许多代码库采用以下形式:

int main(void)
{
  // setup stuff here
  while (1)
  {
    // handle stuff here
  }
  return 0;
}
您可以利用上面的代码while1在启动时只运行一次。您可以在那里增加一个计数器,并将其保存在非易失性存储器中。这会告诉你微控制器重置了多少次


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

一个简单的解决方案是利用代码的结构。 嵌入式系统的许多代码库采用以下形式:

int main(void)
{
  // setup stuff here
  while (1)
  {
    // handle stuff here
  }
  return 0;
}
您可以利用上面的代码while1在启动时只运行一次。您可以在那里增加一个计数器,并将其保存在非易失性存储器中。这会告诉你微控制器重置了多少次


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

您不需要定期检查,因为每次机器复位时,您的程序都会从头开始重新启动


只需根据需要在启动代码中添加检查,即在main的早期。如果你想知道你重置的频率,那就更难了,因为通常没有SAMs的经验,我是STM32类型的人,船上计时器等也会重置。最好是某种真实世界的独立时钟,比如可以轮询并保存其值的RTC。如果你真的需要这个,请考虑。

< P>你不需要定期检查,因为每次机器重置,你的程序从一开始就重新开始。
只需根据需要在启动代码中添加检查,即在main的早期。如果你想知道你重置的频率,那就更难了,因为通常没有SAMs的经验,我是STM32类型的人,船上计时器等也会重置。最好是某种真实世界的独立时钟,比如可以轮询并保存其值的RTC。如果你真的需要这个,请考虑。

< P>一个方法是在调试模式下运行代码,如果你在重置之后有一个SAM.的调试器,程序计数器指向你的代码开始的地址。p> 一种方法是,如果SAM有调试器,则在调试模式下运行代码。重置后,程序计数器C指向代码开始的地址

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

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

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


重置原因的任何计数都应该在代码启动的早期,在启用任何中断之前进行,因为中断本身可能会导致重置。这可能要求您在启动代码可能启用中断的情况下,在调用main之前在启动代码中实现计数器—例如,对于stdio或文件系统支持。

每当处理器启动时,根据定义,它都会进行重置。什么是重置状态 us寄存器不指示复位的来源或原因,如通电、看门狗定时器、失电、软件指令、复位引脚等

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

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



重置原因的任何计数都应该在代码启动的早期,在启用任何中断之前进行,因为中断本身可能会导致重置。这可能要求您在启动代码可能启用中断的情况下,在调用main之前在启动代码中实现计数器,例如,对于stdio或文件系统支持。

调用系统启动代码时,您会知道系统已重置。我在数据表13.4.3中读到,可以管理ISR在某种重置功能中。首先,你需要研究什么是重置,这其中任何一个都有意义。复位时,所有硬件、所有寄存器和程序计数器都将恢复,以便从复位向量处编程的功能执行写入ARM地址0的32位地址。这是复位的定义。@SirJoBlack:13.4.3仅指可配置为中断引脚复位引脚的NRST引脚-如果配置为中断,则实际上不是复位-尽管中断处理程序可能发出复位。然后,您可以使用它来计数或记录被断言的重置引脚,但还有其他重置源不会被计数。所以我不确定这是否有帮助。Atmel/Microchip将SAM9G20归类为MPU,而不是微控制器。它有一个MMU,通常在重置后执行引导ROM、引导程序、U-boot,然后是Linux。当调用系统启动代码时,您会知道系统被重置。我在数据表13.4.3中读到,可以在某种重置功能中管理ISR。您首先需要研究什么是重置,让这一切都有意义。复位时,所有硬件、所有寄存器和程序计数器都将恢复,以便从复位向量处编程的功能执行写入ARM地址0的32位地址。这是复位的定义。@SirJoBlack:13.4.3仅指可配置为中断引脚复位引脚的NRST引脚-如果配置为中断,则实际上不是复位-尽管中断处理程序可能发出复位。然后,您可以使用它来计数或记录被断言的重置引脚,但还有其他重置源不会被计数。所以我不确定这是否有帮助。Atmel/Microchip将SAM9G20归类为MPU,而不是微控制器。它有一个MMU,通常在复位后执行其引导ROM,然后是引导,然后是U-boot,然后是Linux。如果在复位ISR和调用main的指针之间有复位怎么办?如果发生重置,这对他们来说是一个非常有可能的位置。如果重置ISR和调用main的指针之间有重置怎么办?如果重置发生,那对他们来说是一个非常有可能的地方。甚至可能在main之前-许多代码和中断可能会在main之前运行,main本身可能会强制重置。理想情况下,在出现任何中断或任何可能导致重置或卡住并强制看门狗的代码之前。@Clifford I假设有一个合理的平台,在启用任何特定中断的情况下不会从重置中出来。哪种微型计算机能做到这一点?没有。这不是我的建议。在main执行标准库初始化之前运行的启动代码,包括可能利用中断的I/O和计时。甚至可能在main之前-许多代码和中断可能在main之前运行,main本身可能强制重置。理想情况下,在出现任何中断或任何可能导致重置或卡住并强制看门狗的代码之前。@Clifford I假设有一个合理的平台,在启用任何特定中断的情况下不会从重置中出来。哪种微型计算机能做到这一点?没有。这不是我的建议。在main执行标准库初始化之前运行的启动代码,包括I/O和可能利用中断的计时。这是对问题标题的某种回答,但问题的主体更为详细,我认为这不是对该问题的回答。你可能是对的,但对我来说,不清楚目标是否记录重置状态
或者简单地“查看”是否发生重置。第二,我认为我的答案是实现这一目标的简单方法。这是对问题标题的一种回答,但问题的主体更为详细,我认为这并不是对这一点的回答。你可能是对的,但对我来说,不清楚目标是记录重置状态还是简单地“查看”重置是否发生。第二,我认为我的答案是实现这一目标的简单方法。