4. 技术安全概念(TSC):技术安全概念开发、系统架构设计、硬件软件接口定义、安全机制实现
好,我们进入技术安全概念(TSC)的环节。说实话,这是整个功能安全开发中最「硬核」的部分之一。前面我们聊了危害分析和安全目标,那是「我们要保护什么」。到了TSC,就是「具体怎么保护」。
我个人习惯把TSC看作一座桥梁。一头连着安全目标,另一头连着具体的硬件和软件实现。这座桥搭不好,后面的设计全白费。
4.1 技术安全概念的核心思路
技术安全概念,说白了就是把安全需求翻译成技术语言。你想想看,安全目标里写的是「转向系统不能非预期输出」,这太抽象了。工程师没法直接写代码或画电路图。
所以我们要做三件事:
- 分解:把安全目标拆成更细的技术需求
- 分配:把这些需求分给硬件、软件或系统层面
- 实现:定义具体的安全机制来满足这些需求
我在项目中遇到过一个问题:团队花了两周写安全目标,结果到了TSC阶段发现,有些目标根本没法在现有架构上实现。嗯,这就是典型的「纸上谈兵」。所以我现在做TSC时,一定会拉着系统架构师和硬件负责人一起过。
4.2 系统架构设计中的安全考量
系统架构设计不是画个框图就完事了。你得考虑:
- 冗余架构:单点故障会不会导致安全目标被违反?
- 故障响应时间:从故障发生到安全状态,系统能不能在要求时间内完成?
- 独立性:安全相关功能和非安全功能之间有没有足够的隔离?
关键原则:ASIL等级越高,对架构的独立性要求越严格。ASIL D的系统,我建议至少考虑1oo2或2oo2的冗余架构。
举个例子。我之前做的一个线控制动项目,安全目标是「制动压力不能非预期增加」。我们在架构上做了两路独立的压力传感器,一路给主控制器,一路给监控控制器。两路数据交叉校验,一旦偏差超过阈值,系统立即进入降级模式。
为什么会这样设计?因为单路传感器如果失效,可能输出错误的高压力值。没有冗余,你根本发现不了。
4.3 硬件软件接口定义
HSI(Hardware-Software Interface)是TSC里最容易出问题的地方。我见过太多项目,硬件和软件各做各的,最后联调时发现接口对不上。
HSI文档需要明确:
- 信号定义:每个信号的名字、类型、范围、精度
- 时序要求:采样周期、响应延迟、同步机制
- 故障处理:硬件检测到故障后,如何通知软件?软件如何响应?
- 诊断覆盖:每个接口的故障检测能力要达到什么水平?
| 接口类型 | 典型故障 | 推荐安全机制 |
|---|---|---|
| 数字输入 | 短路、开路 | 周期性测试、回读校验 |
| 模拟输入 | 漂移、偏移 | 限幅检查、合理性校验 |
| 通信总线 | 数据损坏、丢失 | CRC、序列号、超时监控 |
| PWM输出 | 占空比错误 | 回读比较、看门狗 |
我的经验:HSI文档最好在架构设计阶段就定稿,而不是等到详细设计时再补。我曾经吃过这个亏,软件改了三版才把接口对齐,浪费了整整两周。
4.4 安全机制实现
安全机制是TSC的落脚点。没有具体的安全机制,前面所有的分析都是空谈。
常见的几类安全机制:
4.4.1 故障检测机制
- 自检:上电自检、周期自检
- 交叉比较:两个独立通道的结果对比
- 合理性检查:信号是否在预期范围内
- 时序监控:程序执行时间是否超时
4.4.2 故障响应机制
- 安全状态切换:进入降级模式或完全关闭
- 故障存储:记录故障码和上下文信息
- 用户提示:点亮故障灯或发出警告
4.4.3 故障避免机制
- 硬件冗余:双路供电、双路传感器
- 软件多样性:不同算法实现同一功能
- 分区隔离:内存保护、时间保护
这里我分享一个代码示例。这是一个简单的看门狗实现,用于监控主循环的执行时间:
/* 看门狗监控任务 - 用于检测主循环是否卡死 */
void Watchdog_Monitor(void)
{
static uint32_t last_feed_time = 0;
uint32_t current_time = GetSystemTick();
/* 检查上次喂狗时间是否超时 */
if ((current_time - last_feed_time) > WDT_TIMEOUT_MS)
{
/* 超时!触发安全响应 */
Enter_SafeState(SAFE_STATE_RESET);
Store_FaultCode(FAULT_WDT_TIMEOUT);
}
/* 正常情况,更新喂狗时间 */
last_feed_time = current_time;
}
/* 主循环中调用 */
void Main_Loop(void)
{
while(1)
{
/* 执行安全关键功能 */
Process_Safety_Functions();
/* 喂狗 - 告诉看门狗我还活着 */
Watchdog_Feed();
/* 执行非安全功能 */
Process_NonSafety_Functions();
}
}
注意:看门狗不能放在中断服务函数里喂。我曾经见过一个项目,中断正常跑,主循环已经卡死了,看门狗却一直没触发。这就是典型的「假活」现象。
4.5 TSC的验证与确认
TSC开发完了,怎么知道它对不对?我个人习惯做三件事:
- 评审:拉着系统、硬件、软件、测试一起过TSC文档。每个人从自己的角度挑毛病。
- 仿真:对关键安全机制做早期仿真验证。比如故障注入仿真,看看安全机制能不能正确响应。
- 追溯:确保每个安全目标都有对应的TSC需求,每个TSC需求都有对应的安全机制。不能有「孤儿需求」。
嗯,这里要强调一下。TSC不是一次性的工作。随着设计深入,你会发现有些假设不成立,有些机制实现不了。这时候就要迭代更新TSC。我见过最夸张的项目,TSC文档改了12版。但这是好事,说明团队在认真对待安全。
4.6 避坑指南
最后,分享几个我踩过的坑:
- 坑一:过度设计。ASIL B的系统非要上ASIL D的冗余架构,成本翻倍,收益甚微。安全设计要「恰到好处」。
- 坑二:忽略共因失效。两个冗余通道用了同一款芯片、同一个电源、同一版软件。一个电磁干扰打过来,两个通道一起挂。冗余了个寂寞。
- 坑三:安全机制本身不安全。我曾经见过一个设计,安全机制本身没有做诊断。结果安全机制坏了,系统还认为自己是安全的。这叫「安全机制的潜伏故障」。
好了,TSC这部分就聊到这里。记住一句话:技术安全概念不是文档,是设计。它决定了你的产品到底安不安全。