52976bdec3
本批是 ② 形态迁移清的第一族(用户裁定顺序:② 里的 Trap 一族先做) 统一了什么(数字不变、只补模块码,§7.1)——改名工具 23 处 / 11 文件 - Trap 01~07 → TRAP-GD5F-01~07:属主文档 7 个标题行从此成为定义位 - 陷阱 1 → TRAP-RTC-01(SD2506 属 RTC 域,§4.2)、见陷阱 01 → TRAP-GD5F-01 - Trap 21 / Trap 19 → TRAP-NET-21 / TRAP-NET-19(引用的是活登记处 CH395F_Trap_Records.md,号本身不变) - 波及 Drivers/BSP/GD5F2GQ5UE/*(4 处注释)与 test/board/*(2 处)→ 已重编 三处判读后**刻意不改**(写进 §8.3,不让人当成漏网) - docs/环境与部署/并行任务工作树方案.md 的 wip/trap22-fix 是 git 分支名,不是编号; 这类非编号字面量要靠类型处理,与位号 T1、IEEE 负序 S2、gitlint 规则 ID 同一批 - docs/UI设计/菜单页面设计.md 变更记录行的「陷阱 3」按 §8.1 冻结不改写 - docs/硬件平台/V0.0、V0.1 网表报告里 6 处 Trap05 语义确指 TRAP-NET-05,但该目录 是门禁与改名工具共同的排除语料 → 不越界动笔,盲区登记进注册表 TRAP 族 cursor_note 两处不是改名、是改错话(映射表类工具的典型失效:字面对了、意思错了) - scripts/README.md 原写「Trap 19 从未存在」;改名后字面变成 TRAP-NET-19,而它是 **真实条目**(SET_MAC 必须在 INIT_CH395 之前)→ 那句话成了假话,改用站得住的例子 - docs/编号规范.md 同一处事故叙述补准确说法:当年裸形不在册 ≠ 这个坑不存在 - 菜单页面设计.md 的「见 §8.2 陷阱 1」本就不是 TRAP-* 族的号(指本文小节第 1 条), 改写成「见本文 §8.2 第 1 条(lv_text_get_width 的 length=0 陷阱)」 关闸第一次真拦人:咬的是自己家的审计表 - scripts/rename_maps/batch3-trap.json 里必然写着 Trap 21 / 陷阱 1 等旧形态, 被当成 6 类「台账外新账」→ 提交被拦(拦得对,但表不是语料) - 第 4 次同一类自循环(前三次:别名表、注册表、债务台账)→ 整个 rename_maps/ 目录入 excluded_paths;这条规律写进 §8.4:**登记号的表一律不得当引用语料** 实测变化 - 错误级 659 → 632(−27);② 空格/中文形 Trap 残余 2 处(都是上面刻意保留的) - ③ 悬空错误 44 → 42:TRAP-GD5F-01/05/06 三处历史悬空引用自动落地为已定义 - 编号字面量 8277 → 8312(识别面没有缩水,这是改名最容易踩的坑); 可判定比例 82.92% → 82.99%(基线 82.6%);⑦ 定义无引用 100 → 103(如 TRAP-GD5F-02 只有定义位无人引用,如实挂 warn 不压掉) - 台账 --prune-backlog 收掉已还清 42 条,剩 298 条(只减不增);--strict 通过 另修:core.autocrlf=true 把 SD2506_Trap_Records.md 检出成 CRLF(41 处)→ 还原 LF, 该文件 diff 只剩 1 行实质改动(仓库权威行尾是 LF,见 .gitattributes) 验证(全绿) - @build:0 错误 0 警告(Program Size Code=213356 RO=18580 RW=1184 ZI=131480) - ci_local.py:L0 + L0.5 全过(16 runner / 1104 断言) - check_doc_links.py --all:143 篇文档 0 失效、0 待确认 - 改动文件字节卫生逐项与 HEAD 对比:BOM / CR / U+FFFD 异常 0 审计轨迹与文档 - 映射表 scripts/rename_maps/batch3-trap.json(含作用域切分理由与刻意不改清单) - 别名 11 条全部带 scope;docs/编号规范.md §7.1 行状态、§8.3 批 4 行 + 说明段、 §8.4 自循环第 4 条、变更记录
MDK-ARM/ — Keil MDK-ARM v5 工程与构建/烧录/探针脚本
唯一工具链:Keil MDK-ARM v5(ARMCC,C99)。本目录含工程文件、启动文件、 命令行构建/烧录脚本,以及台架探针与判读脚本。
关键文件
| 文件/目录 | 作用 |
|---|---|
STM32F407-Demo.uvprojx |
Keil 工程文件(源文件清单、编译选项、目标配置) |
STM32F407-Demo.uvoptx |
Keil 用户选项(调试器、断点等) |
startup_stm32f407xx.s |
启动文件(Heap_Size EQU 0x200(512B)在此限定) |
.dsh/skills/stlink-flash/scripts/stlink_flash.py |
复位/烧录/回读(ST-LINK_CLI 封装,见下;原 reset.bat 已于 2026-10-10 删除) |
构建与烧录
# 编译(@build = keil-build skill;相对路径,勿用绝对路径)
& '.venv\Scripts\python.exe' .dsh\skills\keil-build\scripts\keil_build.py # 退出码 0 = 0 errors, 0 warnings
# 烧录 + 复位运行(@download = stlink-flash skill)
& '.venv\Scripts\python.exe' .dsh\skills\stlink-flash\scripts\stlink_flash.py flash <文件.hex|.bin>
# 仅复位
& '.venv\Scripts\python.exe' .dsh\skills\stlink-flash\scripts\stlink_flash.py reset
⚠️ 烧录铁律
stlink_flash.py flash=ST-LINK_CLI -c SWD -P <文件> -Rst -Run——-Rst -Run不可省略! 裸-P会报Programming Complete,但目标核处于异常状态时写入并不落地(芯片内容不变)- 烧录后必须回读校验:
ST-LINK_CLI -c SWD -CmpFile <文件> 0x08000000(No difference found才算真写入) - 本机 3 线接线(nRST 未接),只重启不烧录用
stlink_flash.py reset
台架探针与判读脚本
| 脚本 | 作用 |
|---|---|
bench_verdict.py |
台架判读(把运行结果判为 PASS/FAIL) |
ftp_freeze_probe.py |
FTP 上传+回读哈希(真实路径冻结探针) |
ftp_retr_abort_probe.py |
FTP RETR 中止探针 |
tcp_reconnect_probe.py |
TCP 快速复连探针(TRAP-NET-17) |
audit_runs.py / audit_tcpclient.py |
运行记录审计 / TCP 客户端审计 |
check_crecipe_content.py |
检查创建配方内容 |
子目录
| 目录 | 内容 |
|---|---|
RTE/ |
Keil Run-Time Environment 配置 |
DebugConfig/ |
调试会话配置 |
STM32F407-Demo/ |
构建输出(.o/.axf/.map 等,产物不提交) |
bench_diag/ |
台架诊断数据 |
retracted_bench_20260922/ |
已撤回的台架数据(存证) |
⚠️ 注意
- 工具路径经
DTU_*环境变量解析(DTU_KEIL_UV4= UV4.exe 完整路径,DTU_STLINK_CLI= ST-LINK_CLI.exe 完整路径;换机设变量即可,无需改脚本;契约见docs/环境与部署/本地工具路径环境变量方案.md) - 本目录被 pre-commit 门禁排除
- 启动文件的
Heap_Size = 512B是自研代码禁用malloc的根因(见AGENTS.md)
相关文档
- 烧录/复位:
docs/测试说明/ST-LINK_CLI_复位使用说明.md - 构建与验证:根
AGENTS.md「构建与验证」章 - 测试流程:
docs/测试说明/自动化测试流程.md