c - 如何防止系统在看门狗定时器任务启动前挂起

标签 c while-loop embedded

我们使用的是基于 ARM AM1808 的嵌入式系统,带有 rtos 和文件系统。我们正在使用 C 语言。我们在应用程序代码中实现了一个看门狗定时器。因此,每当应用程序代码出现问题时,看门狗定时器就会负责系统。

但是,我们遇到了系统在看门狗定时器任务启动之前挂起的问题。系统挂起是因为文件系统代码编码错误,包含大量 while 循环。有时由于 NAND 错误(或至少文件系统代码认为它是错误的),代码会在 while 循环中挂起并且永远不会退出。而我们得到的是一 block 死板。

所以,给出所有信息的目的是问你们是否有任何机制可以在应用程序代码之前运行的代码中实现?有没有硬件看门狗?可以采取哪些步骤来确保我们不会得到由某些 while 循环引起的死板。

最佳答案

专业的嵌入式系统是这样设计的:

  • 选择具有上电复位中断和片上看门狗的 MCU。这是所有现代 MCU 的标准配置。
  • 从复位中断 vector 中执行以下步骤。
  • 如果 MCU 内存设置起来很简单,例如只需设置堆栈指针,那么在复位后做的第一件事就是这样做。这使 C 编程成为可能。只要不声明任何变量,您通常可以在 C 中编写重置 ISR - 反汇编以确保在这些地址可用之前它不会触及任何 RAM 内存地址。
  • 如果内存设置很复杂 - 有 MMU 设置或类似设置 - C 代码将不得不等待,你将不得不坚持使用汇编程序以防止 C 代码导致的意外堆栈。
  • 设置最基本的寄存器,例如模式/外设路由寄存器、看门狗和系统时钟。
  • 设置低压检测硬件(如果适用)。希望 MCU 上 LVD 的解除复位状态是合理的。
  • 应从此处设置特定于应用程序的关键寄存器,例如 GPIO 方向和内部拉电阻寄存器。许多 MCU 默认将引脚作为输入,因此容易受到攻击。如果它们不打算作为应用中的输入,则应尽量减少它们保持复位状态的时间,以避免噪声、瞬变和 ESD 问题。
  • 设置 MMU(如果适用)。
  • 其他所有“CRT”,例如 .data.bss 的初始化。
  • 调用 main()

请注意,为您的 MCU 预制的启动代码不一定由专业人员制作!您的工具链附带一个业余级的“CRT”是很常见的,它无法尽早设置看门狗和时钟。这当然是 Not Acceptable ,因为:

  1. 这使得在该平台上运行的任何程序都存在明显的安全/质量低劣隐患,以防“CRT”因任何原因崩溃/挂起。
  2. 这使得 .data.bss 的初始化不必要地非常缓慢,因为它通常是在默认的片上 RC 振荡器上运行的时钟执行的或类似的。

请注意,即使是 ARM CMSIS 等行业实际启动代码也无法执行上述某些特定于 MCU 的硬件设置。这可能是也可能不是问题。

关于c - 如何防止系统在看门狗定时器任务启动前挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47933281/

相关文章:

c - 将点阵打印机连接到嵌入式 CPU

c - 如何在没有 "&&"的情况下打印断言语句?

c - 在 C 程序中执行带有选项的命令

从指针转换为不同大小的整数 [-Wpointer-to-int-cast]

c - 带函数的 while 语句

arrays - Swift ArraySlice 索引超出 While 循环中非空数组中 Item[0] 的范围

python - Python 中的嵌套 While 循环

c - 哪些嵌入式处理器最接近多核

c - Arduino digitalRead() 总是返回低电平

c - 可变参数函数 - 是否有参数限制?