我们使用基于 ARM AM1808 的嵌入式系统,带有 rtos 和文件系统。我们用的是C语言。我们在应用程序代码中实现了一个看门狗定时器。因此,每当应用程序代码出现问题时,看门狗定时器就会负责处理系统。
但是,我们遇到了一个问题,即系统在看门狗定时器任务启动之前挂起。系统挂起是因为文件系统代码编码错误,包含大量 while 循环。有时由于 NAND 坏了(或者至少文件系统代码认为它坏了),代码会挂在 while 循环中并且永远不会退出。我们得到的是一块死板。
所以,提供所有信息的目的是问你们是否有任何机制可以在应用程序代码之前运行的代码中实现?有没有硬件看门狗?可以采取哪些步骤来确保我们不会因为某些 while 循环而导致死板。
专业的嵌入式系统是这样设计的:
- 选择具有上电复位中断和片上看门狗的 MCU。这是所有现代 MCU 的标准配置。
- 从复位中断向量内部执行以下步骤。
- 如果 MCU 内存设置很简单,例如仅设置堆栈指针,那么在复位后要做的第一件事就是这样做。这使得 C 编程成为可能。只要不声明任何变量,您通常可以用 C 语言编写复位 ISR - 反汇编以确保它不会触及任何 RAM 内存地址,直到这些地址可用为止。
- 如果内存设置很复杂 - 有 MMU 设置或类似的 - C 代码将不得不等待,并且您必须坚持使用汇编程序以防止由 C 代码引起的意外堆栈。
- 设置最基本的寄存器,例如模式/外设路由寄存器、看门狗和系统时钟。
- 设置低电压检测硬件(如果适用)。希望 MCU 上 LVD 的未复位状态是良好的。
- 特定于应用程序的关键寄存器(例如 GPIO 方向和内部拉电阻寄存器)应从此处设置。许多 MCU 默认将引脚作为输入,这使得它们容易受到攻击。如果它们不打算作为应用中的输入,则应尽量缩短它们不复位的时间,以避免噪声、瞬态和 ESD 问题。
- 设置 MMU(如果适用)。
- 其他一切“CRT”,例如初始化
.data
and .bss
.
- Call
main()
.
请注意,为您的 MCU 预制的启动代码不一定是由专业人士编写的!相当常见的是,您的工具链附带了一个业余级的“CRT”,它无法尽早设置看门狗和时钟。这当然是不可接受的,因为:
- 这使得在该平台上运行的任何程序都存在显着的安全/质量差的危险,以防“CRT”因任何原因崩溃/挂起。
- 这使得初始化
.data
and .bss
不必要地,速度慢得令人痛苦,因为它通常是使用在默认片上 RC 振荡器或类似振荡器上运行的时钟来执行的。
请注意,即使是业界事实上的启动代码(例如 ARM CMSIS)也无法执行上述某些 MCU 特定的硬件设置。这可能是问题,也可能不是问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)