繁体   English   中英

如何在看门狗定时器任务开始之前防止系统挂起

[英]How to prevent system hang before watchdog timer task kicks in

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

但是,我们遇到了系统在看门狗定时器任务开始之前挂起的问题。 系统挂起是因为文件系统代码被错误地编码,并且有如此多的 while 循环。 有时由于 NAND 错误(或者至少文件系统代码认为它是错误的),代码会挂在一个 while 循环中并且永远无法摆脱它。 我们得到的是一个死板。

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

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

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

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

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

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

有一个硬件看门狗可以在应用程序运行之前运行。 根据文档:www.ti.com/lit/ds/symlink/am1808.pdf,ARM AM1808 确实有一个可以作为看门狗实现的定时器。 因此,您可能希望至少在运行关键部分和长部分的程序部分期间将其设置为这样。 您希望有一段引导代码,首先设置此看门狗,并在正确初始化后转到应用程序。 事实上,这是一种非常普遍的做法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM