Freedom from Interference(FFI)— 共存元素互不污染的工程实现
本质与导读
本质:多个不同 ASIL 的软件 / 任务跑在同一颗 MCU 上时,低 ASIL(QM/B)绝不能污染高 ASIL(D);否则系统级 ASIL 退到最低。ISO 26262-9 Clause 6(Coexistence)+ ISO 26262-6 Clause 7.4 + Annex D 给出 4 个独立维度 — 内存 / 时间 / 通信 / 资源 — 每维都要单独证明已隔离。FFI 不只是"加个 MPU"——MPU 只管 CPU 一侧的内存,DMA 要靠 DAM,时间靠 OS 切片 + WD,通信靠 E2E,资源靠静态分配。DFA 是 FFI 的验证手段,逐项穷举共享资源 + 给隔离证据。
1. FFI 4 个独立维度
ISO 26262-9 Clause 6(Coexistence)规定了 FFI 的核心要求,ISO 26262-6 Clause 7.4 + Annex D 给出软件实现指南,合计定义了 4 个必须全部满足的隔离维度。任一维度失守,共存就破坏,系统 ASIL 退到共存元素的最低等级。
| 维度 | 主要威胁 | 硬件机制 | 软件机制 | DC |
|---|---|---|---|---|
| ① 内存 | QM 写到 ASIL D 区 | MPU + DAM | OS 加载 region 表 | ≥ 99 % |
| ② 时间 | QM 占住 CPU | CPU WD + 外部 WD | OS 固定时间片 | ≥ 99 % |
| ③ 通信 | QM 篡改消息 | 独立总线 / chip-select | E2E CRC + Counter + DataID | 中-高 |
| ④ 资源 | QM 抢共享 ADC/DMA | 静态分配 | OS Resource Manager | 高 |
Part 9 Clause 6 核心规则:"In the absence of evidence of FFI, ALL elements must be developed to the highest ASIL of any element involved." 翻译:没法证 FFI = 全部按最高 ASIL 开发——FFI 论证就是省钱省工作量。
2. 内存分区 — MPU + DAM 双层
内存是最容易出 FFI 故障的维度,因为指针越界 bug 几乎无处不在。隔离要分地址段分配 + 硬件 ACL 两步:
2.1 Flash / RAM 物理段
把整个地址空间按 ASIL 分段:
- Flash:Safety OS → ASIL D → ASIL B → QM → 共享代码
- RAM:OS Stack / Heap → ASIL D 数据 → ASIL B 数据 → QM 数据 → 共享只读
每个 .c 文件用 __attribute__((section(".asil_d"))) 标段属性,Linker script(.ld)把 .asil_d 段映射到 0x80100000-0x80400000。运行时 OS 加载 MPU region:R1 = 这段地址 + 只允许 ASIL D task 访问。
常见误用:工程师忘了给 .c 加 section attribute → 默认链接到 QM 区 → ASIL D task 跑到时 MPU Trap → 难调试。代码 review 必查 section attribute 全覆盖。
2.2 MPU + DAM 双层
MPU 只管当前核 CPU 的访问;DMA / HSM / Ethernet master 可以绕过 CPU 直接访问 slave。所以 MPU 不够,必须配 DAM(Distributed Access Manager) 或 NXP 同等的 SMPU。
每个 master × 每个 slave 一份 ACL,启动期 Safety OS 加载。典型规则:
- QM master(QM DMA / Diag DMA)→ 禁访 ASIL D RAM / Flash
- ASIL D master → 可访所有
- HSM master → 仅访密钥区 + secure boot 区
2.3 共享代码的难题
stdlib / memcpy / printf / 数学库等代码所有 task 都用,放哪个段?
答案:共享代码必须按最高 ASIL(D)开发——否则共因失效。或者维护两份独立 lib(QM lib + ASIL D lib),浪费 Flash。多数项目选第一种:把 stdlib 当 ASIL D,工具链厂(TASKING / HighTec / GCC qualified)提供 qualified library。
3. 时间分区 — OS 切片 + 多层 WD
时间分区保证 ASIL D task 不被 QM 长循环挤掉 deadline。
典型 10 ms 主周期的 budget 分配:
| Slot | task | budget | 备注 |
|---|---|---|---|
| 0-0.5 ms | OS tick | 0.5 ms | schedule + WD refresh |
| 0.5-3 ms | ASIL D 控制律 | 2.5 ms | FOC + Torque Safety |
| 3-5 ms | ASIL B 监视 | 2 ms | Sensor fusion |
| 5-6 ms | STL | 1 ms | CPU 自检切片 |
| 6-8.5 ms | QM 任务 | 2.5 ms | UART / Diag / Comfort |
| 8.5-10 ms | OS Idle | 1.5 ms | WD refresh + hook |
3.1 四层时间防护
时间隔离不能靠单一机制,4 层叠加才能覆盖从 OS bug 到芯片死锁的全谱故障——每层 DC 不同,谁失效都有下一层兜底:
- OS 时间片 — 每 task 启动时启动 budget timer,超时 → OS 强制 preemption;DC 高
- CPU 内部 Watchdog — 每 OS tick 必 refresh;missing → SMU alarm → Reset;DC 中
- 外部 WD via SBC — Q&A 协议,独立硬件;DC ≥ 99 %(MCU 整体死锁的最后防线)
- Hardware Timer 监控 — 关键 task deadline 监视(可选)
关键观察:CPU 内部 WD 在 OS 自身 bug 时失效(WD 由 OS refresh);所以外部 SBC WD 是 ASIL D 必选。SBC Q&A WD 由 SBC 出题 / MCU 答题,MCU 死掉就答不出来。
3.2 误用案例
场景:QM Diag task 有死循环 bug。
| 设计 | 后果 |
|---|---|
| 无时间分区(协作调度) | QM 占 CPU 10 ms+,ASIL D miss deadline,电机 torque 输出 stale → 违 Safety Goal |
| 有时间分区(OS preempt) | QM budget 2.5 ms 到期,OS 切到 D task,D 按时跑完;QM 死循环被隔离 |
4. 通信分区 — 物理 + 逻辑双重
通信 FFI 涉及总线 / SPI / 内部 IPC 多类通道,核心目标:QM 消息不能干扰 ASIL D 消息。
物理隔离:
- 双 CAN-FD(主线 + 安全线)
- SPI 各 chip-select 独立
- Ethernet TSN 时间槽预留(IEEE 802.1Qbv)
逻辑隔离:
- E2E(End-to-End Protection)— CRC + Counter + DataID + Timeout,详见 topic-can-e2e-secoc
- SecOC(Secure Onboard Communication)— HMAC 防伪造,需 HSM 密钥
- Mailbox 限速 — QM ECU 高频发包不能挤占 ASIL D ID
5. 资源分区 — 静态分配优先
CPU 内的 ADC / Timer / DMA / Peripheral 也是共享资源。FFI 准则:静态分配,不许动态争抢。
| 资源 | 分配策略 |
|---|---|
| ADC 通道 | ASIL D 专用 ADC0;ASIL B 用 ADC1;QM 用 ADC2 |
| PWM Timer | ASIL D 占 GTM ATOM0;QM 占 ATOM1 |
| DMA 通道 | ASIL D 独占 DMA 0/1;QM 用 DMA 2/3 |
| ADC trigger | ASIL D trigger 不接受软件触发 |
Safety OS 启动时锁死分配;运行期拒绝所有 dynamic resource request。
6. DFA 共享资源穷举
DFA(Dependent Failure Analysis)是 FFI 的验证工具,逐项穷举共享资源 + 在 4 维证明已隔离。这是 ASIL B 以上强制工作产品(Part 9-7)。
DFA 必查的共享资源 6 类:
| 类别 | 共因风险 | 隔离手段 |
|---|---|---|
| 电源(12 V) | 一停全停 | 双独立电池 + isolation |
| 时钟(PLL) | PLL 故障全时序乱 | 外部参考 + backup OSC + LoL 监视 |
| 通信总线 | QM 错挂占 | 双 CAN-FD + ID 优先级 + Mailbox 限速 |
| CPU Cache | Cache 污染 | Cache way partitioning,或 D 跑专核 |
| DMA / 总线 master | 绕过 CPU MPU | DAM ACL |
| Library | 软件共因 | 共享 lib 按 ASIL D 开发 |
DFA 报告包含:共享资源清单 + 4 维隔离证据 + 残余风险评估 + 评估员可独立验证的引用。
7. FFI vs ASIL Decomposition
容易混淆的两件事——同样涉及"分两路"。
| 维度 | Freedom from Interference | ASIL Decomposition |
|---|---|---|
| 目的 | 多个 ASIL 元素 共存 | 把一个高 ASIL 拆给两个低 ASIL 分担 |
| 必须独立? | 必须(4 维全) | 必须(两路独立 + DFA) |
| 产物 | 共存论证 | ASIL 降级合规 + 两路 SR |
| 典型 | 一颗 MCU 跑 D + B + QM | EPS Safety:D = B + B 两路监视 |
| Part 章节 | 9-6 + Annex E | 9-5 + Annex D |
两件事可以同时做:EPS Safety D = B + B 分解,两路 B 跑在同一 MCU 不同核 → 还要 FFI 论证它们之间 4 维隔离。
8. Safety OS 是 FFI 的底座
FFI 几乎所有软件机制都靠 Safety OS 实现:OS 加载 MPU、OS 时间片、OS Resource Manager、OS 启动 DAM ACL。所以 Safety OS 自身必须 ASIL D 开发——它是 trust base。
主流 Safety OS:
- Vector MICROSAR Safety(AUTOSAR Classic ASIL D)— 车规事实标准
- ETAS RTA-OS Safety(AUTOSAR Classic ASIL D)
- AUTOSAR Adaptive(R23-11+,Linux/QNX 上,ASIL B 类)
- PikeOS / SAFERTOS / SafeRTOS(独立厂商,Hypervisor)
- OSEK Safety(早期标准,渐被 AUTOSAR 替代)
Safety OS 通常带:SEooC 证书 + Safety Manual + Fault Injection 报告 — 客户可以引用,不必自己证明 ASIL D。
9. TC397 AURIX EPS 主驱端到端 FFI Worked Design
TC397 三核 EPS(Electric Power Steering)ASIL D 系统:CPU0 = AUTOSAR OS FS partition(ASIL D)/ CPU1 = Monitor(ASIL D)/ CPU2 = FOC/SVPWM 控制律(ASIL B);SBC = TLE9263-3QX Q&A watchdog。目标:证明 CPU2(ASIL B)共存合法,无需升 D 开发。
9.1 MPU Region 配置(ISO 26262-6 Clause 7.4 + Annex D)
基于 TC397 硬件 MPU + DAM(分布式访问管理)双层,启动期 Safety OS 加载锁定:
| Region | CPU 所有者 | 地址范围 | 访问权 | 保护目标 |
|---|---|---|---|---|
| R0 | CPU0 | 0xA0000000–0xA0007FFF | CPU0 RW · CPU1 RO · CPU2 无 | CPU0 Safety stack |
| R1 | CPU1 | 0xA0010000–0xA0017FFF | CPU1 RW · CPU0 RO · CPU2 无 | CPU1 Safety stack |
| R2 | CPU2 | 0x70000000–0x70007FFF | CPU2 RW · CPU0/1 RO | CPU2 Control stack |
| R3 | Shared RO | 0x50000000–0x50003FFF | All CPUs RO | 共享只读配置 |
| R4 | CPU0-FS | 0xA0020000–0xA0023FFF | CPU0 RW · CPU1 RO · CPU2 无 | FS partition 数据 |
9.2 DAM ACL 配置(DMA / HSM 绕 CPU 路径)
MPU 只管 CPU 核心侧的访问;DMA / HSM 可绕过 CPU 直接访问内存。DAM(Distributed Access Manager)为每个 master × slave 对配一条 ACL,启动期 Safety OS 写入并锁定:
| DMA Master | 允访区 | 禁访区 | 目的 |
|---|---|---|---|
| ASIL D DMA(Ch0/Ch1) | 全区 | — | Safety path 数据搬移 |
| QM DMA(Ch2/Ch3) | R3 Shared RO 只读 | 0xA0000000–0xA0027FFF(ASIL D 全段) | 防 QM DMA 污染 D 区 |
| HSM | 密钥区 0xAF100000–0xAF107FFF | 其余 | 密钥隔离 |
9.3 四维 FFI 论证汇总
四维必须全部闭合,缺少任何一维都不能申报共存合法。下表列出本架构每维的具体机制与对应验收测试:
| 维度 | 机制 | 验证测试编号 |
|---|---|---|
| Memory | MPU R0–R4 + DAM ACL(见 §9.1/9.2) | ITC-FFI-001 / ITC-FFI-004 |
| Time | OS 固定切片(§3 表)+ CPU WD + TLE9263 Q&A WD | ITC-FFI-002 |
| Communication | E2E CRC-8(AUTOSAR Profile 2)+ Counter + DataID | 信号 TX/RX 集成测试 |
| Resource | ADC0 ← CPU0 专用;GTM ATOM0 ← CPU0 PWM;DMA Ch0/1 ← ASIL D | 启动期锁定;OS 拒 dynamic request |
9.4 FFI 故障注入验收用例(HIL)
FFI 不能靠配置文档声明,必须在目标硬件上执行故障注入(ISO 26262-6 Clause 10 集成测试要求)。以下 4 个用例是 TC397 EPS 架构的最小必选集:
| 编号 | 内容 | 预期结果 | 验收依据 |
|---|---|---|---|
| ITC-FFI-001 | CPU2 向 R0(CPU0 Safety stack 0xA0000000)非法写 | MPU trap → CPU2 ShutdownOS;CPU0/CPU1 继续 250 ms | HIL 实测时间戳 |
| ITC-FFI-002 | CPU0 partition 超出 OS time budget(2.5 ms) | WdgM 报 task deadline violation → SSM 在 5 ms 内降级 | HIL 时序记录 |
| ITC-FFI-003 | CPU1 向 R3(Shared RO 0x50000000)写 | All CPUs MPU trap → ShutdownOS | HIL 实测记录 |
| ITC-FFI-004 | QM DMA(Ch3)写 0xA0001000(R0 内) | DAM SMPU trap → DMA abort;ASIL D 数据完整 | HIL DMA trace |
结论:4 维 FFI 论证闭合,TC397 EPS D+D+B 共存合法,CPU2(ASIL B)免升 D 开发。
10. Gotcha 链(5 条 — 评估员最常砍的)
FFI 的误区集中在"以为做了某一维就完事",忽略 4 维必须并存。下面 5 条是评估员最常砍的。
- 只配 MPU 没配 DAM。DMA bug 仍能写到 ASIL D 区。每次 review 必查 DAM ACL。
- 共享 lib 没按 ASIL D 开发。printf bug 影响 ASIL D task = 软件共因。
- 时间分区只靠 RTOS 优先级。优先级反转或 priority ceiling 误用,QM 仍能挤掉 D。必须有 OS 强制 budget timer。
- DFA 表只列硬件资源,忘了软件。Library / OS service / Trap handler 也是共享资源,必须分析。
- FFI 论证只给一份"原则上隔离"声明。评估员要看每个共享资源逐项的证据,不接受 boilerplate。
11. Corner 分析(3 条)
FFI 在特殊架构或项目决策下会产生非直觉的结果。
Corner 1 — 无 MPU 的旧 MCU:强制全站 ASIL D
当 MCU 不具备硬件 MPU(如某些 8-bit / 16-bit 或早期 CAN 节点 MCU),无法实现 Memory 维度隔离。ISO 26262-9 Clause 6 推论直接生效:所有共存元件必须按最高 ASIL 开发。结果:QM 的 logger / 诊断 task 也须走 ASIL D 的 MC/DC + 代码 review + FMEA → 工程量爆炸,通常不可接受。现代汽车 ASIL D 项目必须选配硬件 MPU + DAM 的 MCU;无 MPU 器件只适合 QM / ASIL A-B 单 ASIL 域。
Corner 2 — 多核 SoC 共享 L2/L3 Cache(Cortex-A 系 ADAS SoC)
TC397 每个 CPU 拥有独立 DSPR / PSPR,无共享 L2 cache 问题。但 ARM Cortex-A 系 SoC(如 Renesas R-Car H3 用于 ADAS)有共享 L2/L3 cache:QM Core 高频访存 → L2 填满 → 共享 cache line eviction → ASIL D Core 热 cache 被逐出 → 执行时间抖动达 10–20%,Time 维度 FFI 破坏。对策:① Cache 路分区(Hypervisor cache-coloring,各 VM 分配独立 L2 way)② ASIL D 用 TCM 替代 L2(代价大)③ 时间分区 + WCET 按 cache-miss 最坏情况保守估计。未经 cache-coloring 的高端 SoC FFI 论证不完整,审计员会索要 WCET 分析报告。
Corner 3 — 后期把共享 lib 从 ASIL D 降级:重走安全案例
若项目后期出于成本削减把 stdlib 从 ASIL D 降至 ASIL B,则所有使用 stdlib 的 ASIL D task 共享了 ASIL B 资源 → Resource 维度 FFI 破坏 → 必须重写 DFA + 重评估所有 ASIL D task → 通常等价于重做安全案例。stdlib 的 ASIL 等级是前期架构决策,后期降级代价极高;项目启动时就决定"ASIL D qualified lib vs 双 lib(D lib / QM lib)维护策略",并进安全计划记录。
核心要点
- FFI 4 维:Memory / Time / Communication / Resource,必须全部隔离。
- 没 FFI 证 = 全按最高 ASIL 开发(Part 9 Clause 6 强制规则)。
- MPU + DAM 双层:MPU 管 CPU,DAM 管 DMA/HSM/Ethernet master。
- 时间分区靠 OS 切片:OS budget timer + CPU WD + 外部 SBC WD 三层。
- 通信靠 E2E + SecOC:CRC/Counter/DataID + HMAC(可选)。
- 资源静态分配,不允许 dynamic request。
- DFA 是 FFI 验证工具——逐项穷举共享资源 + 给证据。
- 共享 lib 按 ASIL D 开发,或维护两份独立 lib。
- Safety OS 是 FFI 的 trust base,自身必须 ASIL D + SEooC。
- FFI ≠ ASIL Decomposition:前者共存,后者分担;两者可同时做。
- TC397 EPS 案例:MPU R0–R4 + DAM ACL 四维全覆盖 → CPU2(ASIL B)共存合法,免升 D 开发。
Cross-references
- ← 索引
- topic-functional-safety — 功能安全 hub
- topic-iso26262-part9-asil-analyses — DFA + FFI 母章
- Hypervisor/混合关键度整合深度 — 本页讲单核/单 OS FFI,它讲多核 SoC + hypervisor 多 VM 的 FFI(干扰通道/多核 WCET/资质)
- topic-asil-decomposition — Decomposition(对比 FFI)
- topic-aurix-tc3xx-asil-d — MPU + DAM 硬件实现
- topic-mpc5744-mc33907-integration — NXP MPU + SMPU
- topic-can-e2e-secoc — 通信分区机制
- topic-stl-bist-runtime-selftest — STL 占用 time slice
- topic-safety-mechanism-catalog — 机制大全
- topic-software-safety — Safety OS 与软件流程