前言
首先在功能安全标准第6章,7.4.12中提到,应对程序流进行软件或者硬件的时间监控和程序流监控。

在第5章的附录中,也提到了不同监控类型的功能和诊断覆盖率


而在嵌入式系统中具体的做法可以分为两种:
硬件看门狗独立实现
软件+硬件看门狗实现
一、硬件看门狗独立实现
看门狗可以监控程序的运行状态。 当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性。
常规的硬件看门狗有以下几种:
1.1 独立看门狗 Independent Watchdog(IWDG)
具有独立时间基准,只规定了最大喂狗间隔时间,对时间精度要求较低 。
功能特点:
自由运行的递减计数器
时钟由独立的RC振荡器提供(可在停止和待机模式下工作)
看门狗被激活后,则在计数器计数至0x000时产生复位

1.2 窗口看门狗 Window Watchdog(WWDG)
在独立看门狗的基础上,为喂狗间隔时间设定了上限和下限。提高了时间精度。
功能特点:
初始化时有一个长时间的Open Window,喂狗后进入运行模式。
运行模式必须在Open Window期间内喂狗,Closed Window期间不允许。
Closed Window期间喂狗, Open Window期间错误喂狗或未喂狗都被认定为错误。
错误计数达到阈值后触发复位,成功喂狗可以减少错误计数。

1.3 程序序列看门狗 Programme Sequence Watchdog(PWDG)
用软件或者外部设备来监控各程序段的正确顺序。一般有多个检查点,被固定的插入到程序流中,各个检查点必须无遗漏的顺序的通过检查。
功能特点:
在初始时会生成一个根源(值或问题)
接下来需要进行多次检查(特定计算规则后生成的答案)。
检查通过(答案符合预期)后判定为喂狗成功。
中间有任意一次遗漏或答案错误都属于喂狗失败。
主要目的在于检查程序的执行顺序。

1.4 高阶混合看门狗 Combination Watchdog(CWDG)
即监控程序的执行时间,也检查程序流的执行顺序,为程序序列看门狗和独立看门狗(或窗口看门狗)的组合。
功能特点:
具有独立时间基准。
喂狗窗口可以是只有最大时间间隔,也可以是兼具上限和下限的时间窗口。
可以生成多个检查点 既可以实现对程序执行时间的监控,又可以实现对程序执行顺序的检查。
是程序序列看门狗和独立看门狗(或窗口看门狗)的组合。

1.5 看门狗作为安全机制的用法总结
|
名称 |
看门狗机制 |
目的 |
覆盖率 |
描述 |
|
独立 看门狗 |
具有独立时基的看门狗(无时间窗口) |
监控程序序列的行为和合理性。 |
低(60%) |
定期触发具有独立时基的外部定时元件(例如看门狗定时器),以监控处理器的行为和 程序序列的合理性:定期触发具有独立时基的外部定时元件(例如看门狗定时器),以监控处理器的行为和程序序列的合理性。在程序中正确设置触发点非常重要。看门狗的触发时间并不固定,但规定了最大间隔时间。 |
|
窗口 看门狗 |
具有独立时基和时间窗口的看门狗 |
监控程序序列的行为和合理性。 |
中(90%) |
具有独立时基和时间窗口的外部定时元件:定期触发具有独立时基的外部定时元件(例如看门狗定时器),以监控处理器的行为和程序序列的合理性。重要的是,要将触发点正确放置在程序中(如不在中断服务例程中)。为看门狗定时器设定了上限和下限。 |
|
程序序列看门狗 |
程序顺序的逻辑监控 |
监控各程序段的正确顺序。 |
中(90%) |
监控各程序段的正确顺序:使用软件(计数程序、按键程序)或外部监控设备(参考文献 [23,24])来监控各个程序段的正确顺序。重要的是在程序中设置检查点,以便监控因单点或多点故障而无法完成或执行顺序不对而导致危险的路径。可以在每次功能调用之间更新顺序,也可以将其更紧密地整合到程序执行中。 |
|
高阶混合看门狗 |
程序顺序的时间监控和逻辑监控相结合 |
监控各程序段的行为、顺序和执行时间间隔。 |
高(99%) |
时间设施(如监视器)是程序顺序监控的重要工具:只有当各程序段的顺序也正确执行时,才会重新触发监测程序顺序的时间设施(例如看门狗定时器 |
二、软件+硬件看门狗实现
在嵌入式系统中,尤其是在汽车电子、工业控制等对安全性要求极高的领域,功能安全标准(如ISO 26262)要求系统能够检测并响应软件运行时错误。而我们的硬件看门狗有时只是简单的独立看门狗,只能检测系统是否“活着”,但无法监控程序执行的正确顺序和时间行为。本文将介绍如何通过软件增强简单的看门狗硬件,实现对程序流和时间约束的高覆盖率监控。
2.1 监控机制概述
本方案通过以下两个核心机制提升监控能力:
-
逻辑监控(Program Flow Monitoring)
确保函数或任务按预期顺序执行。通过“检查点”(Checkpoint)机制,验证执行路径是否符合预设逻辑。 -
时间监控(Timing Monitoring)
确保函数或任务在允许的时间窗口内执行,包括周期时间、截止时间等时序约束。
2.2 代码实现解析
2.2.1 关键数据结构
程序使用多个结构体来存储监控所需的各类信息:
typedef struct stl_pfm_task_info {
rt_uint32_t deadlineStartTimestamp;
StlPfmTimestamp_t timestamp;
rt_uint32_t signature; // 当前累计签名
rt_uint32_t expectedSignature; // 预期签名
rt_uint32_t checkpointCount;
rt_uint32_t isProgramFlowCorrect;
rt_uint32_t integrity; // 内存完整性校验值
} StlPfmTaskInfo_t;
signature是通过LSFR(线性反馈移位寄存器)算法生成的校验值,用于验证执行顺序。expectedSignature是正确执行顺序所对应的预期值。
2.2.2 初始化过程
系统启动时调用 StlPfm_Init(),初始化所有任务监控所需的变量,并计算每个任务的预期签名:
stlPfmTask[i].expectedSignature = StlPfm_ExpectSignCal(
stlPfmKExpectedTaskInfo[i].firstCheckpoint,
stlPfmKExpectedTaskInfo[i].numberOfCheckpoints
);
2.2.3 检查点机制
在代码关键位置插入检查点调用:
StlPfm_CheckpointReached(seId, checkpoint);
每次检查点被触发时:
- 更新当前任务的签名(基于检查点ID)
- 验证内存完整性(防篡改)
- 若达到预期检查点数量,启动全面监控(
StlPfm_RunAllMonitors)
2.2.4 全面监控执行
StlPfm_RunAllMonitors() 函数依次进行三类检测:
时间窗口监控
- 确保任务执行间隔在最小和最大时间限制内
- 防止执行过快或过慢异常
截止时间监控
- 确保任务从开始到完成不超过预设时限
- 避免任务执行超时
逻辑流监控
- 通过数字签名验证执行顺序
- 确保程序按预期路径执行
result_value = StlPfm_DeadlineSuccess(...); // 截止时间检查
result_value = StlPfm_TimingSuccess(...); // 时间窗口检查
result_value = StlPfm_LogicalSuccess(...); // 逻辑流检查
任何一项失败将触发错误处理(如设置看门狗报警)。
2.2.5 签名生成与校验
使用LSFR算法生成签名,确保即使单个检查点错误也会导致最终签名不匹配:
signature = Stl_Lfsr32_Update(signature, checkpoint);
2.2.6 内存完整性保护
通过 StlPfm_MemoryIntegrity() 检测关键数据是否被意外修改(如栈溢出、电磁干扰等)。
2.3 实际应用建议
定义监控任务:确定需要监控的关键任务或函数
设置检查点:在代码关键位置插入监控点
配置参数:根据实际需求设置时间限制和检查点序列
初始化系统:在系统启动时完成监控模块的初始化
错误处理:检测到错误时应根据安全需求采取相应措施,如系统复位、安全状态切换等。
结语
通过本文介绍的软件方案,即便使用简单的硬件看门狗,也能实现对程序流和时间行为的高覆盖率监控,显著提升系统功能安全水平。这种方案尤其适合资源受限但安全性要求高的嵌入式场景。


安全机制之程序流监控&spm=1001.2101.3001.11974&articleId=154078979&d=1&t=3&u=dd456a6292a14d63af2d8b75638c7193)

被折叠的 条评论
为什么被折叠?



