测试与调试
测试分四类: 静态检查、主机侧单元测试、板端套件 / 模拟器回归、真机台架。日常改代码至少跑静态检查 + 主机侧单元测试; 涉及硬件再跑
@test。细节见
docs/测试说明/自动化测试流程.md、测试开发标准流程.md、实机测试实施指南.md。
1. 测试分类
flowchart TB
S["静态检查"] --> H["主机侧单元测试"]
H --> B["板端测试"]
B --> R["模拟器回归"]
R --> T["真机台架"]
| 类别 | 内容 | 运行位置 |
|---|---|---|
| 静态检查 | 静态门禁: pre-commit 全钩子(cppcheck、编码规范、乱码、文档链接、任务表、内存数字、双端注册、RAM 预算等) | 本地 / CI |
| 主机侧单元测试 | MSVC 离线编译真实源码 | 本地 / CI |
| 板端测试套件 | CH395F / 存储 / GD5F / RTC 等 | 本地(需真机) |
| 模拟器回归 | 菜单像素、内容页黄金参考、池水位 | 本地(需模拟器) |
| 真机台架 | @test 闭环 + 探针 + 长跑 |
本地(需真机 + ST-LINK) |
2. 日常命令
# 静态检查 + 主机侧单元测试(推荐每次提交前)
.venv\Scripts\python.exe scripts/ci_local.py
# 全库 pre-commit
pre-commit run --all-files
# 编译
.venv\Scripts\python.exe .dsh\skills\keil-build\scripts\keil_build.py
# 上电自检(串口采集 → 烧录 → 日志校验)
.venv\Scripts\python.exe .dsh\skills\serial-boot-test\scripts\run_boot_test.py
# UI 回归
.venv\Scripts\python.exe simulator/tests/check_menu_rows.py
.venv\Scripts\python.exe simulator/tests/check_content_pages.py
3. @test 判据
3.1 Required 标记
App init OK
Network Init
net init: OK
PHY: 100M FULL
3.2 Forbidden 标记
FAIL / ERROR / HardFault / [ERR]
四个 Cortex-M4 Fault 的崩溃日志都以 [ERR] 开头 → 出现 Fault 即本次不通过(刻意设计)。
3.3 其他判据
- 自检记录:
selftest: no fault record; - 退出码: 0 = PASS / 1 = FAIL / 2 = 采集或烧录错误 / 3 = 用法;
- 启动锚点计数与固件身份戳必须匹配(防止“反复重下载、芯片一直是旧镜像”)。
3.4 固件身份戳
app_main_init() 会打印 fw build: <date> <time> <variant>, 用于把“芯片里正在跑的镜像”与“刚编出来的镜像”对上号。@test 会校验它; 如果只切换 TEST_SUITE_* 宏, 注意 app_main.c 必须包含 test_config.h, 否则戳不刷新。
4. 烧录与复位语义
# 烧录(必须 -Rst -Run)
.venv\Scripts\python.exe .dsh\skills\stlink-flash\scripts\stlink_flash.py flash
# 回读校验(No difference found 才算写入)
.venv\Scripts\python.exe .dsh\skills\stlink-flash\scripts\stlink_flash.py cmp
- 裸
-P可能报Programming Complete, 但目标核处于死循环/异常时写入不落地; 必须-Rst -Run。 -CmpFile连接时会复位目标, 必须排在采日志之后; 否则会把刚启动的现场复位掉。- 不要用
git checkout/reset --hard丢弃未提交工作; 怀疑乱码先统计EF BF BD字节数。
完整
ST-LINK_CLI用法见docs/测试说明/ST-LINK_CLI_复位使用说明.md。
5. 串口调试
| 项 | 值 |
|---|---|
| 端口 | USART1(PA9 TX / PA10 RX) |
| 参数 | 115200 8N1 |
| 配置源 | .serialtest/config.json(单一配置源) |
| 工具 | .dsh/skills/serial-assistant/scripts/serial_tool.py |
串口助手是常驻 daemon + CLI; 命令、判据与陷阱见 .dsh/skills/serial-assistant/SKILL.md 和 docs/测试说明/串口助手使用指南.md。
常用观察点:
App init OK/Network Init/net init: OK/PHY: 100M FULL;reset cause: <类型>: 区分上电 / IWDG / 软件 / 引脚 / 欠压;[STACK]: 任务栈水位;[PROF]: 任务级饥饿诊断基线;[ERR] <TAG> ...: Fault 现场(PC/LR/xPSR/R0-R3/CFSR/HFSR/BFAR/MMFAR)。
6. 板端测试套件
- 选择开关:
test/board/test_config.h的TEST_SUITE_CH395F/STORAGE/GD5F/RTC, 互斥, 一次只能一个; 全部注释 = 产品构建。 ENABLE_DESTRUCTIVE_TESTS默认关闭; 关闭时套件只读, 可在在用设备上跑。- 运行用
board-test-suiteskill; 测试指南见docs/测试说明/*_Test_Guide.md。 - ⚠ 跑一轮破坏性 GD5F 测试会让 dhara 多记一个坏块, 且该计数持久化, 普通恢复清不掉; 只有明确要做容量恢复/全片擦除时才开。
7. 主机侧单元测试
在 PC 上用 MSVC 离线编译真实源码, 不依赖硬件。主要模块:
| 模块 | 文档 |
|---|---|
| 看门狗判定状态机 | docs/测试说明/看门狗单元测试说明.md |
sys_clock 时间换算 |
docs/测试说明/系统时钟单元测试说明.md |
cfg_file INI 解析/保存 |
docs/测试说明/配置文件单元测试说明.md |
adc_input 语义映射/扫描 |
docs/测试说明/ADC输入层单元测试说明.md |
phasor 傅氏/相量 |
docs/测试说明/相量层单元测试说明.md |
vol_lock 卷锁 |
docs/测试说明/卷锁单元测试说明.md |
time_sync 对时逻辑 |
docs/测试说明/时间同步单元测试说明.md |
用例/断言数量会演进, 以各文档与 pre-commit 实跑为准。
8. UI 回归
simulator\build_sim.bat
.venv\Scripts\python.exe simulator/tests/check_menu_rows.py
.venv\Scripts\python.exe simulator/tests/check_content_pages.py
- 菜单像素回归 + 内容页黄金参考 + 池水位校验;
- 黄金参考更新后必须人工确认差异符合预期;
- 模拟器与真机存在差距, 改网络/日志/硬件层前查
docs/测试说明/模拟器差距清单.md。
9. 实机测试顺序
docs/测试说明/实机测试实施指南.md 给出完整顺序, 核心步骤:
- 环境预检(Keil / ST-LINK / 串口 / 网络);
@test+ 自检判定;- IWDG 注入 / 长跑;
- 堆告警与栈水位;
- GD5F 错误通道;
- 网络基线(ping / FTP / 对时 / 远程显示 / 104);
- 工程卫生。
10. 现场验收清单
| # | 项目 | 方法 | 通过标准 |
|---|---|---|---|
| 1 | 上电自启动 | 断电上电 + 串口采集 | @test PASS, 无 Forbidden 标记 |
| 2 | 网络连通 | PC ping 设备 IP | 通, PHY 100M FULL |
| 3 | 远程显示 | 客户端连 7003 | 出图 160x160 1bpp, 远端菜单可用 |
| 4 | FTP | 客户端连 21 | 列目录 / 读写 / 下文件 |
| 5 | UI 功能 | 远端操作 | 7 项一级菜单、内容页、密码、网口设置保存后生效 |
| 6 | 对时 | PC 推送 8888 | 设备墙钟更新、日志时间戳正确 |
| 7 | 掉电保持 | 写文件 / 改网口配置 → 重启 | 数据仍在, /config.ini 按新值生效 |
| 8 | LED | 目检 | 6 路 LED 随状态变化(低电平点亮) |
台架已闭环项(历史记录): IWDG 任务饿死复位、关中断死循环复位、30 min 真实负载长跑、配置引擎堆改造、存储/网络套件。
11. 调试建议
- 先看
reset cause: 非上电复位优先怀疑 IWDG / Fault; - 启动卡死: 看最后一条
DBG_INFO, 启动段每步都有结果日志; - 栈问题:
[STACK]水位 +scripts/stack_report.py静态最坏链; - 任务饥饿:
[PROF]基线 + 看门狗PREVRUN seg轨迹; - 网络问题: 先确认
NET_READY, 再确认单连接是否被其他服务占用; - FTP 问题: 不要用裸 TCP 探测 21; 用仓库脚本并允许 30 s 重连;
- 存储问题: 先确认卷是否挂载、文件名是否满足 8.3、写回字节数是否完整。
12. 延伸阅读
| 主题 | 文档 |
|---|---|
| 自动化测试流程 | docs/测试说明/自动化测试流程.md |
| 测试开发标准流程 | docs/测试说明/测试开发标准流程.md |
| 实机测试实施指南 | docs/测试说明/实机测试实施指南.md |
| ST-LINK 复位语义 | docs/测试说明/ST-LINK_CLI_复位使用说明.md |
| 串口助手 | docs/测试说明/串口助手使用指南.md |
| 存储维护与容量恢复 | docs/测试说明/存储维护与容量恢复.md |
| 链路延迟 | docs/测试说明/链路延迟测试说明.md |
| 模拟器差距 | docs/测试说明/模拟器差距清单.md |
| CI | docs/CI/README.md |
STM32F4-Base 百科
入门
子系统
开发与验证
参考
仓库
STM32F4-Base 百科 · 基于仓库 master 分支整理 · 最后更新: 2026-11-01
内容以源码、AGENTS.md 与 docs/ 为准; 发现页面过期, 请在 维护指南 中按流程更新。