3. 功能安全软件架构设计原则

功能安全软件架构不是把安全机制“堆”到应用层,而是要在软件结构上建立可验证的隔离、可追溯的机制部署和可预测的失效响应。对AURIX TC3xx这类多核锁步MCU而言,架构设计的核心问题是:哪些安全机制由硬件提供、哪些由基础软件封装、哪些由应用层实现,以及它们如何通过分层与分区形成“免于干扰”的边界。本节围绕四条原则展开:安全架构分层、安全机制部署、免于干扰、安全状态与降级策略,并给出在AURIX上的映射方法。

一、安全架构分层:从硬件到应用的四层结构

推荐将AURIX功能安全软件划分为四层。第一层是硬件安全层,包括锁步核、ECC、SMU、安全管理单元、时钟与电压监控等,它们由芯片直接提供,软件只能通过寄存器读取状态、通过SMU报警响应。第二层是安全基础软件层,通常由MC-ISAR Safety Library、SafeTlib或自研安全库构成,负责对硬件机制进行初始化、周期自检和结果封装,向上提供统一的“安全机制状态”接口。第三层是安全服务层,实现端到端保护(E2E)、内存分区保护、程序流监控、安全状态机与降级仲裁。第四层是应用安全层,承载具体功能的安全目标,例如扭矩监控、电机位置合理性判断、制动请求校验等。

分层的意义在于:越靠近硬件的层,机制越通用、越可复用;越靠近应用的层,机制越贴近具体功能的安全目标。分层还决定了故障传播路径——底层检测到的故障应通过统一接口上报,而不是让每个应用模块各自去读SMU寄存器。

AURIX 功能安全软件四层架构与故障传播路径 应用安全层 扭矩安全监控 位置合理性判断 制动请求校验 安全目标映射与仲裁 承载具体功能安全目标,调用下层安全服务 安全服务层 E2E 端到端保护 内存分区保护 程序流监控 安全状态机 / 降级仲裁 统一安全机制接口,隔离应用与硬件细节 安全基础软件层 MC-ISAR Safety SafeTlib 自检 SMU 报警处理 时钟/电压监控封装 初始化、周期自检、状态封装,向上提供统一接口 硬件安全层 Lockstep 锁步核 Flash/RAM ECC SMU 安全管理单元 时钟/电压/温度监控 芯片级安全机制,软件通过寄存器与报警响应 故障上报路径 分层原则:越靠近硬件越通用、越可复用;越靠近应用越贴近具体安全目标。 故障传播:硬件报警 → 基础软件封装 → 安全服务仲裁 → 应用层执行降级,禁止跨层直连。

二、安全机制部署:按诊断覆盖率与失效模式分配

安全机制部署不是“越多越好”,而是按失效模式与诊断覆盖率(DC)分配。以AURIX TC3xx为例,CPU锁步核覆盖CPU内部逻辑故障,DC可达99%以上;Flash ECC覆盖存储单元位翻转,单比特纠正、双比特报警;RAM ECC覆盖数据存储;SMU负责汇聚报警并触发反应。软件侧需要补充的是:硬件机制无法覆盖的“共因失效”和“时序相关失效”,例如双核同源时钟故障、任务超时、数据流被篡改。

部署时建议建立一张“失效模式—机制—层级—响应”映射表。例如:CPU寄存器位翻转由锁步核覆盖,响应为SMU报警;任务执行超时由看门狗或程序流监控覆盖,响应为任务级降级;CAN报文被篡改由E2E保护覆盖,响应为丢弃报文并进入安全状态。每个机制必须明确:检测对象、检测周期、诊断覆盖率假设、响应动作、响应时间。缺少任何一项,机制就无法在安全论证中闭环。

三、免于干扰:空间隔离、时间隔离与通信隔离

免于干扰(Freedom From Interference, FFI)是混合临界系统的基本要求。在AURIX上,FFI通过三种隔离实现。空间隔离依赖MPU(内存保护单元)和SMU的访问权限配置,将安全相关任务与非安全任务的代码、数据、外设寄存器划分到不同地址区间,禁止跨区写访问。时间隔离依赖OS调度和看门狗,确保安全任务在预算时间内获得CPU,非安全任务不能长期占用核或阻塞中断。通信隔离依赖E2E保护和分区内的数据校验,防止非安全分区篡改安全数据。

实际配置中,通常将安全任务绑定到CPU0,非安全任务绑定到CPU1/CPU2,通过MPU设置CPU0的代码区为只读、数据区为安全区,非安全核只能读取安全核发布的只读结果,不能写入。若发生越权访问,MPU触发异常,由安全服务层捕获并进入降级。FFI的验证方法是:构造非安全任务故意写安全区、故意长时间占用CPU、故意发送错误报文,观察安全机制是否按预期触发。

四、安全状态与降级策略:从报警到可控失效

安全状态不是单一状态,而是一组按严重度排列的降级等级。常见划分是:正常(Normal)、受限(Degraded)、安全停止(Safe Stop)、紧急关闭(Emergency Shutdown)。触发条件来自SMU报警等级、E2E校验失败次数、任务超时次数等。降级策略必须定义“进入条件、保持时间、恢复条件、恢复权限”。例如,单次E2E校验失败可记录并继续运行;连续3次失败则进入受限模式,限制扭矩输出;若SMU报出锁步核比较错误,则直接进入安全停止。

降级过程中要避免“降级本身引入新风险”。例如,关闭输出前必须确认执行器处于安全位置;进入安全停止后,通信仍需保持,以便诊断和恢复。恢复不能自动进行,必须经过明确的自检通过和条件满足,防止故障未排除就重新使能。

五、AURIX上的架构映射方法

将上述原则映射到AURIX,可按以下步骤落地。第一步,确定安全相关核与非安全核的分配,通常CPU0作为安全核,CPU1/CPU2作为非安全核或安全协处理核。第二步,配置MPU区域:安全核代码区只读、安全数据区仅安全核可写、非安全区禁止安全核写入。第三步,配置SMU报警路由:将锁步错误、ECC双比特错误、时钟丢失等报警映射到安全服务层的报警处理函数,并设置报警等级。第四步,部署SafeTlib或MC-ISAR Safety,完成启动自检、周期自检和SMU报警处理。第五步,在安全服务层实现安全状态机,将报警等级映射为降级动作。第六步,在应用层实现E2E保护和功能级监控,并通过接口向安全状态机上报。

映射完成后,需要用故障注入验证:通过SMU强制触发报警、通过MPU构造越权访问、通过E2E注入错误报文,观察系统是否按设计进入对应降级状态,并记录响应时间。只有验证通过的映射,才能作为安全论证的证据。

架构设计的一个实用检查点:任何一条故障传播路径,都应能在图中从硬件报警一路追溯到应用层降级动作,中间不允许出现“断头路”。若某层只上报不处理,或只处理不上报,都说明架构映射不完整。