2. 测试环境搭建:硬件测试平台与软件测试环境
做嵌入式测试,环境搭建是第一步,也是最容易踩坑的一步。我见过不少团队,方案选得挺好,代码写得也不错,结果一上硬件就各种诡异问题——最后发现是测试环境本身就没搭对。
这一章,咱们就把硬件平台和软件环境掰开揉碎了讲清楚。你跟着我的思路走一遍,以后自己搭环境心里就有底了。
2.1 硬件测试平台:你的“眼睛”和“手”
硬件测试平台说白了就是三样东西:示波器、逻辑分析仪、万用表。这三样配合好了,大部分硬件问题都能定位。
2.1.1 示波器:看波形的“眼睛”
示波器是嵌入式调试的第一神器。我个人习惯,只要板子第一次上电,示波器探头一定先挂在电源轨上。为什么?因为电源不稳,后面所有测试都是白做。
| 参数 | 推荐规格 | 我的经验 |
|---|---|---|
| 带宽 | ≥100 MHz | 测 SPI/I2C 够用,测高速 DDR 得 500 MHz 以上 |
| 采样率 | ≥1 GSa/s | 低于这个,毛刺根本抓不到 |
| 通道数 | 4 通道 | 2 通道经常不够用,4 通道一步到位 |
| 存储深度 | ≥10 Mpts | 抓长序列信号时,深度不够会压缩波形 |
2.1.2 逻辑分析仪:看时序的“放大镜”
示波器看模拟波形,逻辑分析仪看数字时序。两者互补,缺一不可。
逻辑分析仪的核心指标就两个:采样率和通道数。
- 采样率: 至少是目标信号最高频率的 4 倍。比如 SPI 时钟 20 MHz,采样率至少 80 MHz。我建议直接上 200 MHz 以上的,省心。
- 通道数: 16 通道起步。8 通道的测个 UART 还行,一碰到并行总线就抓瞎。
2.1.3 万用表:最基础的“听诊器”
万用表虽然简单,但用好了能解决大问题。我调试时,万用表永远是第一步工具。
- 测电压: 上电先测电源输出,确认电压在误差范围内。
- 测通断: 怀疑虚焊?蜂鸣档一测就知道。
- 测电阻: 判断上拉/下拉电阻是否焊错,或者线路是否有短路。
嗯,这里要注意:万用表的内阻会影响测量结果。测高阻抗节点时,用数字万用表的高阻抗模式,不然测出来的电压会偏低。
2.2 软件测试环境:你的“大脑”和“工具链”
硬件平台搭好了,软件环境也得跟上。软件环境主要三块:虚拟机、交叉编译链、调试器。
2.2.1 虚拟机:隔离与复现的利器
我建议所有嵌入式开发都在虚拟机里做。为什么?因为宿主机环境一旦污染,重装系统太浪费时间。虚拟机快照一恢复,环境就回到干净状态。
常用的虚拟机方案:
| 方案 | 适用场景 | 我的推荐 |
|---|---|---|
| VirtualBox + Ubuntu | 个人开发、学习 | 免费,够用,但性能一般 |
| VMware Workstation | 团队协作、复杂项目 | 性能好,快照功能强大 |
| Docker | CI/CD、自动化测试 | 轻量,但调试不方便 |
2.2.2 交叉编译链:让 PC 编译嵌入式代码
交叉编译链,说白了就是在 PC 上编译出能在 ARM/MIPS/RISC-V 等嵌入式芯片上运行的代码。
搭建步骤其实不复杂:
- 下载工具链: 从芯片厂商官网下载,比如 ARM 的 gcc-arm-none-eabi。
- 解压并配置环境变量: 把工具链的 bin 目录加到 PATH 里。
- 验证: 运行
arm-none-eabi-gcc --version,看到版本号就对了。
# 以 ARM Cortex-M 为例
wget https://developer.arm.com/.../gcc-arm-none-eabi-xxx.tar.bz2
tar -xjf gcc-arm-none-eabi-xxx.tar.bz2
export PATH=$PATH:/path/to/gcc-arm-none-eabi/bin
arm-none-eabi-gcc --version
2.2.3 调试器:GDB + OpenOCD 的组合拳
调试器是软件调试的核心。我常用的组合是 GDB + OpenOCD。
- GDB: GNU 调试器,支持断点、单步、查看变量、反汇编等。
- OpenOCD: 开源片上调试器,负责和 JTAG/SWD 调试器硬件通信。
典型调试流程:
- 启动 OpenOCD,连接目标板。
- 启动 GDB,加载编译好的 ELF 文件。
- 用 GDB 命令控制程序执行。
# 启动 OpenOCD(以 ST-Link 为例)
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
# 另一个终端启动 GDB
arm-none-eabi-gdb my_program.elf
(gdb) target remote localhost:3333
(gdb) monitor reset halt
(gdb) load
(gdb) break main
(gdb) continue
2.3 环境搭建的整体流程
下面这张图,是我自己总结的环境搭建流程。你照着走一遍,基本不会漏东西。
2.4 环境验证:跑通第一个测试用例
环境搭完,得验证一下。我习惯用最简单的“点灯”程序做验证——让 GPIO 输出一个方波,然后用示波器看波形。
// 简单的 GPIO 方波输出(以 STM32 为例)
#include "stm32f4xx.h"
void delay(void) {
for (volatile int i = 0; i < 100000; i++);
}
int main(void) {
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // 使能 GPIOD 时钟
GPIOD->MODER |= GPIO_MODER_MODER12_0; // PD12 设为输出
while (1) {
GPIOD->BSRR = GPIO_BSRR_BS_12; // 置高
delay();
GPIOD->BSRR = GPIO_BSRR_BR_12; // 置低
delay();
}
}
编译、下载、运行。示波器探头挂到 PD12 引脚上,应该能看到方波。如果看不到,按这个顺序排查:
- 万用表测板子供电是否正常。
- 示波器测晶振是否起振。
- 检查编译链是否选对了芯片型号。
- 检查调试器连接是否稳定。
好了,硬件平台和软件环境都搭好了,也验证通过了。接下来就可以正式开始写测试用例、跑测试、定位故障了。记住,环境是基础,基础不牢,地动山摇。