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

2023-12-13

我们使用基于 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”,它无法尽早设置看门狗和时钟。这当然是不可接受的,因为:

  1. 这使得在该平台上运行的任何程序都存在显着的安全/质量差的危险,以防“CRT”因任何原因崩溃/挂起。
  2. 这使得初始化.data and .bss不必要地,速度慢得令人痛苦,因为它通常是使用在默认片上 RC 振荡器或类似振荡器上运行的时钟来执行的。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在看门狗定时器任务启动之前防止系统挂起 的相关文章

  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点

随机推荐