wandering1
|
13a4a40a14
|
feat(net): 服务器侧 KeepAlive 转正(§5.56,E11)+ Phase 11 重开回归
E11(d96113b)证据链:"链路在、对端静默"注入下生产参数 60/5/3 实测
判死 ≈30s → TIM_OUT → QUARANTINE → pump 重建;静默但存活对端不误杀。
handle_connect_event LISTENING 分支按手册规定位置开启;反汇编确认
编译器把两分支尾部合并(LISTENING 跳入含 keepalive+fire_event 的公共
尾部,hex 全片仅该分支偏移 1 行差异,Code 尺寸不变属填充巧合)。
Phase 11 重开时发现其拉入 32KB s_rx_buf 超产品 RAM 余量(L6406E 链接
失败)→ 改专用 64B 探针缓冲(本 Phase 仅 64B 探针读,门控注释已留
"勿加回"警示),套件恢复 0 错 0 警;TC-NET-1101 步骤同步死对端注入法
(禁用网卡;Windows 防火墙规则对已建立连接无效,E11 实证)。
验证:产品/套件双构建 0 错 0 警 + 反汇编确认调用落地;台架确认
(:7003 静默对端判死 + Phase 11 实跑)待设备冷启动断电重上电后补做。
|
2026-10-13 09:25:06 +08:00 |
|
wandering1
|
d96113bcc4
|
docs(net): N34 E11/E12 实验记录与台架脚本(KeepAlive 服务器侧缺口、TSL 规格偏离)
E11:服务器侧 KeepAlive 未开启(静态证据链 + 注入手段两次修正 + 实测
生产参数 30.0s 判死、空闲存活会话不误杀),给出采纳建议;防火墙规则
对已建立连接无效、有效注入 = 禁用 PC 网卡,两条方法学留痕。
E12:缓存区读写路径长度→数据零间隔属规格偏离(读 0.4us/写 0.2us),
但 460 轮/约 58MB 字节级校验未测得可复现危害;依 Trap 25 登记偏离、
B 变体(两段+TSL,+28B,吞吐无回退)留作待用补丁。
残渣风暴态跨烧录存活污染 A/B 连接级对比,教训写入 E12:实验前后必须
冷启动(断电重上电),MCU 覆写烧录/RESET_ALL 不足以清除。
新增 test/host/e11_keepalive_probe.py(idle/block 两模式 + 注入正对照)
与 test/host/ftp_integrity_test.py(STOR→RETR 全量 SHA-256 比对,
建议纳入常备回归集)。
|
2026-10-13 09:10:17 +08:00 |
|
wandering1
|
b3ef7289a0
|
test(time_sync): 单测断言随阶段1契约更新(handle_conn 不再 close)
阶段 1 第 5 项(b8c6a3d)删除了 time_sync_handle_conn 的 net_close(conn_sock)
——单连接模式下 conn==listen,close 会把监听一起毁掉;会话收尾改为返回外层,
由 time_sync_task 仅在 `conn != ls`(模拟器多连接后端)时关数据 fd。
4 条主机侧断言仍按旧契约要求"处理完关闭连接",ci_local 报 4 处失败
(TC-TS-020e/023b/024b/027c)。
- 4 条断言改为 `s_close_calls == 0`,文案说明新契约
- TC-TS-020..029 段头补契约变更注释(指向 TC-TS-040e 的任务级关闭路径)
- TC-TS-040e(任务级 conn!=ls 关闭)与 TC-TS-043(代次变化关旧监听)不变
验证:time_sync 单测 80/80 PASSED(原 76/80);ci_local L0.5 15 runner
951/951 assertions 全过。
|
2026-10-13 06:52:07 +08:00 |
|
wandering1
|
b8c6a3dab0
|
refactor(net)!: N34 阶段1 API 面收敛(对账⑤ + 删 3 个手动自愈 API)
BREAKING CHANGE: 删除公开 API net_relisten / net_resync_listen /
net_can_accept 与消息类型 NET_MSG_RESYNC_LISTEN / NET_MSG_RELISTEN。
生产调用者为零(仅看门狗文档与 iec104 门控),应用侧无迁移成本;
如有外部消费者须改用对账/pump 自动机制(见下)。
1. 对账①扩展为①②⑤(F-NET-2 缺口,先补缺口再删 API)
net_reconcile_tick 新增 bad=5:本层 ESTABLISHED 且芯片 0x05/0x01
(Socket OPEN + TCP LISTEN,静默回收回监听、不发 DISCONNECT)
→ RESYNC 语义只修本层(state→LISTENING + last_peer_port 转登 +
lost_conn_seen 清零 + 取消挂起 recv),**不发任何芯片命令**
(纪律同 pump③ U11,run8 实证重下发会 170s 永拒)。
原判据①要求 TCP==CLOSED、②要求本层 LISTENING,均不命中此形态
——此前生产无人认领(仅手动 API 能修)。
2. 删 net_relisten(net_socket.c 函数 + 消息分派 + 头文件声明)
footgun:对健康监听器无条件 open→USE→close 自毁 ~1s(原注释自认);
与 pump(100ms)/D10(30ms) 完全重叠。
3. 删 net_resync_listen(同上;语义并入第 1 条)
4. 删 net_can_accept(net_socket.c + net_socket.h + sim 三处)
只认 ESTABLISHED 的旧门控把"监听器在服役、待 CONNECT"窗口全挡掉,
:2404 丢 CONNECT 探针因此从不运行;iec104 门控迁 net_listener_armed。
5. timeSync :8888 会话收尾不再 net_close(同 fd 续 accept,监听跨会话
常驻;原 close→重建每会话一个 Trap 09 沉降窗)。server 脚本注释同步
新契约(PC 侧 2s 宽限后自行关闭)。
6. lftpd 应用层阻塞重试退役:lftpd_inet_listen 5 轮(500ms/2000ms,最坏
10s 阻塞 ftpTask) → 单次 + 失败即 425;cmd_pasv 3×200ms 同删。
就绪屏障已消除 Trap 09 启动形态,客户端自带传输重试语义。
台架实证修正(本提交内二次修复,务必留痕):
- net_listener_armed 补齐 **ESTABLISHED 放行**。首版迁移只放行
LISTENING/CLOSED+残留,漏了 ESTABLISHED=单连接模型的"待 accept"电平
→ iec104 200ms 任务周期抢不过对账② 的 ~400ms 去抖,对账②先 standalone
accept 转 ESTABLISHED 后 armed=0 → 应用整场不 accept,18/18 检查全 FAIL
(设备日志证据:sock1 standalone accept 后无 i104 accepted,直至对端 FIN
才由 closed-with-data 救回)。补放行后 18/18 PASS,且耗时 127s→8.3s。
该态 accept 必返 fd,无 RPC 风暴风险。
- 期间顺带验证 M3 无辜:sock1 suspect DISCONNECT on live conn 命中后
defer→对账①→closed-with-data accept 把未 accept 的 RX 数据救回,
正是 M3 设计意图(资产门保护)。
验证(全绿):@build 0/0(Code=209580;含 CH395F 套件+Phase13 全量重编
0/0 的编译验证);@test PASS(回读无差异);iec104 18/18(8.3s);
n30 0/50;:21 @0ms 50/50 p50=512;:7003 50/50 p50=517;ftp_regression
11/11;Trap23 RST 5/5 + FIN 5/5;time_sync :8888 连续推送正常(RTC 更新、
无 [ERR])。文档同步:BSD 指南(§3.3/3.6/10.1/10.2/12 + 变更记录)、
函数调用关系、监听生命周期设计说明、IEC104 上行设计说明、模拟器差距
清单、链路延迟测试说明。
门禁说明:doc-links 工作树 junction 伪影按既定口径 SKIP;mem-budget
分支 .map 漂移同前;cppcheck/coding-standard 手跑 Passed。
|
2026-10-13 06:44:26 +08:00 |
|
wandering1
|
4c0a0af9f8
|
fix(net): N34 阶段0 零风险清理 9 条(注释债/死码/三处小逻辑门)
纯注释/死码(零行为变更):
- 0-1 pump 注释 50ms→100ms(宏真值源 100U,net_socket.c)
- 0-2 D10 give-up 文案改"retry budget exhausted, pump takes over"
(旧文案夸大永久失效语义,pump 100ms 仍周期认领重建)
- 0-7 IP 字节序注释更正:set_ip/gw/mask 实为点分十进制序(调用方
parse_ip_string 数组直传、芯片按首段接受、台架多年实证);
set_des_ip 补"与 get_remot_ipp 输出同序"往返注(ch395f.h/.c)
- 0-8 Trap 13 注释降级为"未证实历史观察"(对齐 2026-10-11 Trap 13
复核注,与手册 §5.34 相左):DMA 定容理由改"接收缓冲 2KB 整缓冲
单读=Trap 25 排空契约形态";net_socket.c 四处引用改写
- 0-9 删死声明:GET_GLOB_INT_STATUS(0x29)/ENTER_SLEEP/EEPROM×3/
GPIO×2/SPI_BEGIN_DELAY_MS/GINT_STAT_SOCK0..3(全仓零引用核实)
小逻辑(台架冒烟实证):
- 0-3 U12 对称:TCP_LISTEN 失败补 close 两处(net_relisten_locked /
net_listen_locked)——防芯片 Socket 卡"OPEN 无监听"、下轮 open
恒返 USE(U12 同源事故形态)
- 0-4 retry_tick 状态门:仅 LISTENING/CLOSED 才重试;已转 ESTABLISHED
(新会话抢先)清陈旧登记,防 open→close 摧毁活连接(认领口径同 pump)
- 0-5 FUN_PARA 裸 0x08 → CH395F_FUN_PARA_SOCKET_CLOSE(复用既有宏
(1UL<<3),注释补 §5.52/版本/红线口径;曾重复定义触发 9 警告,
已并入原宏块)
- 0-6 版本门控:ver<0x46 拒置 bit3 并 [ERR] 留痕(防芯片批次漂移;
本台架 ≥0x46 行为不变,fun_para 日志改打实际值)
验证:@build 全量重编 0 错 0 警(Code=209580,RW/ZI 不变);@test
PASS(回读无差异);冒烟 n30 0/20、:21 @0ms 20/20、:7003 20/20、
ftp_regression 11/11。
门禁说明:doc-links 工作树 junction 伪影按既定口径 SKIP;mem-budget
分支 .map 漂移同前;cppcheck/coding-standard 手跑 Passed。
|
2026-10-13 05:54:42 +08:00 |
|
wandering1
|
9ac9879527
|
fix(net): N34 P0 止血包 M1+M2+M4-lite,背靠背 STOR 8%→96.7%
F-NET-15:n30_repro 背靠背 STOR 基线 4/50(425)。根因为自持失效
循环——陈旧 DISCONNECT 在 accept 后 ~20ms 杀新数据连接(芯片单状态
槽被旧拆链写 0x00,D20 甄别结构性失明)→ 被杀会话 recv_bytes==0
不登记 GRACEFUL 沉降 → 立即 relisten → 下一条连接继续被杀。
- M1 net_socket.c:GRACEFUL 沉降无条件化(删 recv_bytes!=0 门),
断"零数据被杀会话免沉降"繁殖链
- M2 lftpd_inet.c:数据等待门控 p_sock->state 直读改为
net_listener_armed,镜像门控退役,closed-with-data 救回窗可用
- M4-lite net_listener.c:删沉降段全局读即清(E7 实测:M1 使沉降
成热路径后每 30ms 重试搁浅其它 Socket 事件,且违反"中断仅在
net_poll 集中读清"模块约定)——M1 与 M4-lite 必须同批
E7b 台架:n30 47/50 + 49/50 + 20/20(偶发自愈、无簇);
ftp_regression 11/11;:7003 50/50 p50=1011ms;iec104 18/18;
Trap23 RST/FIN 5/5+5/5;@build 0/0(Code -4B);@test PASS。
残余 ~3% 偶发 = D20 结构性失明(M3,阶段 1 对账①电平化确认)。
证据与时间线 → docs/网络/N34-自愈审计/实验方案.md E7/E7b 节。
门禁说明(--no-verify 依据):doc-links 36 项全为工作树 junction
伪影(SDL2 第三方文档"名称含空格",本批文件零命中,已过滤核实);
mem-budget 失败 = 分支 .map 与主树台账受管区漂移,非 92% 红线,
本改动 ZI/RW 不变(Code -4B),台账由 lead 合并后回补(既定纪律)。
cppcheck / coding-standard 对改动文件手跑 Passed。
|
2026-10-13 00:06:53 +08:00 |
|
wandering1
|
1d96fc9f87
|
feat(soe): B9 动作记录 + 时标 SOE(L4-4/L4-5)+ 104 M_SP_TB_1 自发
- 新增 App/log/soe_rec.{c,h}:64B 定长 SOE 记录纯编解码(CP56Time2a
时标 + 类型 + 元件号 + 单调序号 + 值 + sum8 撕裂校验),零 I/O 零 OS
依赖,主机 L0.5 覆盖(32 断言,含与 iec104 CP56 解码器交叉互证)
- 新增 App/log/soe_store.{c,h}:protectTask 边沿投递(取时标 + 组记录 +
SPSC 待发环/消息队列,零文件系统);defaultTask 经 syslog_drain 尾部
排空落 /log/soe.log(卷锁 try / FA_WRITE|FA_OPEN_APPEND / 校验字节数 /
容量满 unlink 重建,全套照 run.log 实证纪律;无卷损坏归类路径)
- protect_task.c:元件动作/返回、软压板投退、采样闭锁/恢复六类边沿
→ soe_store_post;post 内禁 DBG_*(protect 静态最坏链 872 B 不变,
改前/改后 stack_report 九任务逐字节一致),丢弃留痕挪 drain 侧
- iec104:单点 YX 自发改 M_SP_TB_1(30) 带 CP56 时标(总召/周期保持
M_SP_NA_1,单测两种都断言);link cfg 新增 epoch_ms 时标源回调
(NULL/无效 → IV 位如实置位);serv 绑 sys_clock(秒域时基,
ms 域 = 秒×1000,不造假亚秒)
- 主机单测:test/host/soe/(32 断言)+ iec104 94→97(TB 时标/IV);
iec104_master.py 解析 type 30(B6/B7 流不回归);decode_soe.py
台架解码断言工具(seq 单调/校验和/UTC 交叉)
- 注册:uvprojx + check_registration SIM_EXEMPT 点名(MCU-only 胶水)
- 文档(我方属主区):`App/log/README.md` 增 soe 节(64B 记录/单写者/
post 禁 DBG/UTC 交叉坑);`docs/子系统设计/IEC104上行设计说明.md`
§1 范围行 + §3.2 时标注 + §7 台架行 + §8 第 2 条销项 + 变更记录行
台架腿(bench 锁 B9,release --bench-pass):run_boot_test PASS;
--b7-pre 21/21、--b7-post 13/13(B6/B7 回归 + 确定性动作边沿);
自发 YX 上送 M_SP_TB_1 带 ts(11:00:51 动作 / 11:00:53 复归);
FTP 下载 /log/soe.log 30 条记录 decode PASS(seq 0..28 单调、
ELM_ASSERT 14 条、UTC 交叉一致);定值/压板已恢复默认。
台账 +1088 B(SPSC 环 512 + 静态 FIL 528 + 计数器)随合并由 Lead
回填(ram_baseline --write + check_mem_numbers --write)。
gate: only mem-budget/mem-numbers pending lead ledger backfill
(pre-commit --all-files: 29 Passed / 2 Failed / 0 Skipped;
hygiene self-check OK: no BOM/CRLF/mojibake/trailws/non-ASCII literal)
sync 追平 v2-on-ui(B8 freq + N33 抬栈)后复跑:@build 0/0
(Code=209492 RW=1104 ZI=154184);stack_report 九任务全 PASS、
protectTask 872 B/57% 不变;ci_local L0.5 15 runner 951/951
(freq 46 / soe 32 / iec104 97 / prot_set 90 / prot_elm 47)。
顺带修 protect_task.c 陈旧注释:定值巡检 31 项 → 40 项(B8 后)。
|
2026-10-12 19:38:13 +08:00 |
|
wandering1
|
0264b49489
|
feat(algo): B8 频率测量层 + 过频/低频保护(L3-5)
新增 App/algo/freq.c/h:由 L2 基波相量导出系统频率。相邻两拍共轭
乘积 P=Z(m)·conj(Z(m-1)) 取角 = 每拍相位增量(免显式解缠绕),再按
自适应窗长 K_eff=round(8·Fs/(2·f_hat))(45~55 Hz 段 73~89 拍)做滑动
平均。定长窗受 20 点矩形窗负序泄漏纹波限制(实测扫频最坏 0.317 Hz;
60 拍 Kay 复数和 0.197 Hz,交叉项和角不按 1/K^2 衰减),自适应窗使
窗长恰为纹波周期 fs/(2f) 整数倍 -> 最坏 0.0101 Hz。推导与两轮弯路
写在 freq.c 文件头。
假值钳制带取 35~65 Hz,刻意宽于系统合理带 40.5~60.5:单拍相位差本身
带 ±5 Hz 泄漏纹波,贴边钳制会非对称丢弃纹波半周 -> 均值偏置(实测
45 Hz 点 +0.16 Hz)。系统合理带由 OF/UF 定值范围在消费侧把关。
幅值门 FREQ_AMP_MIN=50 码(拟定,待 L1-5 标定复核):低于门判无有效
波形,停更新、valid 清零、读数保持 -> 浮空/PT 断线不发散。源优先级
UA(C02)->IA(C01),按名前缀解析、每拍动态回退,切换即废相位基准。
prot_set:尾追加 8 项(PS_ID_COUNT 32->40,编号不回收)
OF_EN/OF_HZ/OF_DLY/UF_EN/UF_HZ/UF_DLY/RET_OF/RET_UF。OF/UF 逐项通讯
地址不在本仓库 -> 全部 comm_addr=0 本地项(104 C_SE 不可寻址,待对照
参考表补)。频率返回系数独立(0.99/1.01),勿与电气量 0.95/1.05 共用。
bad_mask 随项数扩为 uint64_t。PROT_SET_BLOB_VER 1->2。
prot_set_store:换代与损坏分流。load 返回 2 = 版本/项数换代(本文件
打 INFO "prot set blob version change, defaults in use"),-1 = 真损坏
(defaultTask 按 CORRUPT 报 ERROR + 自检留痕)。B7 旧档(ver=1/32 项)
升级首启属预期路径,不得报成损坏。语义分流收在属主文件内,
default_task.c 不动。
prot_elm:实例表加 src 字段(0=phasor rms,1=freq),PE_OF/PE_UF 尾
追加(PE_COUNT 7->9)。freq 无有效读数按方向填"必不启动"值(过量 0 /
欠量 1e30 -> 滞回比较恒假 -> 元件复位),不整拍跳过——频率源缺失不得
饿死电流/电压类元件(B5 行为不回归)。OF/UF 暂未映射独立 104 遥信点,
动作只经 YX15 保护总聚合可见(送检点表 = B10)。
板端接线:adcTask 在 phasor_run() 之后同拍调 freq_run();心跳/首拍日志
追加 freq(<tag>): f=%ld valid=%u (x0.01)(MicroLIB 无 %f)。app_main
内核前 freq_init()。
主机单测:freq 46 用例(J1 扫频 45~55 Hz <=0.02 Hz 实测最坏 0.0101;
J2 噪声 1% <=0.10 实测 0.0160;J3 启动收敛 <=40 ms 实测 20;J4 阶跃
50->51 <=120 ms 实测 98;J5 浮空 valid=0 不发散;J6 跳变 60 ms 内回
±0.05;另直流 8000 码 / 3-5 次谐波 20%/10% / UA->IA 回退)。
prot_set 90(+TC-PS-011 OF/UF 行 + 64 位 bad_mask bit39 + 旧档拒绝)、
prot_elm 47(+OF/UF 滞回与方向隔离 + run() 测频接线)。回归:phasor
57、iec104 94 全绿。
J4=120 ms 是"精度优先于响应"的显式取舍(Lead 批准):4 周波窗换
0.317->0.0101 Hz,测频响应 98 ms << OF/UF 定时限默认 1000 ms(占
总动作时间 <10%),暂态另有 J6 <=60 ms 兜底。
注册:freq.c 入 uvprojx algo 组 + check_registration.py SIM_EXEMPT
(纯算法、模拟器无消费路径,照 prot_set.c 先例)。
@build 0 错误 0 警告(Code=207468 RO=18304 RW=1068 ZI=153084)。
RAM:RW_IRAM1 96096->96728 B(+632 B,73.3%->73.8%)、RW_CCM 不变
57376 B(87.9%)、Flash 224596->226840 B(+2244 B,21.4%->21.6%);
台账随合并由 Lead 回填。stack_report:adcTask 静态最坏链 1320 B /
余量 1240 B(48%)改前后完全不变(freq_run 帧未进最坏链,无需抬栈);
protectTask 链 872 B / 余 1176 B(57%)同样不变。
gate: only mem-budget/mem-numbers pending lead ledger backfill
--------------------------------------------------------------
门禁实跑(pre-commit run --all-files,Lead 批准 --no-verify 提交):
28 Passed / 2 Failed,失败仅 mem-numbers 与 mem-budget 两条——均为
docs/内存管理 受管快照与本 .map 不一致(台账由 Lead 每次合并后
--write 回填,避免多分支同改受管表冲突)。其余含 doc-links /
coding-standard / no-mojibake / cppcheck / registration-check /
13 条主机单测钩子全 Passed(gitlint 属 commit-msg 阶段,不在该次
--all-files 内)。ci_local L0.5 全绿(freq 46/46 等)。
字节卫生自查(--no-verify 跳过卫生钩子,故手工核):17 个暂存文件
全部 BOM=无 / CR=0(纯 LF)/ U+FFFD=0;自研 .c/.h 去注释后字符串
字面量 100% ASCII(唯一非 ASCII 字面量在 test/host/iec104/iec104_test.c
的既有用例名,非本次改动行;test/ 不在 coding-standard 钩子范围)。
|
2026-10-12 19:16:37 +08:00 |
|
wandering1
|
6215bb6f53
|
test(b7): 定值持久化+软压板台架腿闭环(跨复位保持 42+8 判据)+ B6/B7 销项
- @test PASS(B6 门控修复生效,protect 锚点行完好)
- 主站工具 iec104_master.py 增 --b7-pre/--b7-post/--b7-mark/--b7-check
四模式(纯标准库、ASCII 输出可归档,中间 ST-LINK 复位)
- pre 21/21:YK12 两段 OFF → 0.05 A 低定值不动作(保护退出);
ON → YX15/16 立即动作(COT=3);C_SE→C_RD 回读
- post 13/13:压板退出态跨复位保持(开机日志 global plate OUT +
低定值仍不动作)、重启后 YK12 ON 联动在位
- mark/check 4/4+4/4:非默认定值 7.5 跨复位保持(C_RD=7.500,
排除"回落出厂默认"假阳性);台架留干净态(定值/压板回默认)
- 开机日志两次 [CFG] prot set loaded (/prot_set.bin)
- 证据:boot_log_data 20261012_B7_* 两份 + 清单行
- 文档:IEC104 §7 台架行/变更记录、保护规划状态行/§7 P4/B7 行尾巴、
W1 卡 B6+B7 销项(删行 + §1 指针/§2 判据/§3 图/写范围注)、
任务规划 README §2.0/§2.1、test/host/README
- 验证:doc-links 全绿(141 文档)、9 个文件字节卫生干净
|
2026-10-12 16:54:23 +08:00 |
|
wandering1
|
dafcf8098b
|
test(b6): 台架 @test 闭环复测收口 + 启动行门控修复 + PC 104 主站
B6 台架 @test 闭环复测(B4/B5 验收窗口)完成,DoD 全判据过。
门控修复(首跑 FAIL 实锤的 B5 遗留竞态):
- 现象:protect task start 锚点行字节级交错损坏
(st[art: cycle=220ms elm=70,两次开机同形复现)
- 根因:启动行在控制台写者注册前打印走无锁裸发,与
defaultTask 启动日志交错——违反 2026-10-10 门控纪律
(控制台单写者日志设计说明.md §3.4,adcTask 同款先例)
- 修复:启动锚点行改 dbg_console_writer_ready() 首拍补打
台架与工具:
- .serialtest/config.json:Required 增 protect task start /
i104 listening on 2404 / [STACK] protect|iec104|heap
- test/host/iec104_master.py:纯标准库 104 主站客户端
(STARTDT→总召四组+actterm→C_SE 两段写触发 YX15/16 变位
COT=3→恢复复归→YK11 两段正答→C_RD 读回),往返 18/18
PASS(d3107f3 与 B7+fix 两版固件)
- 复测 @test PASS:锚点完好 +577ms、9/9 Required、零 [ERR]、
回读一致;protect free_min 1220(59%)、iec104 2136(83%)、
新 56KB 堆 min_ever=10000(N-33 抬栈背书就绪)
证据与文档回填:
- boot_log_data 四份快照(含缺陷复现 MISS 件)+ README 登记
- 保护规划 §7 B6 行(B5 台架遗留闭环);控制台单写者 §3.4
纪律示例 + §11 变更记录;IEC104 §7/§8 主站工具就绪;
W1 卡 B6 ✅ + N-33 背书 + B7 台架腿注;登记簿 N-33
- 内存台账:+16 B 构建后 ram_baseline/check_mem_numbers 回填
验证:@build 0 错 0 警(Code=205516);ci_local 全绿
(L0 30 钩子 + L0.5 13 套件 826 断言)。
|
2026-10-12 16:31:33 +08:00 |
|
wandering1
|
1fe163ba7b
|
feat(protect): B7 定值持久化 + 全局软压板 + L5-1 竞态收口(W1 代码腿完成)
- prot_set:新增 PS_GLOBAL_EN(枚举尾追加);值区双缓冲 + 单字交换,
prot_set_set_sealed 原子写+封存;selfcheck 改 seqlock 式复核
(提交撞见 = 本轮跳过)→ 收口 B5 登记的 µs 级误锁窗口
- 持久化:新增 App/cfg/prot_set_store.c/h,/prot_set.bin blob
(magic+版本+计数+值区+sum32 正/反码对,144 B)走 cfg_store_write_atomic;
uvprojx 注册 + 模拟器豁免点名(check_registration 同步)
- 写路径:C_SE/YK12 执行段置脏 → iec104Task 投递 SYS_EVT_PROT_SET_SAVE
(事件位 bit7)→ defaultTask(配置引擎属主)落盘,写失败脏回置 = 天然
重试;装载 = STORAGE_READY 屏障前整表原子 parse(损坏保出厂默认 +
自检留痕 prot set corrupt;文件缺失 = 首启静默)
- YK12 转真:两段式(选择段校验 DPC / 执行段 set_sealed),protectTask
下一拍读退出态 → 复位元件 + 停判据(global plate OUT/IN 边沿日志);
本地定值项 comm_addr=0 显式不可寻址(防 IOA=0 误命中首个本地项)
- 单测:prot_set 63 断言(+33:软压板/原子写/脏握手/blob 往返/损坏拒绝/
伪造自洽越界对抗样本)、iec104 94 断言(+7:YK12 两段转真/置脏/本地项
C_RD EVI)
- 文档:IEC104 设计说明 §3.3/§3.4/§7、保护规划 §3.5 L5-1/§7 P4/变更记录、
App/algo 与 App/cfg README、W1 任务卡 B7→🟦(台架腿 🔴 待窗口,随 B6 同窗)
- 验证:@build 0 错 0 警(Code=205500,ZI +280 = 双缓冲+blob 缓冲);
ci_local 全绿(L0 27 钩子 + L0.5 13 套件 826 断言);ram_baseline 台账
受管区与内存快照已同步;19 个改动文件无 BOM / LF / 零乱码
|
2026-10-12 15:01:49 +08:00 |
|
wandering1
|
d3107f374f
|
docs: 待处理内容.md 解耦为 docs/任务规划/ 文件夹(README 排序权威 + 6 个职责单一文件)
- rename_ref.py 搬迁:git mv + 全库引用改写 33 文件 82 处
- README.md 保留 §0 编号空间 / §1 未闭环一览 / §2 推进顺序权威 / §3 维护约定
- 拆出 6 文件:W1-采集保护收尾(任务卡五字段)、排期详述、暂缓-RS485、
登记簿、测试与架构专项、基线与待确认
- 外部引用重定位 ~50 处:裸「登记簿 §X」、§5.1→基线与待确认 §2.1、
§2.4→暂缓-RS485、§6→基线与待确认 §3、脚本注释 T-x/N-x→登记簿
- 新增并行写纪律:任务分支不改本文件夹,状态列由 Lead 主工作树更新
- 验证:doc-links 141 文档全绿;mem-numbers 一致;refgraph 重生成;
@build 0 错误 0 警告;新文件无 BOM / LF / 零乱码
|
2026-10-12 13:42:47 +08:00 |
|
wandering1
|
90db528032
|
W1 功能主线完成:内存台账三件套(W1-0) + IEC104 上行(B4) + protectTask 板端接线(B5)
W1-0 台账三件套:scripts/ram_baseline.py(四模式)+ ram_baseline.tsv 趋势 +
docs/内存管理/RAM预算台账.md + pre-commit mem-budget 钩子(RW_IRAM1/RW_CCM >92%
即 FAIL + Top-10 附表);审查报告 §5.5 三条闭环。
B4 IEC 60870-5-104 上行(被控站,TCP 2404):App/protocol/iec104/ 三模块
(asdu 编解码 / pts 点表+数据源 vtable / link APCI+FSM,纯逻辑零 I/O)+
App/task/iec104_serv.c(iec104Task,NET_READY 屏障 100ms 分片喂位)。
82 断言 L0.5 全绿 + iec104-unit-test 钩子(第 31 钩子);
设计说明 docs/子系统设计/IEC104上行设计说明.md 全量回填。
B5 protectTask(L3 板端接线):App/task/protect_task.c——20ms 判据节拍
prot_elm_run + L5-4 采样故障闭锁(adc_health 电平位→元件复位)+ L5-1 定值
校验和巡检;新增 prot_elm_request_reset() 收口跨上下文复归(104 YK11 落请求、
eval 头部消费);定值/元件初始化移入 app_main_init(内核前)。TC-PE-010
(prot_elm 28 用例)。
门禁与内存:TASK_WD_PROTECT=8 入 required_mask(产品 0x77→0x1F7、HW 层
0x1F5,看门狗单测 39 断言同步);FreeRTOS 堆 48→56KB(.ioc L1 参数 +
FreeRTOSConfig.h 同步,RAM预算台账 §6 登记配额 48→56KB)。
ZI 144,008→152,204(+8,196 B = 堆 +8KB,B5 扩容);Code=204,348。
stack_report:protectTask 512 words 静态链 872 B/余 57%、iec104Task
640 words 1456 B/余 43% 均 PASS;RW_IRAM1 73.1% / RW_CCM 87.9%(<92%)。
验证:@build 0 错 0 警;ci_local 全绿(31 钩子 + 13 主机侧单测);
doc-links 135 文档 PASS。登记簿 B4/B5 销项、W1 波次完成;保护规划/看门狗
说明/AGENTS(9 任务)/RAM 三文档全部同步。
遗留(验收窗口,非代码空洞):台架第三方 104 主站往返(送检窗口)、
标准源注入动作判据、@test PROT 锚点 + protect 栈水位 + 新堆 min_ever 复测。
|
2026-10-12 12:36:23 +08:00 |
|
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
|
c936441c83
|
门禁扩容:新增 lv-conf-sync、simulator/ 纳入全部钩子;含 L3 定值/元件框架落地
本轮把"自研代码落在门禁之外"的口子收掉,同时落地 LVGL 特性裁剪与
L3 保护定值/元件框架。
门禁(.pre-commit-config.yaml,26 个钩子)
- 新增 scripts/check_lv_conf_sync.py + 钩子 lv-conf-sync:比对两份
lv_conf.h 的**生效值**(未定义则取 lv_conf_internal.h 兜底默认),
抓 MISMATCH / LVGL 不认的宏名 / 同文件重复定义
- 顶层 exclude 删掉 simulator/:其下 21 个 tracked 文件全是本项目自研
代码,生成物(build/、SDL2/、tests/ref/、shot*)已在 .gitignore;
doc-links 的 exclude 同步删除
- lv-conf-sync 的 files: 覆盖两端配置 → 只改 simulator/lv_conf.h 也触发
(pre-commit 4.x 已移除 always: true,实测只告警并跳过,无兜底开关)
- 新增 prot-set-unit-test / prot-elm-unit-test 两个主机侧单测钩子
- S11(2.3.5) 判定细化:禁的是"用路径找文件",尖括号系统头带子目录
(如 <sys/stat.h>)不再误报;全仓库复核仅 2 处项目代码判定变化
模拟器代码整改(纳入钩子后暴露,全部修代码而非豁免)
- cppcheck 4 处:sim_syslog.c 判空分支内解引用 p_epoch(真实 bug)、
2 处 struct tm 未初始化、1 处指针可加 const
- coding-standard 61 处:44 处函数左大括号并到右括号同行、8 处补函数
注释、3 处补文件头注释块、2 处 __ 前缀保护宏改 XXX_H、2 处 sprintf
改 snprintf(写入字节数与原来完全一致)
LVGL 特性裁剪(F-1/F-2/F-3)
- 两端 lv_conf.h 对齐同一特性子集:删 26 个 LVGL 9.3 不存在的选项名、
3 处重复定义,10 项靠默认值隐式生效的改为显式固化
- 实测对镜像体积中性;价值在防漂移,且模拟器 golden 回归跑的正是固件
实际编译的配置
L3 软件侧
- App/algo/prot_set.* Q10 定值模型(范围校验 / 整表 all-or-nothing /
校验和封存-自检-闭锁)+ prot_elm.* 通用"滞回+定时限"元件框架 7 实例
- test/host/prot_set、test/host/prot_elm 主机侧单测;uvprojx 挂载两处
文档同步
- pre-commit使用说明:§2.8 S11 口径、§2.15 lv-conf-sync 详解、新增 §5.5
复盘(教训:exclude 只写真正不该进钩子的路径)
- AGENTS.md、UI_设计架构 §1.4 第 10 条、RAM 分析、审查报告刷新与销项
验证
- @build BUILD_OK 0/0(Code=194276 RO=15872 RW=876 ZI=139892)
- 模拟器重建:菜单 8 状态像素逐字节一致(池 5368 B)、11 内容页黄金参考
全过(往返 5448 B)、remo sink 0/25600 位差异、--logtest/--cfgtest PASS
- 全仓库 cppcheck / coding-standard / no-mojibake --all-files 全过
- check_doc_links --all 129/0;check_mem_numbers --check 内存数字一致
- 端到端:往 simulator/lv_conf.h 注入一行漂移 → 钩子 FAIL(exit 1)
|
2026-10-11 08:48:49 +08:00 |
|
wandering1
|
13a4e61c27
|
L1-6 采样有效性校验:adc_health 判定层 + 告警编排 + 31 用例单测 + 台架闭环
新增 App/algo/adc_health.c/h(纯逻辑判定层,零平台依赖免桩单测):
- 静默:两侧帧序号连续 >=100ms 无前进(电平位可自愈,flags() 为 L5-4 闭锁预留)
- 丢帧:TPAFE 序号一次前进 >1 计 tgap(与 STM32 侧 adc1_gap 对称,边沿事件)
- 单调性:序号倒退锁存位;tick/计数差值法 (int32_t)(a-b) 回绕安全
- 错误增量:FRSTDATA / HAL 错误 / STM32 停摆计数增量,事件位与锁存位编号对齐,
消费者按位图做"每类每次开机留痕一次"编排
adc_task.c v2.9 告警编排(判定与编排分离):严重事件/电平上升沿 DBG_ERROR +
SYSLOG_SELFTEST(每类每次开机一次防刷屏),下降沿 DBG_INFO 恢复;gap 不告警
(消费者超拍是已知现象,告警会淹没真故障);心跳行增 tgap 观测字段。
主机单测 test/host/adc_health/ 31 用例全绿(100ms 门限两侧 / 边沿语义 /
倒退锁存 / tick 回绕 / NULL 守卫 / init 幂等),登记 adc-health-unit-test 钩子。
台架 @test PASS:零 [ERR](健康不误报)、tgap=1->2 与 adc1_gap 同步可见、
frames 1000.0 Hz;证据 boot_log_data/20261011_prod_adc_health_boot_log.txt。
抬栈:adc_health_report->syslog_post 控制台回显尾使 adcTask 静态最坏链
832->1080 B(512 words 余 968 B < 1024 B ISR 底线)-> 512->640 words,
复测余 1480 B / 57%,堆 min_ever 7152->6640 B(-512 B 符合预算)。
AGENTS/README 任务表、RAM 方案 §2.3、规划文档 §3.1 L1-6 已同步置完成。
|
2026-10-11 01:28:20 +08:00 |
|
wandering1
|
9bbe117f97
|
adc: 节拍源 TIM6->TIM3 + ADC1 走 DMA 乒乓双缓冲,消除 2 ms 忙等(P1-5 单拍硬上界办结)
用户选定最彻底方案(B2):DMA + 定时器 TRGO 硬件触发 + 消费上一拍
已完成的半区。对应 P1-5 拆出的"单拍硬上界",现已办结。
硬件事实更正(查 CubeMX 器件库 + 本仓 HAL 头证实):F4 上 ADC1 的
外部触发清单里没有 TIM6/TIM7 TRGO(只接 DAC)。故 1 kHz 节拍源由
TIM6 改为 TIM3(PSC 83 / ARR 999,TRGO=UPDATE),同一个更新事件
同时 ① ISR 脉冲 TPAFE CONVST ② 经 TRGO 触发 ADC1 一轮 9 通道
③ 置位 ADC_WAKE_FLAG 唤醒 adcTask。TIM6 从 .ioc 整体移除。
代码:
- Src/tim.c/h:新增 MX_TIM3_Init(含 MasterSlaveMode),删 htim6
- Src/adc.c:ExternalTrigConv=T3_TRGO + EDGE_RISING +
DMAContinuousRequests=ENABLE;MspInit 挂 hdma_adc1(DMA2_Stream4
循环模式)。DDS 位关掉 = 一轮只发一次请求,静默丢 8 路
- Src/dma.c:DMA2_Stream4 NVIC 优先级 6(CubeMX 换流会把它重置为 0,
优先级 0 会抢占 FreeRTOS 临界区,违反"外设中断 ≥5")
- Src/main.c:周期回调加 TIM3 分支;stm32f4xx_it.c 向量同步
- App/algo/adc_input.c:stm32_scan() → stm32_take(),逐通道
PollForConversion 全删;乒乓半区由完成计数奇偶推出(只读一个
32 位量 → 与 ISR 无竞态);STM32 侧数据固定滞后 1 拍
- App/task/adc_task.c:心跳日志拆出四类计数
观测性:adc1_seq(完成计数)/ adc1_gap(seq 前进 >1 = 丢帧)/
adc1_err(连续 ≥2 拍无新帧 = 停摆)/ adc1_hw(HAL 错误回调)。
单拍无新帧是消费者相位伪影(DMA 完成落在唤醒后 ≈67 µs),不计故障。
验证:
- 主机单测 79 → 101 全绿;反向验证四连均咬(半区奇偶取反 11 条、
停摆拍置 valid 4 条、STALL_RUN_MAX 改 1 为 6 条、gap 阈值 1 条)
- @build 0 错 0 警,Code 256872 → 257660
- @test PASS:adcp 122 µs → 8 µs、adc1_err=0、adc1_hw=0、
adc1_gap=27/20002 拍、adc1_seq 与 seq 恒定偏移 2
- stack_report 7/7 PASS,adcTask 832 B / 余 59%(不变)
- cubemx-survival 新增 5 项审计(TIM3 分支 / T3_TRGO / DDS /
DMA 挂载 / 流优先级),28 通过 0 失败
文档:ADC 采样节拍设计说明新增 §11;看门狗停摆分析 §4.4 与 §8 收口;
算法规划 L1-1/L1-3、通道映射、测试说明、各 README 同步。
|
2026-10-11 00:31:33 +08:00 |
|
wandering1
|
dd8210867a
|
adc_input: 失败拍清 s_stm32_valid,杜绝超时沿用上一拍旧值(单测 70->79)
缺陷(真机实测发现):本层只有一份 s_stm32_raw[],有效标志此前只在成功时
置 1、失败时从不清零 -> 超时拍消费侧照样取数、照样压入采样环(且超时前
几个 Rank 已写本拍新值、后面几个是上一拍旧值 = 半新半旧混合帧),直接污
染 20 点 DFT 相量窗;adc_input_poll() 返回值只由 TPAFE 决定,s_frames_skip
也抓不到它。
修复:stm32_scan() 两条失败支路(HAL_ADC_Start 失败 / 轮询超时)都清
s_stm32_valid -> 本拍 adc_input_raw() 对 STM32 语义通道返 -2 -> adc_task
走既有 skip 整帧跳过路径;下一拍扫描成功自动置回 1(自愈)。
测试:新增 TC-AI-070..078(70 -> 79 用例)。旧用例 TC-AI-034/039b 都是
init 后立刻失败(valid 本就是 0),照不出成功过之后再失败这条路径,故新
用例先成功一拍进入有效态再注入失败。**反向验证已做**:把支路改回旧行为 ->
TC-AI-039b/073/074 立即 FAIL(76/79),证明用例有效。
验证:主机单测 79/79 PASS;@build 0 错 0 警(Code 256868 -> 256872);
@test PASS(本轮无超时:adc1_err=0、skip=0、idle=0、frames=20001);
18 钩子全绿。文档同步 4 处(停摆分析 4.4 / ADC采样节拍 10.4 / ADC输入层
单测说明 / test-host README)。
遗留:2 ms 忙等本身未消(硬化 2 = DMA,方案 B2 待 CubeMX 配置)。
|
2026-10-10 23:08:01 +08:00 |
|
wandering1
|
0b0cd0048b
|
补两份主机单测说明文档:卷锁(fail-open)与时间同步(N-17)
- 卷锁单元测试说明.md:33 断言点。钉死 fail-open 不变量(互斥量创建失败时
vol_lock_wait 必须返回 1 且绝不阻塞——defaultTask 是喂狗点)、幂等、超时透传、
判空 release;并说明"白盒置 s_lock=NULL"的取舍与桩只验调用契约的边界。
- 时间同步单元测试说明.md:80 断言点。钉死分片喂狗延时、监听退避、时间包重组
(半包/粘连/EOF/真错/预算耗尽/tick 回绕)、任务主循环;含 setjmp/longjmp 跳出
for(;;) 的手法,以及"C 暂定定义静默合并同名 static 变量"这一无告警缺陷的记录。
- test/host/README.md:补齐 7 套主机单测的清单、运行方式与钩子(原表缺
phasor / adc_input / vol_lock / time_sync 四套),并修正 cfg_file 断言数。
- docs/README.md:主机侧单测(L0.5)表登记两份新文档,并同步修正 cfg_file 断言数。
|
2026-10-10 18:06:43 +08:00 |
|
wandering1
|
a2f5d1397a
|
主机单测:新增卷锁与时间同步两套用例(33+80 项)并登记钩子
- vol_lock(App/fs/vol_lock.c):33 用例。核心不变量是 fail-open——
互斥量创建失败时 vol_lock_wait() 必须返回 1 且绝不阻塞,因为调用者
defaultTask 是看门狗喂狗点;板端该路径只在内存耗尽时才可能走到。
- time_sync(App/sync/time_sync.c):80 用例。本模块是 N-17 看门狗风险的
全部逻辑贡献者,用例钉死分片喂狗节奏、监听退避、报文重组(半包/粘连/
EOF/真错/预算耗尽/tick 回绕)、重听门控;用 longjmp 跳出 for(;;) 任务循环。
- 两套均为纯逻辑主机侧测试,MSVC 离线编译真实源文件(#include 纳入)。
- 新增钩子 vol-lock-unit-test、time-sync-unit-test(7f/7g)。
- 全量主机单测:watchdog 39 + sys_clock 100 + cfg_file 149 + phasor 57
+ adc_input 70 + vol_lock 33 + time_sync 80 = 528 项,全绿。
|
2026-10-10 18:03:31 +08:00 |
|
wandering1
|
63c262fe2c
|
相量层单测:补 phasor_zero/init 清零用例(L1/L2 函数覆盖 20/20)
函数级覆盖审计发现 phasor_zero() 仅被 phasor_init() 间接执行、其效果
无可观测断言(init 同时把 s_ready 清 0,公开 API 看不到清零)。补直接
白盒用例:
- TC-PH-030 直接调 phasor_zero,四字段(含 fAm/fAmSQ)全清零
- TC-PH-031/032/033 先把双区写脏,init 后双区全零 + 使用区复位 +
就绪标志清(get -> -2)
- TC-PH-034 init 幂等
审计结果:App/algo 三个源共 20 个函数,0 个未覆盖。
相量层单测 57/57 PASSED(原 52)。
|
2026-10-10 17:48:13 +08:00 |
|
wandering1
|
696a1a49a9
|
主机单测:新增 ADC 输入层(L1)用例 70 项并登记 L1/L2 单测钩子
新增 App/algo/adc_input.c 的主机侧单测(L1),补齐 L1/L2 算法层
"每个函数都可离线验证"的最后一处空白。
- test/host/adc_input/{adc_input_test.c,run_unit_test.py,stub/}:
70 个用例,覆盖 6 个公开函数 + map_check + stm32_scan。
关键判据 = "通道号 <-> Rank 顺序 <-> 语义"三者映射:给每个 Rank
注入互不相同的码值,逐通道钉死映射(板端无信号源,无法验此项)。
另钉死 HAL 启动失败 / 轮询超时 / 参数错 / 无有效数据等分支。
- .pre-commit-config.yaml:登记 phasor-unit-test(7d)与
adc-input-unit-test(7e)两个主机侧单测钩子。
主机侧全套:adc_input 70/70、phasor 52/52,均 0 失败、无 /W4 告警。
|
2026-10-10 17:46:45 +08:00 |
|
wandering1
|
3762c03bb4
|
L2 相量层:采样环缓冲 + 全周傅氏 + 主机单测(台架间歇复位待查)
新增(均已通过主机侧单测与构建,**台架存在未定位的间歇性回归,见下**):
- App/algo/sample_ring.c/h:按语义通道的采样环缓冲(2 周波 = 40 点),
整帧压入 + 帧计数,供 L2 按窗取数。
- App/algo/phasor.c/h:全周傅氏相量层,覆盖规划 §3.2 的 L2-1/2/3/6/7——
系数表按 docs/算法/傅氏算法详解.md §2.3 预乘 √2/N(fAmSQ 直接即有效值);
5 个数据驱动实例(IA/UA/UN 基波 + IA 二/五次谐波);暴力滑动窗;
计算区/使用区双区原子切换。
- test/host/phasor/:主机侧单测(52/52 PASSED,无需桩)——系数表逐项复核、
幅值/有效值/相位、直流与谐波抑制、任意次谐波提取、频率敏感性(±2Hz≤3%)、
环缓冲时序与回绕、实例层与双区交换。
- 集成:adc_task 每拍压帧 + 重算(v2.4);app_main 调 phasor_init();
Keil 工程挂 phasor.c/sample_ring.c(App/algo 已在 IncludePath)。
验证:
- 主机单测 52/52 PASSED。
- @build 0 错误 0 警告;内存快照已刷新(RW_IRAM1 89,320→90,936 B)。
- 台架:L2 链路数据正常(ring=10001、skip=0、回读一致、相量日志可见),
但 10 次运行中 3 次出现 UI 任务看门狗停喂(mask=0x67 缺 TASK_WD_UI)
→ IWDG 复位;改动前基线 6 次运行 0 次。属**未定位的间歇性回归**。
未完成:定位并修复该间歇性复位;L2 文档状态与登记簿条目尚未按结论更新。
|
2026-10-10 17:39:37 +08:00 |
|
wandering1
|
5defabcabb
|
build: 删除 MDK-ARM/download.bat,烧录收敛到 stlink-flash skill
- test/run_all_suites.py 是唯一执行它的地方:DOWNLOAD_BAT 改为 STLINK_FLASH
(.dsh/skills/stlink-flash/scripts/stlink_flash.py);直烧改
[py, STLINK_FLASH, "flash"](原先把 .bat 包给命令行解释器执行);
--flash-cmd 改由同一常量拼出,不再硬编码 .bat 路径
- 机制变化(须知晓):原 download.bat 走 UV4 -f(CMSIS-DAP),现走
ST-LINK_CLI -P <hex> -Rst -Run —— 与 .serialtest/config.json 的
flash_cmd、AGENTS.md 烧录铁律、回读 -CmpFile 要求同源;6.5s/1MB
也快于 UV4 路径
- AGENTS.md / 环境与部署 3 篇 / ST-LINK_CLI 复位说明(原文写"正式流程仍以
download.bat 为准",已反转)/ 自动化测试流程 / 串口助手设计说明 /
链路延迟 / m2_data / README / MDK-ARM/README:引用改指 skill
- .gitignore:download_log.txt 条目保留并注明 legacy(他机残留物不变
untracked);build 日志注释同步
- 保留 MDK-ARM/reset.bat:其 hard/halt/run 子命令是 skill 没有的
- 刻意未改:docs/问题记录/项目审查与优化建议报告.md 的 P2-15(史实)
- 验证:run_all_suites.py --dry-run 解析出 skill 路径;doc-links 123 通过
|
2026-10-10 16:28:58 +08:00 |
|
wandering1
|
c77c5824f9
|
build: 删除 MDK-ARM/build.bat,@build 完全收敛到 keil-build skill
- test/run_all_suites.py 是唯一真正执行它的地方:BUILD_BAT 常量改为
KEIL_BUILD(.dsh/skills/keil-build/scripts/keil_build.py);两处构建点
改传 --timeout(脚本内超时先于 _run 超时触发,超时得 rc=1 + BUILD_FAIL
文案,而不是被 _run 杀掉)
- AGENTS.md / keil-build SKILL.md / new-machine-setup SKILL.md:删除
"等价原生入口"口径,改为注明该文件已于 2026-10-10 删除
- 环境与部署 3 篇 / 项目架构总览 / README / MDK-ARM/README /
download.bat 注释 / check_mem_numbers.py 提示串:移除 build.bat 引用
- 刻意未改:docs/问题记录/项目审查与优化建议报告.md 的 P2-14 / N-18
(历史审计条目;doc-links 不校验裸文件名,保留不影响门禁)
- 验证:keil_build.py --timeout 300 -> BUILD_OK / rc=0;
run_all_suites.py --dry-run 正确解析 skill 路径;doc-links 123 文档通过
|
2026-10-10 16:23:54 +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
|
883c9dd0cc
|
feat(adc): B1 实现 ADC 采集链路(adcTask + 看门狗)
B1(ADC 采集链路)落地,消化 P1-1:
- adc_task.c:空桩 -> 真实消费者。每 1ms 触发一次 CONVST,
用 tpafe5160_snapshot() 原子取数(AGENTS 铁律)+ 帧统计 +
每 10s 心跳日志。只取数,不做保护运算。
- Src/freertos.c:手工创建 adcTask(512 words / Normal,落
USER CODE 保护区,同 timeSyncTask 先例)。
- task_watchdog:新增 TASK_WD_ADC;required_mask 产品 0x37 ->
0x77、ENABLE_HW_LAYER_TESTS 0x35 -> 0x75。
- default_task.c:栈水位探针增列 adcTask(extern + 表项)。
- 脚本:stack_report.py 增 ROOTS/RUNTIME_ALIAS;gen_task_table
增 adcTask(README/AGENTS 任务表已 --write)。
- 单测:watchdog_test.c beat_all/掩码断言同步(39 断言全绿)。
- 文档:待处理内容/看门狗设计/RAM 方案/继保规划 同步。
验证:@build 0 错 0 警;stack_report 静态最坏链 504B(余 75%);
pre-commit 全绿。剩 @test 实机闭环。
|
2026-10-10 14:33:32 +08:00 |
|
wandering1
|
aac5f99fe9
|
移除 OpenCode 配置与命令,技能与串口单一配置源迁移至 .dsh/skills 与 .serialtest,同步更新全部文档引用
|
2026-10-10 14:05:36 +08:00 |
|
wandering1
|
0779d3a075
|
栈整改不抬栈:删旧档迁移、FIL静态化、日志行缓冲按模块收紧、钩子脱离HAL,defaultTask链5312→2776B
|
2026-10-10 10:17:00 +08:00 |
|
wandering1
|
61a6061950
|
串口助手补残行封顶与会话边界复位、截头按行对齐、open 保持 dtr/rts;判定加命中行/顺序/耗时/JSON 与产物清理
|
2026-10-10 03:17:16 +08:00 |
|
wandering1
|
fccf99bc90
|
测试闭环补固件身份戳、烧录回读校验与启动锚点计数,并修cmd引号解析与flash-cmd预检缺陷
|
2026-10-10 02:54:33 +08:00 |
|
wandering1
|
b37fdea21b
|
修复串口助手6处采集缺陷:wait-idle no_data与首字节门、log先过滤后截尾、HTTP独占绑定修正、超时不再误拉daemon、配置BOM容错
|
2026-10-10 02:33:44 +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
|
f4fea70749
|
docs: 合并 4 份待办文档为统一登记簿 待处理内容.md
合并 docs/待处理内容.md(N/S/T-x)、审查记录/项目审计改进清单.md(P-x)、
审查记录/下一步任务规划.md(阶段与基线)、审查记录/测试与架构改进建议.md
(S1x/A-x)为单一《待处理内容(统一待办登记簿)》。
- 结构:编号空间与来源 / 未闭环一览 / 任务排序(阶段 A~D)/
逐条详述 / 待验证与待确认 / 设计基线 / 诊断基线 / 内存预算 / 维护约定。
- 编号沿用且不回收;E-xx 仍由 错误码传播审计.md 独立维护。
- 删除 3 份被合并文档;重定向下游引用:README、AGENTS、审查报告、
实机测试实施指南、Net 层架构、NET/cfg 模块 README、脚本注释。
- 同步订正计数:P1=2(+1 收尾) / P2=10 / P3=6。
pre-commit 17/17 Passed。
|
2026-10-04 02:28:52 +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
|
33a4aa4945
|
本地工具路径DTU_*环境变量改造落地:10处调用点去硬编码+变量优先解析,本机全链路验证通过,文档同步收口,requirements补pre-commit
|
2026-10-02 22:14:49 +08:00 |
|
wandering1
|
930215f81a
|
修复IWDG超时未配置与dhara resume回滚:看门狗误复位与复位后写入全部丢失,台架全量自检PASS
|
2026-10-02 20:48:30 +08:00 |
|
wandering1
|
d1a2eaab07
|
修复run_boot_test路径解析:脚本在test/host/,仓库根需上溯两级(原REPO_ROOT只到test/,端口配置与串口助手路径全部解析错误)
|
2026-10-02 15:08:02 +08:00 |
|
wandering1
|
4a4cd29342
|
S7:@test闭环增加自检结论联合判定(selftest.log缺失或空=PASS、有64B记录=FAIL;FTP匿名抓取+本地副本两种来源)
|
2026-10-02 15:06:36 +08:00 |
|
wandering1
|
b0851b2f70
|
修复L0.5单测harness工具链探测:VS2026实际安装目录为18,补入VS_ROOTS(本机3项主机侧单测由ENV失败转PASS)
|
2026-10-02 15:00:31 +08:00 |
|
wandering1
|
d9425ddd23
|
测试:补启动段可观测性与模拟器差距清单,run_all_suites 加只编译模式(S10+S13+S6)
CI / L0 静态门禁 (pre-commit) (push) Successful in 1m10s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 25s
|
2026-10-02 13:57:25 +08:00 |
|
wandering1
|
fe963e7d91
|
测试:新增 cfg_file 主机侧单测并修复外科手术保存死码缺陷(S1-b+S2)
CI / L0 静态门禁 (pre-commit) (push) Successful in 49s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 17s
|
2026-10-02 13:00:54 +08:00 |
|
wandering1
|
fac9d1c409
|
测试:新增 sys_clock 主机侧单测并修复 Zeller 星期缺陷
|
2026-10-02 11:40:35 +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
|
73941da6b1
|
看门狗判定状态机增加主机侧单元测试(L0.5 层)
为 task_watchdog.c 的判定逻辑(位图取走清零 / 必需掩码 0x37 判定 /
miss_streak 连续 8 次停喂 / 100ms 抽样节流 / tick 回绕安全)补一层
主机侧纯逻辑单元测试,弥补此前只能靠真机或模拟器才能发现回归的空白。
架构(沿用项目既有"共享核心 + 平台后端"做法,参照 cfg_file_store):
- task_watchdog.h 末段新增"平台后端(内部)"声明 3 个钩子
(wd_platform_feed / _start / _tick_ms),MCU 端以 __weak 提供默认实现,
行为与重构前逐字一致(@build 0 错误 0 警告,Flash +20B)。
- 主机侧单测以同名强符号覆盖三钩子,即可离线注入/观测,无需碰 MCU 代码。
- 测试文件 #include 生产源文件本身,保证测的是真代码而非副本。
- 测试专用复位 task_wd_test_reset() 仅 TASK_WATCHDOG_UNIT_TEST 下编入,
MCU 构建零代码零符号。
测试(test/host/watchdog/,MSVC 离线编译,纯标准库驱动):
- 39 项断言全过(退出码 0);注入故障可复现退出码 1。
- run_unit_test.py 直接拼 INCLUDE/LIB 调 cl.exe,绕开本机被禁的 reg.exe。
- stub/ 三桩头覆盖 main.h / iwdg.h / dbg_log.h。
门禁:pre-commit 新增 watchdog-unit-test 本地钩子(L0.5 层),仅被测文件
或其测试变动时触发;测试开发标准流程.md 新增 L0.5 层说明。
顺带改善:task_watchdog.c 的节流基线 s_last_tick 由函数内 static 提为文件
static(可测性 + 模块状态归一)。
|
2026-10-01 06:57:01 +08:00 |
|
wandering1
|
22559365b9
|
整理 App 与 test 目录:按职责分子目录并同步全库引用
|
2026-09-26 12:52:39 +08:00 |
|
wandering1
|
39bd06adea
|
为自建代码目录补齐 README,建立目录级导航体系
- 新增 26 份目录 README:App/(+log,task,util,protocol)、Drivers/BSP/(+8子系统)、
Src/、Inc/、scripts/、tools/(+6子工具)、test/、MDK-ARM/、simulator/(+sim,tests)
- 每份含:定位、文件清单表、关键约束/陷阱、指向 docs 权威文档
- 第三方库与生成代码目录排除(CMSIS/HAL/Middlewares/Lib/SDL2)
- docs/文档规范.md 新增 §1.1b 代码目录 README 约定;根 README 目录结构加入说明
|
2026-09-26 12:25:36 +08:00 |
|