c1ab902ef1
把监听生命周期从 net_socket.c 整体抽出为真机专属模块 net_listener.c: 7 个函数 + 7 个状态数组 + 8 个常量 ≈470 行。 net_socket.c 4126 → 3656 行(-471)。 模块边界(详见 net_listener.h 头注释): - 搬入:relisten_locked / try / clear / done / retry_tick / pump / drain_chip_rx - 留在 net_socket.c:net_listen_locked(应用 API 路径)/ net_accept_locked (产出连接)/ net_lost_connect_probe(补 accept)/ net_listener_armed (双端公开 API)/ net_resync_listen / net_reconcile_tick / net_sock_t 字段 接口从「8 处散点直调 + 2 处直接写状态数组」收敛为 4 个窄接口: net_listener_settle(fd, level) / _try(fd) / _clear(fd) / _retry_tick() 新模块**不访问 s_net_socks**(改用 net_get_sock + ch395_sock)。 搬移中必要的两处可见性提升(非纯机械搬移,已注释留痕): - net_set_errno 由 static 提升为模块间可见(NET_ERR_RETURN_1 宏随迁头文件) - 新增 net_pending_active(fd),替代直接读 s_net_pending[i].active (L3 保险语义原样保留) 真机专属:net_listener.c 依赖 ch395f_* SPI 驱动,sim(Winsock)无对应 → 只注册 Keil 端,并在 check_registration.py 的 SIM_EXEMPT **显式点名** (不整目录一刀切,遵脚本既定原则)。 验证(纯搬移的可证判据): - 尺寸:**RW-data 980 与 ZI-data 143060 完全不变**(数据总量不变); Code 197236→197228(-8)、RO-data 17012→17000(-12)——接口改造的 极小开销,相对 471 行搬移可忽略 - 门禁全绿(cppcheck / C 规范 / 双端注册 / 主机侧单测 12 套 / mem-numbers) - @test PASS + 回读 No difference found - 全量回归::21 0ms×50 与 100ms×50 各 50/50;:8888 20/20;:7003 10/10; ftp_regression 11/11;Trap23 abort/graceful 各 5/5 - 设备侧:orphan listener **0**(保持 P2a 基线)、pump 留痕正常
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_abort_probe.py |
FTP 中止场景探针(Trap 23) |
ftp_retr_abort_probe.py |
FTP RETR 中止探针 |
tcp_reconnect_probe.py |
TCP 快速复连探针(Trap 22) |
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