4、嵌入式软件架构与IEC 62304:软件安全等级分类,从需求到编码的V模型开发流程,单元测试与集成测试策略

好,咱们进入第四章。这一章我打算聊聊嵌入式软件架构和IEC 62304。说实话,很多工程师一听到「软件安全等级」这几个字就头大。我刚开始接触这个标准时也一样,觉得不就是写个理疗仪的控制程序嘛,至于搞得这么复杂?

但后来我吃过亏。有一次项目都快注册了,审核老师问了一句:「你们这个软件安全等级是怎么定的?」我当时就愣住了。嗯,从那以后,我再也不敢轻视这个环节了。

4.1 软件安全等级分类:别小看这个A/B/C

IEC 62304把软件安全等级分成三类:A级、B级、C级。说白了,就是根据软件失效后对患者和操作者造成的伤害程度来划分。

安全等级 伤害程度 典型场景
A级 无伤害或轻微不适 理疗仪的计时显示、历史记录查询
B级 可能导致非永久性伤害 治疗强度控制、温度限制保护
C级 可能导致死亡或严重伤害 心脏除颤器的能量释放控制

我个人习惯的做法是:先做风险分析,再定等级。你想想看,一个理疗仪如果输出功率失控了,最坏情况是什么?烫伤?那可能就是B级。但如果这个理疗仪是用于术后伤口愈合的,功率失控可能导致组织坏死,那就得往C级靠了。

注意: 同一个设备的不同软件模块,安全等级可以不同。比如理疗仪的UI显示模块可能是A级,但功率控制模块可能是B级甚至C级。千万别一刀切。

4.2 V模型开发流程:从需求到编码,一步都不能少

IEC 62304推荐的是V模型开发流程。为什么是V?因为左边是需求往下分解,右边是测试往上验证,中间有个交点——编码。我见过很多团队,需求写得很漂亮,代码也写得飞起,但中间缺了设计文档。结果审核时被开了不符合项。

V模型的核心步骤,我给大家梳理一下:

  1. 软件需求分析:把系统需求拆成软件能做的事。比如「设备能在5秒内响应按键」→ 软件需求就是「按键中断响应时间≤5ms」。
  2. 软件架构设计:画模块图、定接口、分任务。我习惯用分层架构,把硬件抽象层、应用层、安全监控层分开。
  3. 软件详细设计:每个模块怎么实现?数据结构、状态机、算法流程图。这一步很多人偷懒,但我建议至少把关键模块的伪代码写出来。
  4. 编码:写代码。注意编码规范、注释、静态分析。
  5. 单元测试:测每个函数、每个模块。后面细说。
  6. 集成测试:把模块拼起来测。看看接口通不通,数据传得对不对。
  7. 系统测试:整机跑起来,模拟真实使用场景。

我曾经在一个项目中,因为赶进度跳过了详细设计阶段,直接写代码。结果到了集成测试时,发现两个模块的接口对不上,改代码改得我怀疑人生。所以,V模型的每一步,真的不是走形式。

4.3 单元测试策略:别让Bug藏到集成阶段

单元测试,说白了就是测最小的代码单元——通常是一个函数或一个模块。我见过很多嵌入式工程师觉得单元测试浪费时间,觉得「我代码写得这么好,不用测」。但现实是,越早发现Bug,修复成本越低。

我的单元测试策略有三条:

  • 覆盖率要达标:对于B级和C级软件,语句覆盖率、分支覆盖率、MC/DC覆盖率都有明确要求。我一般用工具跑一下,比如gcov、Tessy。
  • 边界值要测:比如温度控制函数,输入范围是0-100℃,那0、100、-1、101这些边界值必须测。我遇到过因为边界值没测,导致设备在低温环境下误报警的案例。
  • 桩函数要写好:嵌入式软件依赖硬件,比如ADC读取、GPIO控制。单元测试时得用桩函数模拟硬件行为。我习惯把桩函数写得简单一点,只返回预设值,不搞复杂逻辑。
举个例子: 假设你有一个函数 uint8_t GetTemperature(void),它调用硬件驱动读取温度传感器。单元测试时,你得写一个桩函数,让它返回25℃、100℃、0℃等不同值,来验证上层逻辑是否正确。

4.4 集成测试策略:把模块拼起来,看看能不能跑通

单元测试通过后,就该集成测试了。集成测试的目的是验证模块之间的交互是否正确。我常用的策略有两种:

  • 大爆炸集成:所有模块一次性拼起来测。优点是快,缺点是一出问题很难定位。我建议小项目可以用,但大项目别这么干。
  • 增量集成:从底层模块开始,一个一个往上加。比如先测硬件抽象层,再测驱动层,再测应用层。这样出了问题,范围很小,容易定位。

我个人更倾向于增量集成。尤其是理疗仪这种有安全关键功能的设备,你想想看,如果功率控制模块和温度监控模块的接口没对齐,导致温度超限了还没触发保护,那后果不堪设想。

小技巧: 集成测试时,我习惯写一个「冒烟测试」脚本。每次集成一个新模块,先跑一遍冒烟测试,看看基本功能是否正常。如果冒烟都过不了,就别往下测了,先修Bug。

4.5 避坑指南:我踩过的那些坑

最后,分享几个我亲身踩过的坑,希望能帮大家少走弯路。

  • 坑一:安全等级定得太低。我曾经把一个理疗仪的功率控制模块定为B级,结果审核老师认为可能造成组织损伤,要求升级到C级。这一改,文档、测试、验证全得重来,项目延期了两个月。
  • 坑二:单元测试只测正常路径。很多工程师只测「输入合法值,输出正确结果」这种happy path。但异常路径才是Bug的高发区。比如内存分配失败、传感器通信超时,这些都得测。
  • 坑三:集成测试忽略了时序问题。嵌入式软件是实时系统,模块之间的时序关系很重要。我遇到过两个模块共享一个I2C总线,但没做互斥,结果数据错乱。集成测试时一定要加压力测试,模拟高负载场景。

好了,这一章的内容就到这里。总结一下:软件安全等级分类是基础,V模型是框架,单元测试和集成测试是保障。下一章我会聊聊具体的编码规范和静态分析工具,到时候再给大家分享一些实战技巧。