4. 软件架构安全分析(FTA)
任务定义
在ISO 26262功能安全开发中,系统级安全需求(Safety Requirements)确定后,需将其分解为面向软件架构设计的技术安全需求(Technical Safety Requirements, TSR)。本案例目标:针对一个电机转速控制单元,将系统级安全需求“防止电机超速”分解为可验证的软件技术安全需求,并建立需求与ASIL等级的追溯关系。
输入:系统级安全需求
系统安全需求SSR-001:当电机转速超过额定值3500 RPM时,系统必须在100 ms内将电机转矩降至0,且不发生硬件损坏。ASIL等级:ASIL C。
技术安全需求分解
软件无法直接“降低转矩”,但可通过监控转速、控制逆变器输出、执行故障响应来实现。分解后的TSR如下表所示,每个TSR均包含可验证的触发条件、响应动作和时间约束。
| TSR ID | 需求内容 | ASIL | 关联SSR |
|---|---|---|---|
| TSR-001 | 软件每10 ms采样一次电机转速,转速值来自速度传感器接口。 | C | SSR-001 |
| TSR-002 | 当检测到转速≥3500 RPM时,在10 ms内将目标转矩指令置为0。 | C | SSR-001 |
| TSR-003 | 转速≥3500 RPM状态持续超过50 ms时,触发故障标志位并锁定转矩输出为0,直到收到复位命令。 | C | SSR-001 |
| TSR-004 | 转速传感器信号无效(超范围或通信超时)时,按TSR-003的锁定逻辑处理。 | C | SSR-001 |
软件实现(C代码)
以下代码实现TSR-001至TSR-004的核心监控与响应逻辑。代码包含转速采样、超速判断、故障锁定与复位功能,可直接编译运行于PC环境进行逻辑验证。
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#define SPEED_THRESHOLD_RPM 3500
#define SAMPLE_PERIOD_MS 10
#define FAULT_LOCK_MS 50
#define SPEED_SENSOR_MAX_RPM 5000
#define SPEED_SENSOR_MIN_RPM 0
/* 模拟转速传感器读取 */
static uint16_t mock_speed_rpm = 0;
static bool mock_sensor_valid = true;
/* 软件状态 */
static uint16_t current_speed_rpm = 0;
static bool target_torque_zero = false;
static bool fault_locked = false;
static uint16_t overspeed_count_ms = 0;
/* 传感器接口:返回当前转速和有效性 */
static void read_speed_sensor(uint16_t *speed_rpm, bool *valid) {
*speed_rpm = mock_speed_rpm;
*valid = mock_sensor_valid;
}
/* 10ms周期任务:TSR-001采样 + TSR-002/003/004响应 */
void speed_monitor_10ms_task(void) {
bool sensor_valid = false;
uint16_t raw_speed = 0;
/* TSR-001: 采样转速 */
read_speed_sensor(&raw_speed, &sensor_valid);
/* TSR-004: 传感器无效处理 */
if (!sensor_valid || raw_speed > SPEED_SENSOR_MAX_RPM || raw_speed < SPEED_SENSOR_MIN_RPM) {
fault_locked = true;
target_torque_zero = true;
overspeed_count_ms = 0;
current_speed_rpm = 0;
return;
}
current_speed_rpm = raw_speed;
/* TSR-002: 超速立即清零转矩 */
if (current_speed_rpm >= SPEED_THRESHOLD_RPM) {
target_torque_zero = true;
overspeed_count_ms += SAMPLE_PERIOD_MS;
} else {
/* 未超速时,若未锁定则恢复转矩控制 */
if (!fault_locked) {
target_torque_zero = false;
}
overspeed_count_ms = 0;
}
/* TSR-003: 超速持续50ms进入锁定 */
if (overspeed_count_ms >= FAULT_LOCK_MS) {
fault_locked = true;
target_torque_zero = true;
}
}
/* 复位命令:解除锁定 */
void reset_fault(void) {
fault_locked = false;
target_torque_zero = false;
overspeed_count_ms = 0;
}
/* 获取当前转矩指令状态(0=允许输出,1=强制为0) */
bool is_torque_zero(void) {
return target_torque_zero;
}
bool is_fault_locked(void) {
return fault_locked;
}
/* 测试用例 */
int main(void) {
printf("=== TSR 验证开始 ===\n");
/* 场景1: 正常转速 2000 RPM */
mock_speed_rpm = 2000;
mock_sensor_valid = true;
speed_monitor_10ms_task();
printf("场景1(2000RPM): torque_zero=%d, locked=%d (期望0,0)\n",
is_torque_zero(), is_fault_locked());
/* 场景2: 超速 3600 RPM 第一次采样 */
mock_speed_rpm = 3600;
speed_monitor_10ms_task();
printf("场景2(3600RPM第1次): torque_zero=%d, locked=%d (期望1,0)\n",
is_torque_zero(), is_fault_locked());
/* 场景3: 持续超速 50ms后(第5次调用) */
for (int i = 0; i < 4; i++) {
speed_monitor_10ms_task();
}
printf("场景3(3600RPM持续50ms): torque_zero=%d, locked=%d (期望1,1)\n",
is_torque_zero(), is_fault_locked());
/* 场景4: 复位后转速恢复正常 */
reset_fault();
mock_speed_rpm = 2000;
speed_monitor_10ms_task();
printf("场景4(复位后2000RPM): torque_zero=%d, locked=%d (期望0,0)\n",
is_torque_zero(), is_fault_locked());
/* 场景5: 传感器无效 */
mock_sensor_valid = false;
speed_monitor_10ms_task();
printf("场景5(传感器无效): torque_zero=%d, locked=%d (期望1,1)\n",
is_torque_zero(), is_fault_locked());
return 0;
}
SVG:TSR状态机与响应时序
编译与验证方法
编译:使用gcc编译并运行:gcc -o tsr_test tsr_test.c && ./tsr_test
判定标准:程序输出与各场景括号中的期望值一致,即:场景1输出(0,0),场景2输出(1,0),场景3输出(1,1),场景4输出(0,0),场景5输出(1,1)。满足上述条件则判定TSR-001至TSR-004逻辑实现正确。
ASIL追溯:每个TSR均标注ASIL C,与SSR-001保持一致。代码中通过fault_locked实现故障锁定,满足TSR-003/004的“锁定直到复位”要求。