为什么仿真环境更适合做故障注入
在航空航天、轨道交通、汽车电子、通信设备等安全关键场景当中,嵌入式系统往往承担着设备感知、控制、通信和决策等关键任务。嵌入式系统需要软件和硬件配合工作,因此其可靠性测试相比传统纯软件系统难度更大:既要与底层硬件紧密配合,又要满足实时响应和长期稳定运行的要求。
相比传统软件,嵌入式系统的测试难点在于软硬件协同环境下的异常行为是否可控。模块失效、接口异常、数据错误、寄存器异常、存储故障等问题,往往难以在常规测试中充分暴露,却可能在真实运行中引发连锁影响。
故障注入技术正是面向这一问题提出的主动验证技术。它通过在受控条件下向系统植入特定异常,模拟真实运行中可能出现的软件错误或硬件故障,从而观察系统是否具备及时检测、隔离影响、恢复运行或进入安全状态的能力。换言之,故障注入旨在提前验证系统韧性。
但在实际工程中,传统故障注入测试往往高度依赖人工经验。测试人员不仅要理解产品硬件架构、软件逻辑和底层接口,还需要根据不同硬件型号设计不同的注入方式,测试流程难以标准化复制。随着嵌入式系统复杂度不断提升,这种人工驱动的测试模式逐渐暴露出成本高、效率低、复用性差等问题,也推动故障注入从单点测试走向自动化、平台化和体系化验证。
01
典型嵌入式系统故障模式识别和分析
要让故障注入真正从经验性测试走向工程化验证,首先需要回答“应当注入哪些故障”这一问题,因此构建典型故障模式库成为嵌入式软件可靠性测试的基础环节。
故障模式的识别通常可以从两条路径展开:
(1) 基于历史故障数据进行系统性挖掘,通过结构化采集既有项目中的软硬件故障、接口异常、运行失效和系统响应问题,并结合故障树分析(FTA,Fault Tree Analysis)等方法,提炼出具有共性和复用价值的嵌入式系统故障模式,为新产品设计和测试提供风险预警;
(2) 通过正向失效模式与影响分析(FMEA,Failure Mode and Effects Analysis)开展主动识别,参考相关标准,从功能分析、失效推导、风险评估等环节出发,系统梳理可能出现的潜在失效模式,提前发现关键风险点。
在此基础上,需要对典型故障模式的影响范围、危害程度和严酷度等级进行评估,将其划分为输入类故障、输出类故障和程序处理类故障等类型,例如数据异常触发、信号失真、逻辑错误等。测试团队可基于故障模式库选择相匹配的软件故障注入方法,设计测试用例,验证系统实际响应是否符合设计预期。
02
基于SkyEye的嵌入式故障注入验证
在故障模式识别与测试用例设计完成后,故障注入还需要依托可控、可复现的执行环境。实际应用中,故障注入方法通常可分为基于原型的故障注入和基于仿真的故障注入两类。
基于原型的故障注入主要面向真实软件或硬件系统,通过对目标设备施加异常条件来观察系统响应,适用于部分模拟故障研究,但在航空、航天、汽车电子等复杂应用场景中,真实硬件成本高、系统结构复杂,部分故障难以安全触发,重复测试和批量验证也受到较多限制。
基于仿真的故障注入通过构建目标系统的数字样机,在虚拟环境中引入故障并分析系统响应,不需要依赖特定硬件设备,也不会对真实系统造成损伤,更适合在研发早期开展容错机制验证和可靠性评估。
天目全数字实时仿真软件SkyEye可为基于仿真的故障注入提供硬件行为级仿真支撑。作为基于可视化建模的全数字实时仿真平台,SkyEye能够模拟处理器、内存、设备寄存器、总线及外设等关键硬件对象,帮助用户在PC环境下搭建复杂嵌入式系统的数字样机,并在此基础上开展故障注入、软件调试和系统验证。
针对复杂嵌入式软件的可靠性测试需求,SkyEye支持内存故障注入和设备寄存器故障注入,可通过改变内存或设备寄存器中某一位或几位的值来模拟异常状态,从而验证目标软件在底层数据异常、寄存器状态异常等情况下的检测、处理和恢复能力。

▲SkyEye故障注入界面
基于SkyEye所搭建的全数字实时仿真模型,用户可进行以下几种模式的故障注入:
物理层故障模式
物理层故障模式主要包括断路控制、短路控制、信号串扰、噪声信号、串行以及并行阻抗控制等,用于模拟通信总线上常见的线路故障。
SkyEye中,总线设备被设计为独立的模块,并在虚拟目标硬件脚本中创建总线设备并与内存总线连接。断路故障模式通过外部数据激励软件设计总线故障处理模块,可以在总线设备模块中实现与数据激励软件的通信接口,并使用总线故障处理模块向总线设备发送断路命令。设备接收到该命令后,即不会再接收处理任何来自内存总线发送的地址读写请求。
SkyEye的断路故障模拟设计如下所示:

首先通过Python脚本提供的API接口调用上述的内存监视接口,实现内存监视功能,访问该内存时便会执行注册的回调接口来完成相关功能。
可由此实现故障模拟:通过该API接口注册故障模拟回调接口,当设置该内存地址为断开故障时,每当处理器访问至该地址便会在该回调接口中输出故障信息。用户还可调用SkyEye运行控制接口来暂停运行工程。
电气层故障模式
电气层故障模式包括输出幅度调节、占空比调节、信号延迟调节、上升下降沿调节及斜率调节、毛刺模拟等。
真实硬件中电气层故障注入是通过总线信号发生器实现,由高速DAC芯片、SRAM、运算放大器组成。电气层中的输出电压幅度调节可通过DAC和运算放大器实现,输出信号占空比可以通过FPGA控制DAC来实现,输出信号的延迟可以通过采样数据进行缓存来实现。
在SkyEye虚拟仿真环境下,用户可通过配置总线寄存器来修改电平值、边沿时间、占空比等,实现输出电压幅度的调节。
电气层故障注入,包括寄存器故障注入和内存故障注入。

▲寄存器故障注入

▲内存故障注入
协议层故障模式
协议层故障模式包括命令字、数据字、状态字奇偶校验、编码错误以及数据替换等。
协议层故障注入是基于不同的总线协议实现的。通过解析总线传输的数据来判断传输信息的类型以及不同类型所需要做的数据处理,可实现需要进行故障注入的通信协议数据分析。与物理层故障模式相似,也可使用SkyEye提供的数据激励软件注入总线的通信协议数据来实现故障注入。
由此可见,SkyEye所支持的故障注入并不仅限于单一软件异常,而是能够围绕处理器、内存、寄存器、总线、外设和通信协议等关键对象,构建多层次、可控化的异常场景。对于复杂嵌入式系统而言,这种基于数字样机的故障注入方式,有助于在无实物或少实物条件下提前开展可靠性验证,降低真实硬件测试成本,提升异常场景覆盖率,并使故障触发、系统响应、结果记录和问题复现形成更加完整的闭环。随着嵌入式系统复杂度不断提升,故障注入也将从单次专项测试逐步走向平台化、自动化和持续化验证,成为提升安全关键软件可靠性的重要工程手段。