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

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

但是,我们遇到的问题是系统在监视程序计时器任务启动之前挂起。 系统挂起,因为文件系统代码编码错误,有很多while循环。 有时候由于坏的NAND(或至少文件系统代码认为它很糟糕),代码会在一个while循环中挂起,永远不会脱离它。 我们得到的是一块死板。

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

专业嵌入式系统的设计如下:

  • 选择具有上电复位中断和片内看门狗的MCU。 这是所有现代MCU的标准配置。
  • 从复位中断向量内部执行以下步骤。
  • 如果MCU内存设置简单,例如只设置堆栈指针,那么首先要做的是复位。 这使C编程成为可能。
  • 如果内存设置很复杂 – 有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确实有一个可以作为监视程序实现的计时器。 因此,您可能希望至少在贯穿关键和长节的程序部分中设置它。 您希望拥有一条首先设置此监视程序的引导代码,并在正确初始化之后转到应用程序。 实际上,这是一种非常常见的方法。