Commit Graph

9 Commits

Author SHA1 Message Date
wandering1 afb0bfd5ff fix(net-audit): 修 6 处寄存器口径/注释错误 + Trap 记录全量复核与审计章节
智能体团队四路并行只读审计(驱动层逐命令 / NET+测试层逐调用点 /
Trap 01-12 复核 / Trap 13-25 复核),三源交叉:芯片手册 + WCH 官方
SDK(CH395CMD.c / CH395INC.H / 21 个例程)+ git 历史。本提交只落
"已确认且低风险"的修法,其余发现登记进文末审计章节待逐项决策。

已修(A 类,全部有手册/SDK 出处):
A1 测试 TC-203 反核实写成 st_chk[0]==CH395F_TCP_ESTABLISHED——§5.22
   byte0 只有 00H/05H,条件恒假,这道 Trap 14 防线自写下起从未生效
   且日志无痕(与 Trap 07 同类的 byte0/byte1 语义越界)。改为
   byte0==OPEN && byte1==ESTABLISHED。
A2 测试 Phase3/4 把 GET_RECV_LEN 返回值直接当读取长度(本地
   rx_buf[300]/[64],芯片 RX 缓冲 2KB)→ 栈溢出;补夹取 + 留痕
   (同文件 TC201/202/204 早已 clamp,这两处是漏)。
A3 CH395F_GINT_STAT_DHCPV6 由 0x8000(bit15) 改 0x1000:SDK 是
   (1<<12)、§5.16 明确 CH395F 的 [12:15] 保留。全仓零引用。
A4 ch395f.h 命令分组注释字节数错 4 处(GET_GLOB_INT_STATUS_ALL /
   GET_UNREACH_IPPT 归"1 字节输出"、SET_FUN_PARA 归"1 入 1 出"、
   SET_RETRAN_PERIOD 归"3 字节输入"、GET_SOCKET_STATUS_SN 归"1 字节
   输出");KeepAlive 参数注释"秒"改"毫秒"(§5.53/5.54 单位 ms);
   set_retrans_count 删"0=默认值5"(§5.17 默认 12、无 0=默认语义)。
   实现全对、注释误导——Trap 25 的 1 字节缓冲栈越界正是这类注释发起。
A5 net_socket.c 六处注释与手册/HEAD 相反:FUN_PARA(SOCKET_CLOSE=0)
   实为 bit3=1(正是 closed-with-data accept 的契约依据,写反会诱导
   把 0x08 改回去)、"初始化成功后设置 MAC"(§9.2.1 ① 是之前)、
   "复用默认缓冲"(net_init 已为 8 Socket 显式分配)、"由 MSS 推导"
   (固定布局、Trap 21 已解耦)、"等 SEND_OK"(门控是 SENBUF_FREE)、
   UDP 头 [0-1] reserved(§9.2.4 是数据长度)。
A6 ch395f.c write_send_buf 超限静默 return(void 无日志),且上限取
   DMA 2048 而非发送缓冲 1024;读路径有 OVERSIZE 金丝雀、写路径没有
   → 补 [ERR] 留痕 + >1KB 告警,行为不变(分块责任仍在调用方)。

审计确认"不是 bug"的最危险一项:GET_GLOB_INT_STATUS_ALL 拼装方向。
我们"第1字节|第2字节<<8"与官方 CH395CMDGetGlobIntStatus() 逐字相同,
glob & (1<<(sock+4)) = §5.16 bit4..bit11 = SDK GINT_STAT_SOCKn,三源
一致。另 55 条命令码、9 处 16 位字节序、14 条读命令字节数、60 个
常量、12 个单位参数点、48 块缓冲布局逐条核对无异常;17 处
get_socket_status 调用点全是 st[2],Trap 25 的 1 字节 bug 无残留。

文档:Trap_Records 加文末「2026-10-11 寄存器/数值口径全量审计」章节
(干净清单计数 + 15 条新发现含已修/待修 + 文档待修清单)。就地修正:
Trap 07 定案更正里"全文 RST 仅见于错误码与引脚"的绝对表述(§5.29 /
§9.2.6 其实写了芯片发 TCP RESET,只是都与 close 无关)+ 删不可核验的
"11 个悬空提交";Trap 16 的"IP/端口寄存器大端"(端口 §5.25/5.26 明确
低字节在前)+ 注明 §5.8 总括与官方例程自相矛盾;Trap 18 删悬空
"Trap 19"(该条从未存在)、net_socket() 改 net_bind();速查清单 DMA
1500 改 2052;Trap 13 加复核注(最高优先级:其"部分读后 recv_len
归零"与 §5.34 直接相左、与本仓 TC201 注释相反,且同族结论已被 Trap 21
撤回,却仍被 6 处当现行约束引用);Test_Guide 的 TRAP-07 行仍教
"卡 FIN_WAIT_2 / close(RST)"、悬空的 Trap 19 与两处"见风险 #N"。

待修(B 类,登记未动,需逐项决策与实测):B1 产品路径从未启用 Socket
KeepAlive(唯一调用点在 client 分支,产品三服务全是 TCP Server,
§5.56 要求服务器在 CONNECT 后开,60s/5s/3 参数空转);B2 tcp_connect
返回值丢弃且 CONNECTING 不在对账范围;B3 net_listen_locked 全 8 Socket
读即清会吞别槽事件;B4 全局中断 bit0-3 从不消费、get_unreach_info 零
调用;B5 getsockname 的 s_addr 与本层约定相反致 FTP 日志设备 IP 反序
(PASV 双重反转恰好正确,勿误判);B6 三处判据只看 byte1 未按 byte0
门控;B7 Phase5 单次写 4093B;B8 Phase4 缓冲块与 sock4 交叠;B9 杂项。

验证:产品构建 0 错 0 警、Code=196912(+124B,写路径两条新日志);
测试路径(PHASE2/3/4 打开)单独编译 0/0;内存快照已刷新;doc-links
EXIT=0、无 U+FFFD、pre-commit 全绿;@test 闭环 PASS(戳匹配 + 回读无
差异 + 锚点 x1 + 548ms)。
2026-10-12 00:20:17 +08:00
wandering1 bca6cc694c test(net): TC-NET-204 定案 Trap 07——disconnect→close 不卡死,真因是 bit3
Trap 07(2026-07-19 写成"2025-07")断言"disconnect→close 让 Socket 卡
FIN_WAIT_2 数分钟、因为 close 不发 RST"。新增定案用例 TC-NET-204(Phase 2
硬件层,同一 Socket、同一 PC 回显、FUN_PARA=0x08,三模式 × 5 轮 = 45 项判定
全过)做受控对照,实测推翻其机制说法、保留其做法:

  A close                → 回 CLOSED 0/0/150/0/0 ms,重开 5/5 OK
  B disconnect → close   → 全部 +0 ms,重开 5/5 OK("卡死"未出现)
  C disconnect(不 close)→ 10 s 内从未回 CLOSED,byte0 恒 0x05、byte1 0x00;
                            直接 open → 0x20 FAIL(5/5),补 close 后 +0 ms

三条推翻:① FIN_WAIT_2(06H) 全程未出现(15 轮 × 9 采样点),实测过渡态只有
TIME_WAIT(0AH);② 手册无 RST 语义(§5.35 只说 close 前自动断链),且主动发
FIN 先进 FIN_WAIT_1 才进 FIN_WAIT_2,原说法跳拍;③ 观测越过了 byte1 的语义
边界——§5.22 byte0 只有 00H/05H,官方 SDK 注释明确 byte1 仅在 byte0=OPEN 时
有意义,而当年代码判据用的是正确的 byte0,break 后照样打印 byte1,于是"已
CLOSED 下的残留读数"被读成"卡在某个 TCP 态"。

真因:FUN_PARA bit3 SOCKET_CLOSE=1(§5.52 ②)下产生 DISCONNECT 后芯片不关
Socket、不清缓冲,Socket 停在 0x05(OPEN)/0x00(TCP_CLOSED),此时 open_socket
必返 0x20 FAIL——即历史那条 Phase 2 open_socket: 0x20 / socket 未完全关闭。
拉回 CLOSED 的动作是 close,与 RST 无关。

git 佐证:ch395f_tcp_disconnect() 自首个提交起只有定义、零调用点(含全部分支
与 11 个悬空提交),"disconnect→close" 从未进入提交代码;当时驱动已轮询
GET_CMD_STATUS(4 s 上限),也不是"命令没等完成"。

做法保留,理由换成三条有支撑的:§5.35 close 已自动断链故 disconnect 多余;
disconnect 制造的 DISCONNECT 事件在 bit3=1 下须我方消费/预清(Trap 14/17/22);
它把芯片推进 closing 过渡态、重开需沉降(Trap 09)。本轮 15 轮重开均未观察到
残留 DISCONNECT(0x10)——close 顺带清掉锁存,这才是"直接 close"安全的原因。
另消解 Trap 17 与 Trap 07 的旧矛盾:实测支持 Trap 17(close 走 FIN teardown、
0~150 ms 可见 TIME_WAIT),不支持 RST 说法。

文档:Trap_Records.md 加 Trap 07「定案更正」整节 + 改写「驱动关键点 → TCP 关闭
重连」速查清单(删 RST 说法、补 byte0/byte1 口径与 0x20 陷阱);Test_Guide.md
新增 TC-NET-204 用例表(前置含 tcp_server --timeout 900 这条坑:首连后连接
间隔 >60 s 服务器会自行退出)。

验证:测试构建 0 错 0 警、Phase 2 74/75(唯一 FAIL 是 TC-203 环境守卫,PC 服务
未及时关闭);宏已还原,产品构建 Code=196788 与 HEAD 一致(用例全在测试宏内、
产品零足迹),@test 闭环 PASS(戳匹配 + 回读无差异 + 锚点 x1 + 590 ms)。
pre-commit 全绿(test-cppcheck / doc-links / no-mojibake 均 Passed)。
2026-10-11 21:40:45 +08:00
wandering1 d758d5cd7b docs+net: FUN_PARA 定案 0x08——bit0 保留位证伪,Trap18 定案更正 + N-31
CH395F FUN_PARA 的 bit0 之争定案:取 0x08(bit3 SOCKET_CLOSE=1,bit0=0)。

证据(一手,按强度):
- 官方手册 V2.2/V2.3 与旧版 V1C/V1E/2020 版 §5.52 位表:bit0 一律
  「保留,必须为0」,任何版本都不存在「bit0=多 Socket」这一行。
- 官方 SDK CH395INC.H:349-353 位宏只有 bit1/3/4/7/8,无 bit0 宏。
- 官方例程直接反例:EXAM5_TCP_Server 传 0x02(bit0=0)却给 Socket 0~7
  全部配缓冲;EXAM11_FTPClient 直接传 0x08;全 EVT 包无一处 0x09。
- 手册命令章前言:8 Socket 是芯片原生能力,靠 _SN 索引寻址;§5.45
  真正的门槛是缓冲分配(Socket 个数 >4 须重分配缓冲)。
- 概念讹传源是 bit1 FUN_PARA_FLAG_TCP_SERVER(服务器多连接,§9.2.6)。
- 互联网检索无任何出处称 bit0 为单/多 Socket 模式。

Trap 18 的「bit0 决定 Socket 数量」是推论而非实测:无日志、无 TC 号,
且当年 Socket 1~7 未显式配缓冲(Trap 01/02 混淆因子未排除);TC704
40/40 与结论出自同一提交,属自证,不构成 0x08 的对照。

改动:
- net_socket.c:0x09→0x08(原为未提交改动,现已过编译门禁)+ 版本留痕
- ch395f_reuse_bench.c:0x09→0x08,与生产 net_init 同构
- net_test_task.c:TC704 注释纠正(Socket 可用性不依赖 FUN_PARA)
- Trap 18 新增「定案更正」完整证据链;Trap 25 疑点改判为定案
- Test_Guide / 产品需求 / 架构总览 / BSD 调用关系:0x09→0x08 改口径
- 待处理内容.md 登记 N-31:0x08 下多 Socket 台架复测(TC704 降并发
  ≤5 + FTP 回归),补 Trap 25 销项时漏登记的尾巴

验证:@build 0 错误 0 警告;check_doc_links --all 通过;无 U+FFFD。
2026-10-11 20:05:22 +08:00
wandering1 d1e6bb4ba7 W5波+N-19收口:FTP鉴权落地、Trap25三连定案修复(N-30)、N-20/N-23/N-26
N-19 FTP 鉴权:
- lftpd_auth(USER/PASS 状态机 + 连续5次失败锁60s)+ SHA-256
  (user||pwd) 口令哈希;config.ini [ftp] 段 user/pwd_hash/write,
  出厂 admin/admin 在用有启动告警;lftpd_log.c 删除并入 lftpd_auth
- ftp_cfg 配置读写;台架 ftp_auth_bench.py 13/13

N-30 / Trap 25(CH395F_Trap_Records.md 四次定案全记录):
- 修复1 closed-with-data accept:客户端发完正常 FIN 后芯片按
  FUN_PARA(0x09) §5.52② 保留 Socket+RX 缓冲,旧代码把 CLOSED 一律
  relisten 自毁缓冲 → STOR 必挂 425;改为接受"已关但可读"连接排空
- 修复2 丢 CONNECT 中断探针 net_lost_connect_probe + last_peer_port
  幽灵甄别(拆链窗口握手完成但中断丢失,双信源去抖补 accept)
- 修复3 send_list/send_nlst 批量单发:背靠背 ~60B 小段毒化芯片 TX
  (芯片报 SEND_OK 但对端全丢),整份目录一次性写入
- 证伪存档:固定沉降/Socket 轮换冷却/listen 门控(台架 v7 矩阵)
- 台架工具 test/board/ch395f_reuse_bench.{c,h} + host 脚本存档
  (不注册编译;实验分支 n30-chip-bench 保留)

N-20:Error_Handler 死循环降级(记录+复位路径)
N-23:scripts/check_registration.py 双端注册反向校验(pre-commit)
N-26:GD5F NAND 直 DMA 调用方缓冲窗口断言

验证:BUILD_OK 0/0;ftp_regression 连跑 4 轮 11/11(修复前
LIST#4/#7 100% 挂、STOR#2 曾 100% 425);ftp_auth_bench 13/13;
@test 启动标记 PASS;ci_local L0+L0.5 全过;doc-links 通过。
登记簿 N-30 已销项。
2026-10-11 18:50:24 +08:00
wandering1 f0300761ae 串口采集/测试去重:删 tools/serial_tool 与 test/host run_boot_test/verify_log 副本,引用改指 .dsh/skills 串口 skill 2026-10-10 15:13:23 +08:00
wandering1 e0b02d397c 修复 P2 全部 10 项:错误传播/竞态/门控/文档失真
待办池 docs/待处理内容.md §3.2 的 10 个 P2 全部闭环;逐项落代码 + 注释说明。

P2-1  cfg_file: 受管键行超 CFG_LINE_TEST_MAX 拒绝保存(防重复键行)
P2-2  ch395f: DMA 失败传播状态 + 锁存通道故障 + 读不拷不可信数据
P2-7  net_select: LISTENING 不再恒判可读(消除 select 忙轮询地雷)
P2-8  time_sync: 核实 L3 pending 改写已闭环(net_recv_to 分片 + 总预算)
P2-9  sys_log: 挂载改幂等 + 卷锁,defaultTask 2s 重试建 /log
P2-10 sys_log: s_read_raw 纳入卷锁 try(读者/写者 unlink 互斥)
P2-11 net_task: RECONFIG 改 osEventFlagsWait 原子取走 + 清除
P2-12 app_cfg: APP_*_ENABLE 如实标注为未接线占位,删“开关”说法
P2-13 freertos: 产品构建 vTaskDelete(testTask) 回收 8KB CCM 栈
P2-15 download.bat: 先删旧日志 + 增“未产出日志”判定

P2-13 用 USER CODE 区回收而非生成区 #if 门控:生成区改动会被 CubeMX
重生成覆盖,本方案重生成不丢。P2-12 因产品定义 B0 未定、APP_NET_ENABLE
无单一接线点,按修复建议备选(删“开关”说法)处理。

验证:@build 0 错 0 警;主机单测 watchdog 39/39 + sys_clock 100/100 +
cfg_file 149/149(新增 TC-CFG-044);pre-commit --all-files 17/17。
2026-10-04 08:30:30 +08:00
wandering1 029437be89 台架执行《实机测试实施指南》步骤 3~7 并闭环
步骤 3/4(IWDG V2/V4/V5 + 堆低水位 S11):
- V2 任务饿死 stall 后 ≤2.5s IWDG 复位;V4 关中断死循环 ~4.9s 稳定复位;
  V5 30min 120×FTP 全 PASS、零 IWDG 复位。堆告警全程未触发(min_ever=4728B)。
- task_watchdog.c:stall 证据写盘会经 nand_ftl_wd_feed 喂狗 → 增 s_stall_evidenced
  每次 stall 仅取一次证据,避免"取证据"本身阻止复位。
- default_task.c:堆低水位告警(HEAP_LOW_WATER_B=3072)。

步骤 5(GD5F 错误通道 S9):gd5f2gq5ue.c/.h + nand_ftl.c 错误码统一为 int32_t 并
全量检查返回值;套件回归 16/16 PASSED。
- test/run_all_suites.py:--forbidden 改为按套件覆盖(GD5F 用 "HardFault;assert")——
  TC-GD5F-704 故意触发 [ERR] 回落轮询,统一默认值会误判 FAIL。

步骤 6(网络稳定性):7.1 正常路径 ✅(V5 证据);7.2 N-2 丢弃可观测性代码已具备、
49s 静默在 V5 未复现(降级低风险观察项);7.3 N-3 待 PC peer。

步骤 7(工程卫生):
- S5:新增 test-cppcheck 钩子(仅 warning,排除模拟器桩)。
- S4:新增 scripts/check_test_traceability.py(默认仅告警)。
- 待核实项 TEST_SUITE_SELECTED 实机核实 = 死代码(无使用点);RTC 套件实际正常执行,
  真缺口 = 缺套件级汇总行 → sd2506_test_task.c 补 === RTC Tests: N/M PASSED === 并
  修正 Phase 级汇总累计问题;test_config.h 补齐 RTC 并注释"当前无引用"。

验证:产品 @build 0/0;pre-commit --all-files 17/17 Passed;
run_all_suites.py --suites RTC → PASS。
文档:实机测试实施指南 / SD2506_Test_Guide / 待处理内容 / 测试与架构改进建议 同步。
2026-10-04 00:35:06 +08:00
wandering1 2055de0303 测试:落地测试架构改进 T-1~T-5(套件开关门禁/汇总行校验/通用 harness/公共断言宏/多套件编排)
背景:L0.5 主机侧单测落地后复审测试架构,给出 6 条改进意见(P0~P3),
登记进 docs/待处理内容.md「测试与验证基础设施」后逐条实施。

- T-1(P0) 测试套件开关门禁:新增 scripts/check_test_suite.py + pre-commit 钩子
  test-suite-switch,默认要求产品构建(全部 TEST_SUITE_* 注释),跑套件回归用
  --allow-test-build / ALLOW_TEST_BUILD=1 显式放行。顺带把 test_config.h 中长期
  开启的 TEST_SUITE_CH395F 改回注释(仓库此前躺着的是测试固件)。
- T-2(P1) verify_log.py 增加 --require-suite-summary:要求
  "=== <名称>: N/M PASSED (failed=0) ===" 且 N>0,堵住"套件没跑到汇总行/
  断言数为 0 仍判 PASS"的盲区;run_boot_test.py 同名参数透传。不传参向后兼容。
- T-3(P1) 抽取通用 harness test/host/common/unit_test_harness.py(工具链探测/
  INCLUDE-LIB 拼接/wd4819/GBK 解码/退出码契约);watchdog 运行器 170→55 行,只声明 TestBuild。
- T-4(P2) 新增 test/board/test_common.h 集中断言内核(TEST_CHECK_IMPL/TEST_REPORT_IMPL),
  4 套件各用一行宏绑定自身统计变量(保持 g_xxx_stats 独立、防跨套件串数)。
  刻意不 include dbg_log.h——否则冻结 DBG_TAG 默认值触发 #47-D 重定义警告。
- T-5(P2) 新增 test/run_all_suites.py 多套件回归编排,try/finally 无条件还原套件开关。

验证:@build 产品构建 0 错 0 警;4 套件逐一构建均 0/0;看门狗单测 39/39 PASS;
pre-commit 14 钩子全通过;编排脚本 dry-run/开关切换/异常还原均实测通过。
2026-10-01 07:28:57 +08:00
wandering1 22559365b9 整理 App 与 test 目录:按职责分子目录并同步全库引用 2026-09-26 12:52:39 +08:00