| 主题 |
课程安排 |
| 第1部分.嵌入式软件基础与典型特征(3学时) |
| 嵌入式系统定义与应用领域 |
• 嵌入式系统的定义与技术演进
• 典型应用领域:汽车电子、工业控制、消费电子、医疗设备、航空航天、物联网
• 嵌入式系统组成:硬件平台 + BSP + RTOS/裸机 + 应用层 |
| 嵌入式软件典型特征详解(核心) |
• 软硬件深度耦合:软件逻辑与硬件寄存器、外设时序强绑定
• 资源严格受限:内存(KB~MB级)、CPU算力(MHz级MCU)、存储(Flash/EEPROM)
• 实时性要求:硬实时/软实时区分,中断响应时延、任务调度抖动
• 固化运行:程序烧录至Flash,运行环境固定,升级风险高
• 高可靠性要求:7×24小时无人值守运行,失效代价高
• 功耗约束:电池供电场景下的低功耗运行模式 |
| 嵌入式软件架构 |
• 裸机编程(前后台系统):超级循环 + 中断
• RTOS实时操作系统:FreeRTOS、RT-Thread、VxWorks
• 嵌入式Linux:面向高算力MPU的应用场景 |
| 嵌入式特征对测试的挑战与影响 |
• 软硬件耦合导致测试必须在目标硬件上进行
• 资源受限要求测试关注内存/CPU占用率
• 实时性要求引入时序确定性测试
• 固化运行导致测试环境搭建复杂、自动化难度高 |
| 第2部分.嵌入式软件测试方法论框架(3学时) |
| 嵌入式测试V模型与左移实践 |
• V模型在嵌入式领域的映射:需求→单元→集成→系统→验收
• 测试左移:需求评审、静态分析、MIL/SIL/PIL测试
• 测试右移:灰度发布、远程日志、OTA升级回滚 |
| 嵌入式测试分层策略 |
• 单元测试:基于宿主机的交叉编译测试(Unity/Ceedling框架)
• 集成测试:模块间接口、驱动与协议栈集成
• 系统测试:目标板端到端功能与性能验证
• 硬件在环测试(HIL):dSPACE/NI VeriStand等平台 |
| 嵌入式测试环境搭建 |
• 宿主机(Host)与目标机(Target)分离架构
• 交叉编译工具链(GCC ARM、IAR、Keil)
• 调试接口:JTAG/SWD、串口日志、网络调试
• 测试环境清单与配置管理 |
| 嵌入式测试用例设计要点 |
• 功能测试用例:覆盖正常、异常、边界场景
• 时序相关用例:需明确时间参数与测量方法
• 可靠性用例:长时间运行、压力、故障注入 |
| 第3部分.嵌入式典型专项测试(6学时) |
| 时序测试(Timing Testing) |
• 测试目标:验证任务执行时间、中断响应时延、调度周期是否满足实时性约束
• 关键指标:中断响应时间(Interrupt Latency)、任务切换时间(Context
Switch Time)、最坏执行时间(WCET)、调度抖动(Jitter)
• 测试方法:GPIO翻转+示波器/逻辑分析仪测量、时间戳日志分析法、定时器戳记法(FreeRTOS
trace、Percepio Tracealyzer)
• 典型场景:周期性任务的周期准确性验证、高优先级任务抢占时延、中断嵌套下的最坏响应时间 |
| 中断测试(Interrupt Testing) |
• 测试目标:验证中断处理的正确性、优先级、嵌套与共享资源保护
• 测试内容:中断触发与响应正确性、中断优先级抢占机制、中断嵌套深度与栈使用、中断与任务间共享资源的竞态条件、中断丢失与溢出处理
• 测试方法:人工注入中断信号(按键、外部触发)、可编程信号发生器高频触发、代码插桩统计中断进入/退出次数
• 缺陷关注点:中断服务程序(ISR)过长导致实时性下降、共享变量未使用volatile/临界区保护、中断优先级配置错误导致死锁 |
| IO与外设测试(IO & Peripheral
Testing) |
• 测试目标:验证MCU与各类外设接口的功能、时序、电气特性
• GPIO测试:输入/输出方向、上下拉、电平阈值、驱动能力
• 串行接口测试:UART/SPI/I2C的波特率/时钟频率、奇偶校验、时序波形、多设备总线冲突
• 模拟接口测试:ADC/DAC的精度、线性度、采样率、通道串扰
• PWM测试:频率、占空比范围、死区时间
• 总线测试:CAN/LIN/Ethernet的总线负载、错误帧处理、离线恢复
• 测试仪器:示波器、逻辑分析仪、总线分析仪(CANoe)、可编程负载
• 测试方法:回环测试(Loopback)、边界电压/频率测试、异常帧注入测试、长时间稳定性测试 |
| 掉电与重启测试(Power Failure
& Reset Testing) |
• 测试目标:验证系统在异常掉电、电压波动、复位触发下的数据完整性与恢复能力
• 随机掉电测试:在程序运行任意阶段(尤其是Flash写入、EEPROM擦写、文件系统操作时)切断电源
• 上电时序测试:电源Ramp-up速率、复位释放时机
• 欠压测试(Brown-out):电压缓慢下降至阈值以下,验证BOD复位
• 看门狗复位测试:模拟程序跑飞/死循环,验证看门狗溢出复位
• 软复位vs硬复位:复位寄存器状态、RAM数据保持
• 频繁上下电:1000+次循环后的启动成功率
• 验证重点:Flash/EEPROM数据是否损坏、配置参数是否回退默认值、系统能否正常启动(无砖化)、掉电前关键状态能否恢复 |
| 自检与诊断测试(Self-test &
Diagnostics) |
• 测试目标:验证系统上电自检(POST)、运行时自检、故障诊断与降级策略
• 上电自检:RAM测试(March算法)、Flash CRC校验、外设初始化检测
• 运行时自检:栈溢出检测、看门狗、心跳监测、电压/温度监测
• 功能安全自检:符合ISO 26262/IEC 61508的安全机制验证
• 测试方法:故障注入(人为破坏Flash CRC、短路外设引脚、拉低电压)、验证DTC上报正确性、验证故障恢复后的系统行为 |
| 其他专项测试 |
• 内存测试:栈/堆使用量监控、内存泄漏检测(静态分析+运行时插桩)
• 功耗测试:不同运行模式下的电流测量、低功耗唤醒时延
• 兼容性测试:不同硬件批次、不同芯片步进(Silicon Step)的兼容性
• 环境可靠性测试:高低温、湿热、振动、EMC抗扰度下的软件行为 |
| 第4部分.嵌入式典型缺陷分析(3学时) |
| 内存相关缺陷 |
• 栈溢出(Stack Overflow):成因为中断嵌套过深、局部数组过大、递归调用;现象为程序跑飞、HardFault、变量被意外覆盖;检测手段为栈水位线(Stack
Watermark)、MMU/MPU保护
• 堆碎片化与内存泄漏:频繁malloc/free导致堆碎片、动态内存未释放;嵌入式场景下应尽量静态分配
• 越界访问与野指针:数组越界、已释放指针复用、未初始化指针 |
| 中断与并发相关缺陷 |
• 中断冲突(Interrupt Conflict):中断优先级配置错误、共享资源未保护;现象为数据不一致、偶发死机
• 竞态条件(Race Condition):任务与任务、任务与中断间的共享数据访问;典型案例如32位变量在8/16位MCU上的非原子读写
• 优先级反转(Priority Inversion):成因与经典案例(火星探路者号);解决方案为优先级继承、优先级天花板 |
| 硬件时序相关缺陷 |
• 硬件时序不匹配:外设初始化时序不符合芯片手册要求、总线读写建立/保持时间不足;现象为偶发通信失败、特定温度下失效
• 毛刺与抖动:按键消抖不足、机械开关抖动导致误触发、电源纹波导致的复位异常 |
| 低资源与可靠性缺陷 |
• 低资源下卡死宕机:内存耗尽导致分配失败未处理、CPU
100%占用导致看门狗复位、消息队列/环形缓冲区溢出
• 死锁与活锁:多任务间信号量/互斥锁获取顺序不一致
• 看门狗相关缺陷:喂狗逻辑放在被阻塞的任务中、超时时间设置过短/过长 |
| 典型缺陷案例剖析 |
• 案例:汽车ECU在低温环境下偶发CAN通信失败——根因为时钟晶振温漂导致时序不匹配
• 案例:工业控制器运行72小时后死机——根因为内存泄漏导致堆耗尽
• 案例:无人机飞控在高机动动作时失控——根因为中断优先级反转导致传感器数据延迟
|
| 第5部分.嵌入式与非嵌入式测试核心区别(4学时,对比章) |
| 测试运行环境 |
• 嵌入式测试必须在真实目标板或等价仿真平台上进行,宿主机测试无法覆盖硬件相关问题;
• 通用软件可在多配置电脑上测试兼容性,嵌入式只需覆盖有限硬件版本。 |
| 资源约束对比 |
• 嵌入式必须做资源占用测试(栈/堆峰值、CPU占用率、Flash/RAM使用量);
• 通用软件通常只需关注极端大数据量下的性能,无需精确测量字节级内存;
• 嵌入式需关注内存碎片问题,通用OS有虚拟内存缓解。 |
| 测试依赖对比 |
• 嵌入式测试成本高、周期长,单次测试可能需要接线、上电、烧录;
• 嵌入式测试可重复性挑战大(硬件状态、温度、电压波动影响结果);
• 通用软件测试可充分利用CI/CD流水线,嵌入式CI需配合硬件在环。 |
| 实时性要求对比 |
• 嵌入式必须做时序确定性测试,验证最坏情况下的时延;
• 通用软件性能测试关注平均/99分位,无需保证每个请求的确定性;
• 嵌入式实时性测试需要高精度测量仪器,通用软件用软件时间戳即可。 |
| 失效影响对比 |
• 嵌入式测试需引入功能安全测试(故障注入、安全机制验证);
• 嵌入式测试覆盖率要求更高(MC/DC覆盖),测试文档更严格;
• 通用软件可接受"已知缺陷发布",嵌入式关键缺陷必须零容忍。 |
| 综合对比总结 |
• 嵌入式测试 = 通用测试方法论 + 硬件相关专项测试
+ 实时性验证 + 资源约束验证 + 高可靠性验证。
• 核心思维转变:从"验证功能逻辑"到"验证软硬件协同下的确定性与可靠性"。 |
| 第6部分.
实战演练与课程总结(5学时) |
| 实战项目:基于STM32的嵌入式测试综合演练 |
• 项目背景:一个带CAN通信、ADC采集、PWM输出的电机控制板
• 任务1:搭建交叉编译单元测试环境(Ceedling + Unity)
• 任务2:使用示波器测量中断响应时间与PWM输出精度
• 任务3:设计并执行掉电测试用例(Flash写入过程中断电)
• 任务4:故障注入——模拟CAN总线错误,验证诊断与恢复
• 任务5:资源占用分析——测量栈峰值、CPU占用率 |
| 测试用例设计工作坊 |
• 针对"嵌入式系统功能"需求,设计完整测试用例集
• 覆盖功能、时序、异常、可靠性、边界等维度
• 分组评审与优化 |
| 常见测试工具链实操 |
• 静态分析:Cppcheck、PC-lint、Coverity
• 动态分析:FreeRTOS Tracealyzer、SystemView
• 自动化测试:串口/硬件控制
• HIL基础:dSPACE / NI平台入门 |
| 课程总结与能力进阶 |
• 知识体系回顾与思维导图
• 嵌入式测试工程师能力模型
• 进阶学习路径:功能安全(ISO 26262)、AUTOSAR、车载测试(CANoe)、SIL/HIL
• 常见面试题与答疑 |