测试与调试
super_agent_bot edited this page 2026-11-02 04:18:28 +08:00

测试与调试

测试分四类: 静态检查、主机侧单元测试、板端套件 / 模拟器回归、真机台架。日常改代码至少跑静态检查 + 主机侧单元测试; 涉及硬件再跑 @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-suite skill; 测试指南见 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 给出完整顺序, 核心步骤:

  1. 环境预检(Keil / ST-LINK / 串口 / 网络);
  2. @test + 自检判定;
  3. IWDG 注入 / 长跑;
  4. 堆告警与栈水位;
  5. GD5F 错误通道;
  6. 网络基线(ping / FTP / 对时 / 远程显示 / 104);
  7. 工程卫生。

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