wandering1
|
491dd031f1
|
docs(任务规划): N-32 销项——监听生命周期根治已在 N34 全量落地
CI / L0 静态门禁 (pre-commit) (push) Failing after 46s
CI / L0.5 主机侧单测 (MSVC) (push) Failing after 43s
- 登记簿删 N-32 行:P1(`session_dead` 电平)/P2(单一重建所有者)均已
实施转正;pump 于 N34 阶段 3 并入 `net_reconcile_tick` 形态③④
- 结论沉淀核对齐备:设计文档 §10(已执行)+ D1~D10、N34 实施方案阶段 0~3、
陷阱记录 B10 行(✅ 已修 + `net_drop_conn` 根治出口)
- 设计文档勾掉两条 N-32 时代遗留清单项:U11~U15 实际落点=N34 机制盘点 +
E6 观察项;B10 行 2026-10-13 复核在位
- N34 README 提交表补终笔 `925058a` 行
- 正文其余 N-32 引用均为架构溯源名(pump/不变量 I),不动
- 门禁:`check_doc_links --all` 149 文档通过;ci_local L0+L0.5 全绿
|
2026-10-13 21:50:48 +08:00 |
|
wandering1
|
51472199b4
|
merge: task/N34-bsd-selfheal-audit 合入 v2-on-ui
任务 N34(24 个提交)经 task-worktree 回收:
- fix(NET)+docs: lftpd 对端地址修复、E6 裁决收口、陷阱编号迁移重排 TRAP-NET-01~21
- docs(问题记录): Trap 12 归档更正——FatFS 议题移入存储架构说明 §10.1
- docs(问题记录): CH395F Trap_Records 重组审计——合并、删误判、主题分章
- docs(N34): 网络不稳根因复盘总览(比喻版)+ 全景图 SVG 生成器
- feat(N34): E6 插桩 NET_U15_PROBE(U15 失配频率,默认关零成本)
- docs(N34): 阶段3 文档同步——reconciler 合并口径+net_drop_conn+Trap 补充
- feat(N34): 阶段3 net层收敛——单一reconciler+忙等统一+镜像降级+E-02收口
- docs(N34): E2/E3/E4 实验结果与定案 + bench 实验区复活
- feat(N34 阶段2): ch395f 五原语只加不接线 + Phase 15 套件 20/20
- docs(N34)+test: E13 僵尸会话根因坐实;Phase 11 判据修正+一次性报告
- feat(NET): N34 阶段 1.5 recv 语义主流化——无限默认+具名非阻塞+模式属性
- chore(scripts): doc-links 检查器在 GBK 代码页下崩溃修复
- feat(net): 服务器侧 KeepAlive 转正(§5.56,E11)+ Phase 11 重开回归
- docs(net): N34 E11/E12 实验记录与台架脚本(KeepAlive 服务器侧缺口、TSL 规格偏离)
- docs(net): E10 补收尾门禁结论(ci_local L0 32/32 + L0.5 951/951)与两处修复留痕
- chore(ram): 同步 RAM 快照/台账受管区至分支当前 .map
- test(time_sync): 单测断言随阶段1契约更新(handle_conn 不再 close)
- docs(net): N34 阶段0/1 实施结果与台架留痕(E10)
- refactor(net)!: N34 阶段1 API 面收敛(对账⑤ + 删 3 个手动自愈 API)
- fix(net): N34 阶段0 零风险清理 9 条(注释债/死码/三处小逻辑门)
- fix(net): N34 M3 矛盾态可疑门,风暴态免疫(E9 实证)
- docs(net): N34 E8 风暴态深查 + T6 核实 + E9 M3 记录
- fix(net): N34 P0 止血包 M1+M2+M4-lite,背靠背 STOR 8%→96.7%
- docs(net): N34 BSD 自愈审计与实施/实验方案(E0-E7b 台架记录)
|
2026-10-13 20:55:57 +08:00 |
|
wandering1
|
925058a5ae
|
fix(NET)+docs: lftpd 对端地址修复、E6 裁决收口、陷阱编号迁移重排 TRAP-NET-01~21
- lftpd:net_inet_ntoa 段序改 MSB 首 + 新增 net_getpeername,FTP 日志打印
真实对端地址(真机实证 192.168.1.2:55524,登记 TRAP-NET-21)
- E6:NET_U15_PROBE 命中=0(含压测)→ 阶段 3 项 4 不立项,U15 登记观察项;
插桩留仓(宏=0 零成本),soak 驱动 test/host/e6_soak.py 入库
- 编号:全库 Trap NN → TRAP-NET-<nn> 迁移并重排连续 01~21(单调映射,
沿革见 CH395F_Trap_Records.md 头注);死号 12/13/19/21 引用全部清除;
GD5F 域引用补正为 TRAP-GD5F-NN
- 陷阱文档全新化:索引 21 行行行真陷阱;删误判存档/发现时间/git 考古/
FTP 附录;台架纪律教训沉淀第六章方法论
- RAM:Code 211348→211456(+108 lftpd 修复),RW+ZI 净增 +4B;
优化方案/台账受管区/tsv 同笔同步
- ftp_abort_probe.py 挪 test/host/;引用关系图重生成
- 回归:@build 0/0;@test PASS;ftp_abort 10/10;relisten :7003 20/20;
ci_local L0+L0.5 全绿;E6 窗口零复位,7 条 WD stall 登记压测假象备查
|
2026-10-13 20:54:31 +08:00 |
|
wandering1
|
74ba7ea61b
|
docs(问题记录): Trap 12 归档更正——FatFS 议题移入存储架构说明 §10.1
- Trap 12 非 CH395F 议题(`CH395F驱动层审计.md` 早已点破;重组时仅就地
更正未搬家,本次补正)
- 完整内容与根因更正移入 `docs/架构设计/STM32F4-Base存储架构说明.md`
§10.1 第 14 项——与第 10 项「严格 8.3 短名」通用规则同处,各得其所
- 原址留移档存根(编号保留防旧引用断链,同 Trap 19 惯例);索引行改
↦、状态图例补「↦ 已移入他档」;待修清单措辞同步
- 全库确认 Trap 12 无代码引用;check_doc_links 两文件通过
|
2026-10-13 17:28:53 +08:00 |
|
wandering1
|
b445cbb464
|
docs(问题记录): CH395F Trap_Records 重组审计——合并、删误判、主题分章
- 合并同根因:Trap 14+17(残留 DISCONNECT 污染下一连接)、Trap 13+21
(recv_len 归零/接收冻结家族,非缺陷结案);FTP 改造清单表去重入附录 B
- 删当时误判叙述(各留一行误判存档):Trap 07 FIN_WAIT_2/RST 说、
Trap 18 bit0 迷思、Trap 25「芯片杀连接」解读;B1 KeepAlive 三段翻转
合并为定案链(E11 转正)
- 规范化:顶部索引表+状态图例;六主题章+附录 A 速查/附录 B 存档;
条目统一「状态/现象/根因(定案)/修复/回归判据/教训」格式
- 状态刷新:B5 对端 IP 显示已修(代码随收尾批提交)、B10 标 net_drop_conn
根治出口;Trap 17/20 措辞、Trap 12 根因(按 ff.c)、日期口径就地更正
- 编号永不重排(代码注释 123 处引用);跨文件断链 1 处改条目名引用
(生命周期设计说明 §877-878 → Trap 25「定案二」)
- 体量 1018 行/102KB → 420 行/64KB;doc-links 两文件通过
|
2026-10-13 17:12:57 +08:00 |
|
wandering1
|
c7459b393f
|
docs(N34): 网络不稳根因复盘总览(比喻版)+ 全景图 SVG 生成器
- 新增 网络不稳根因总览.md:七个误会(传达室比喻+机制+证据出处)→
环↔拆法↔落点对照表 → E13 僵尸会话 Mermaid 时序图 → 一句话总结
- 新增 tools/arch_diagram/gen_net_instability_svg.py(draw-diagram 规范,
纯标准库)与产物 docs/images/网络不稳根因总览.svg(headless Edge 目检两轮)
- N34 README:实施状态表补全阶段 1.5/2/3 与 E6 插桩行(原「阶段 2/3
未开始」陈旧口径修正);挂复盘总览为第一入口;§5.56 改紧邻写法
- 门禁:check_doc_links --sections-strict 本批 4 文件通过
|
2026-10-13 17:12:36 +08:00 |
|
wandering1
|
123d80afc7
|
feat(N34): E6 插桩 NET_U15_PROBE(U15 失配频率,默认关零成本)
实验方案 docs/网络/N34-自愈审计/实验方案.md §E6:验证「RX 非空但
readable=0」(RECV_OK 中断丢失的数据面形态)是否在生产真实发生,
门禁阶段 3 项 4(U15 内化)做不做。
- net_poll 末尾独立探测环:每 32 轮对在用 fd 发 GET_RECV_LEN,
RX>0 且 readable=0 → 计数 + 低频日志(首次必打,此后每小时 ≤1 条)
- bring_up 尾部 armed 日志(挂机期间核对烧录身份)
- 宏默认 0:产品构建编译剔除,实测体积与上一构建逐字节一致
(Code=211348 RO=18756 RW=1104 ZI=154232)
判据:24h 常态+E1 压测命中>0 → 项 4 立项;=0 → 盲收保留现状、
U15 登记观察项。
|
2026-10-13 15:15:22 +08:00 |
|
wandering1
|
f51c0833ae
|
docs(N34): 阶段3 文档同步——reconciler 合并口径+net_drop_conn+Trap 补充
- BSD_Socket_API_使用指南:五层自愈→四层(合一 reconciler 形态①~⑤+U11,
分级去抖②1/③④⑤2/①4轮+1s冷却);新增 net_drop_conn 小节(拆会话保
监听/幂等/EOF 不得调);变更记录追加 2026-10-13 行
- BSD_Socket_API_函数调用关系:pump 节点删除、net_drop_conn 链路新增、
驱动接口表补 sock_reset/cmd_done/缓存行、常量清单更正
- 网络Socket监听生命周期设计说明:新增 §10.10 合并说明,历史文本保留+注记
- Net层阻塞模型架构设计:主循环 3 tick 口径 + 附录 B 追加
- RAM使用分析与优化方案:netTask 链尾改 retry_tick→relisten(1944 B 不变)
- CH395F_Trap_Records:Trap 07 补充(close 无 RST:对端内核存活不 close
→ FIN_WAIT_2 长尾,兜底 E13);Trap 09 补充(LISTEN 态二段关闭)
- 实施方案 §5:项1/2/3/5 ✅、项4 受 E6 暂缓、§5.1 E-02 收口、§5.2 延后项
- 实验方案:E-02 收口台架小节(FIN_WAIT_2/TIME_WAIT ~150ms/双 PASS)
- N34 README 裁决行更正;Test_Guide TC-NET-1101 pump→reconciler 形态③④
历史变更记录与历史事故描述一律原文保留、只追加;check_doc_links
--sections-strict 对改动文件 0 问题;乱码 0、无 BOM 变化。
|
2026-10-13 15:10:54 +08:00 |
|
wandering1
|
6394853fef
|
feat(N34): 阶段3 net层收敛——单一reconciler+忙等统一+镜像降级+E-02收口
实施方案 docs/网络/N34-自愈审计/实施方案.md §5 项1/2/3/5(项4 U15受E6暂缓):
- 3a 合并reconciler:net_listener_pump删除,与net_reconcile_tick合并为
单一100ms tick;判据读驱动状态缓存(唯一刷新点=net_poll每轮全量刷新,
E2背书18.1us);去抖分级②=1/③④⑤=2/①=4轮(M3让位窗400ms保留)+冷却1s;
链路态订阅留痕(F-DRV-13);探针去抖删除(F-MS-9)
- 3b 忙等统一(P2b):listen/connect open重试与close排空循环改
net_sock_reset_sync(驱动sock_reset:读空RX→CLOSE→排空事件→等
byte0=00H,内置LISTEN态二段CLOSE补发);close不再读清全局中断寄存器
(F-NET-7);net_poll每轮步进活跃复位状态机(驱动契约,防搁浅)
- 3c 镜像降级:net_sock_state_t声明为本层会话投影,芯片事实源=驱动缓存
- E-02收口:新API net_drop_conn(拆会话保监听,QUARANTINE语义,幂等;
模拟器双端实现;timeSync 30s预算耗尽接入;主机单测TC-TS-027d)
定案:CH395F close无RST,对内核存活不close的对端停FIN_WAIT_2,
监听恢复受限于对端close(Trap 07补充),兜底=E13 keepalive/TIMEOUT
台架全绿(Code=211348 RW=1104 ZI=154232):@test PASS;[STACK] net
1116/3840;Trap22 :7003 50/50+:21三档各50/50;Trap23 RST10/10+FIN5/5;
Trap25 n30 11/11;E-02双PASS;iec104 18/18;对时跨会话连续;
ftp_regression 11/11;integrity 15/15 SHA;ci_local L0+L0.5全过。
|
2026-10-13 15:09:58 +08:00 |
|
wandering1
|
83a70721bd
|
docs(N34): E2/E3/E4 实验结果与定案 + bench 实验区复活
E2:状态回读 18.1us(N=1000x2 逐值一致);LISTEN 可见延迟 100%
<=10ms 无长尾(24 轮)-> "每 poll 全量刷新"成立、reconciler 去抖
可减为 1。
E3:GET_CMD_STATUS 对 OPEN/LISTEN/CLOSE 无判别力(残留假阳性),
定案 cmd_done 用状态回读判据;SET 类命令态永不更新。
E4:排渣序列定案=读空 RX -> CLOSE -> 排空事件(quiescent) ->
轮询 byte0=00H;C 变体(不排渣)0/20 且级联自持,Trap 23 残渣
恰等于单 Socket RX 缓冲整容(rxdrain=2048,19/20)。
E2 补充发现(Phase 15 板测):LISTEN 态 CLOSE_SOCKET 二段关闭
(一次只拆监听 byte0 恒 05,再发一次才落 00)——Trap 09 open
重试环的芯片级原因。
bench:ch395f_reuse_bench.c 复活 N30_CHIP_BENCH 门控实验区
(旧 N-30 矩阵 s_bench_legacy=0 停泊),ch395f_reuse_host.py
增 --mode e4。注册(uvprojx/main.c)实验完已还原不入库。
|
2026-10-13 12:43:56 +08:00 |
|
wandering1
|
f7f17931c9
|
feat(N34 阶段2): ch395f 五原语只加不接线 + Phase 15 套件 20/20
实施方案 docs/网络/N34-自愈审计/实施方案.md §4 五原语,形态按
E2/E3/E4 定案(实验方案.md):
1. 类型化状态回读 + 每 Socket 缓存(open=0 时 tcp_state 哨兵
0xFF;sn>7 边界返 {00,FF} 计 fault);
2. 事件护栏 ch395f_sock_events:只读本 Socket SINT,全局寄存器
唯一读者=net_poll(F-NET-7 契约);
3. ch395f_sock_reset_begin/poll 非阻塞状态机:读空 RX -> CLOSE
-> 排空事件(quiescent 2 轮) -> 轮询 byte0=00H;GRACEFUL/
QUARANTINE 最短等待 100/400ms(Trap 23);WAIT_CLOSE 内置
LISTEN 态二段 CLOSE 补发(TC1502b 实证 ~180ms 落定);
4. ch395f_cmd_done 状态回读判据(E3:GET_CMD_STATUS 对
OPEN/LISTEN/CLOSE 无判别力);
5. 链路态缓存 ch395f_glob_event_feed + link_up/变化计数
(B9 判据 PHY!=DISCONN)。
Phase 15 板测(硬件层模式,Socket 7,无需 PC):20/20 PASS,
含二段关闭语义断言(一段 05/00、二段 byte0=00)。
RAM +56B < 64B(g_sock_state 16B + g_rst 32B + 链路/fault 8B);
产品 Code 与阶段 2 前逐字节同 209780(无调用者被链接器裁剪)。
@test PASS;relisten_stress 20/20、n30 3/3 零回归。
RAM 台账同步:RW_IRAM1 97952B 74.7% / RW_CCM 57376B 87.9%。
|
2026-10-13 12:43:17 +08:00 |
|
wandering1
|
33405a57b5
|
docs(N34)+test: E13 僵尸会话根因坐实;Phase 11 判据修正+一次性报告
E13(实验方案.md 新增 + E8/E11/E12 口径修正):
- 风暴态根因=僵尸会话,非芯片残渣:PC 网卡禁用/链路断开时
Windows 直接丢弃 socket 不发 FIN/RST → 芯片侧 ESTABLISHED 僵尸
→ 单连接监听被占(:21 拒连)→ 下一 PASV 重监听与僵尸竞态
(accept 为垂死僵尸开枪 20ms 后 DISCONNECT)→ lftpd 5s 窗空转
→ 425;每失败轮再生僵尸 → 自续数分钟
- "残渣跨烧录存活/需断电冷启动"口径作废:板上 CH395F RSTI 接
MCU NRST(V0.0 网表 :174),每次烧录即芯片硬件复位;"存活"是
锤击再生错觉。正确控制=下一臂前静置 ≥90s 清僵尸窗
- 自愈链端到端验证:TIMEOUT(在途 TX ≈30s)/keepalive(空闲 60/5/3)
→ pump → relisten → 端口恢复;E11 产品路径验证 17s 判死 PASS
- 4 元组复用假设被否(pasv_probe.py:PASV 端口递增、PC 源端口随机)
- e02_probe listener=FAIL 重解读:探针挂起 socket 未关(PC 内核
代 ACK keepalive)→ 拒连是单连接正确行为;真缺口=应用无法主动
拆会话 → 阶段 2 sock_reset 职责
Phase 11 测试修复(net_test_task.c,实跑暴露):
- 判据 >=60000ms 是按手册公式写的,实测判死 18~31s 会在正确固件
上假 FAIL → 改有界窗 10s~120s(下限防误杀存活空闲会话,上限
防判死缺位)
- 报告后不释放 phase_active → 对已死连接 10ms 节奏刷 594 条假
FAIL → phase11_run 返回完成态,主循环释放等新连接再测
- 复跑两轮验证:30137ms 单次 PASS → 自动等新连接 → 二轮 accept 正常
- Test_Guide TC-NET-1101 判据/耗时同步;ch395f_test.h Phase 14
共存安全性注释(有整体超时不永久挡 accept)
工具:test/host/pasv_probe.py(每轮打印 PASV 端口+PC 源端口+结果)
|
2026-10-13 11:23:40 +08:00 |
|
wandering1
|
d346e4ee84
|
feat(NET): N34 阶段 1.5 recv 语义主流化——无限默认+具名非阻塞+模式属性
核心语义(实施方案 §3.5):
- net_recv 默认无限阻塞:删除 NET_RECV_TIMEOUT_MS(30s 隐藏默认预算),
超时归调用方策略;唤醒源=数据/EOF/close/网络重建(CONNRESET),
会话死亡由对账① ~400ms 判死兜底,无"对端消失永久挂死"窗口
- 新增 net_recv_nb(NET_MSG_DONTWAIT 路径转正具名)与
net_setblocking(fd,on)(阻塞模式挂控制块属性,对齐 O_NONBLOCK/
Python setblocking;直写单字节,net_set_event_cb 先例)
- net_types.h net_sock_t 新增 blocking 属性;net_socket() 默认置 1
(close memset 清零后显式重置,同 released_abnormal 纪律)
- 原 1s 强制了结看门狗降级为 60s tripwire:只 [ERR] 留痕一次,
绝不伪造 TIMEDOUT 返回值(旧实现掩盖完成路径缺陷)
- net_recvfrom 删 30s 自旋超时、同判据对齐(零生产调用者,注释警示)
- 文档契约:IWDG required_mask 内任务禁止无限阻塞 recv(BSD 指南
§3.5/§10.1 + net_socket.h 注释)
调用点审计(§3.5.5):零生产调用点采用无限默认——iec104_serv/
ui_net_sink 转 net_recv_nb(受监控任务逐位等价);lftpd/time_sync
已是显式预算 net_recv_to 不动;32 轮盲收兜底未动(阶段 3 E6 门禁)
模拟器双端镜像 net_recv_nb/net_recv_to/net_setblocking(包装层
Sleep(1) 轮询模拟阻塞);差距清单 N-3/N-6 登记义务已履行
门禁与台架:
- @build 0/0:Code 209580→209780(+200B) ZI +32B;RAM 受管区官方
脚本同步;ci_local L0 32/32 + L0.5 951/951
- 台架全回归:relisten :7003 50/50、iec104 18/18、对时正常、
ftp_regression 11/11、Trap23 RST 5/5+FIN 5/5、ftp_integrity
20/20 字节一致、n30 0/10、@test PASS
- 模拟器 build_sim OK + check_remo_sink 黄金参考 0/25600 位差
队友 p15-recv-semantics 实施,Lead 全量审阅 + 独立复跑门禁与回归
|
2026-10-13 11:23:19 +08:00 |
|
wandering1
|
8f902e09fd
|
chore(scripts): doc-links 检查器在 GBK 代码页下崩溃修复
- 钩子环境为系统代码页 936(GBK)时,打印含 U+26A0 等字符的告警列表
触发 UnicodeEncodeError,检查器以退出码 1 崩溃(假阴性变假阳性拦截)
- 修复:入口处对 stdout/stderr reconfigure(encoding=utf-8, errors=replace)
- 验证:GBK 复现 traceback → 修复后跑完;Compare-Object 逐行比对修复前后
正常环境输出字节一致;py_compile OK;无 BOM 变化
- 由 N34 任务队友 fix-doclinks-encoding 实施,Lead 复核
|
2026-10-13 11:22:43 +08:00 |
|
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
|
eac36526e7
|
docs(net): E10 补收尾门禁结论(ci_local L0 32/32 + L0.5 951/951)与两处修复留痕
|
2026-10-13 06:53:42 +08:00 |
|
wandering1
|
bfbe24e423
|
chore(ram): 同步 RAM 快照/台账受管区至分支当前 .map
本分支(task/N34-bsd-selfheal-audit)自身的代码增长(net_listener.c 等)
从未刷新 RAM 文档受管区,导致 mem-numbers/mem-budget 在分支上长期失败
(任何 App/*.c 提交都会撞),此前用 --no-verify 绕过。
- `scripts/check_mem_numbers.py --write`:docs/内存管理/RAM使用分析与优化方案.md
ER_IROM1 227,824→228,172 B、Flash 合计 228,928→229,276 B
- `scripts/ram_baseline.py --write`:docs/内存管理/RAM预算台账.md 同源数字
RAM 两区(RW_IRAM1 97,864 B / 74.7%、RW_CCM 57,376 B / 87.9%)未变——
印证 N34 阶段 0/1 未改动 RAM 占用(仅 Flash 少量增长)。
验证:check_mem_numbers.py --scan "内存数字一致";ram_baseline.py --gate
"PASS:RW_IRAM1 74.7% / RW_CCM 87.9%(阈值 92%)"。
|
2026-10-13 06:52:08 +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
|
d5bdc6eb54
|
docs(net): N34 阶段0/1 实施结果与台架留痕(E10)
- README:新增"实施状态"表(9ac9879/ae17d36/4c0a0af/b8c6a3d);§2 逐机制
裁决表补"✅ 已实施"与关键坑位索引
- 实验方案:新增 E10 —— 阶段 0/1 转正验证全记录,含阶段 1 首版台架失败的
根因链(armed 漏放行 ESTABLISHED → i104 整场饿死 18/18 FAIL → 修复后
18/18 PASS、127s→8.3s)、M3 无辜旁证、time_sync 连续 6 轮实测、
两处实施偏差(lftpd 未走 listener_try;阶段 0 提交合并)
- 实施方案:阶段 0/§2、阶段 1/§3 标注完成与验证判据;P0 转正标注
- 盘点:F-NET-2/3/4/13/14 补实施结论;⚠ F-NET-4 补"门控迁移必须给
net_listener_armed 补 ESTABLISHED 放行"的坑位说明;net_listener_try
调用点计数 5→4;§2/§4 的缺口表述改闭环状态
- 顺带修正两条既有 doc-links 违规(实验方案 §4.4 → 实施方案 §4 第 4 项;
盘点 §5.29 → docs/芯片手册/CH395F.md §5.29),该 4 份文档 doc-links
现 Passed
无代码改动(纯文档)。
|
2026-10-13 06:46:40 +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
|
ae17d36f5a
|
fix(net): N34 M3 矛盾态可疑门,风暴态免疫(E9 实证)
F-NET-17:E7b 后残余实为风暴态(同固件 2%~54% 随芯片残渣摆动)。
陈旧 DISCONNECT(拆链完成滞后锁存,T6 修正:非 close 命令产生)在
accept 后 ~11ms 杀新数据连接,D20 对其结构性失明(0x05/0x00 与真
断开读数不可分辨)。
- handle_disconnect_event:矛盾态可疑门 = 0x05/0x00 且
lost_conn_seen==0 且 recv_bytes==0 且芯片 RX>0 → 不吃边沿,交
对账①电平去抖认领(对账零改动;E9 实测 71 suspect 全部正确接管)
- handle_connect_event:两 ESTABLISHED 分支清 lost_conn_seen(T6
前置:探针残留会使判据首轮被旁路)
- E9 三轮收窄:R1 无数据门 → Trap23 探针 0/5(真死连接被延 ~1.2s
对账冷却);R2 无 RX 门 → :21 @0ms 46/50(零数据快复连被误延);
R3 资产门 = "RX 有在途数据=消费者资产"同源红线,全绿
E9b 回归(Code=209552,0 错 0 警):n30 0/50+0/20(探针预置残渣
最恶劣前置,同前置基线 27/50);ftp_regression 11/11;:21 @0ms
50/50;:7003 p50=1007;iec104 18/18;Trap23 RST/FIN 5/5+5/5;
@test PASS。证据 → docs/网络/N34-自愈审计/实验方案.md E9 节。
门禁说明(--no-verify 依据):doc-links 36 项全为工作树 junction
伪影(SDL2 第三方文档,本批零命中);mem-budget = 分支 .map 与主
树台账漂移(本改动 ZI/RW 不变),台账合并后回补。cppcheck /
coding-standard 手跑 Passed。
|
2026-10-13 05:38:26 +08:00 |
|
wandering1
|
b8d87c62d7
|
docs(net): N34 E8 风暴态深查 + T6 核实 + E9 M3 记录
- 实验方案:E8(状态依赖矩阵 2%~54%、风暴签名、三缺陷机制)
+ E9(M3 三轮迭代判据演进表与裁决、遗留观察归因)
- 盘点:F-NET-17 风暴态节 + T6 补充节(TC-NET-204 模式 C 证伪
"close 产生锁存"强形式,锁存生成者=拆链完成事件;泵/救回同
缓冲竞态证实;M3 补丁设计与 M5 drain-until-quiescent 状态机草案)
- 实施方案:§1.5 E8 修正(残余非稳定 3% 而是风暴态,M3/M5 互补)
|
2026-10-13 05:38:21 +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
|
a0b9d27821
|
docs(net): N34 BSD 自愈审计与实施/实验方案(E0-E7b 台架记录)
五层自愈机制盘点(F-NET-1..15)、CH395F 驱动层审计(F-DRV-1..16)、
主流方案对照(ioLibrary/FreeRTOS+TCP/mbed/Zephyr)、实施方案
(阶段 0..3 + P0 止血包 + 阶段 1.5 recv 语义主流化)、实验方案
(E0/E1/E5/E7/E7b 实测数据与判据)。
关键结论:
- 对账是冷路径(E0:3.5h 零命中);D10 沉降/重试是每次断连热路径
- 断连→pump→重建产生 ~0.3-1s 监听空窗/会话(E1 :7003 p50=1020ms)
- n30 背靠背 STOR 基线 4/50(F-NET-15 自持失效循环,首个入库可复核
背靠背数据;Trap 25 终版回归只含有间隔 ftp_regression 是测试面根因)
- E7b:M1+M2+M4-lite 止血包 116/120,残余 ~3% 偶发(M3 域)
- 静默回收形态 ~110 次连接零复现(F-NET-2 降为阶段 1 顺带修)
|
2026-10-13 00:05:49 +08:00 |
|
wandering1
|
09d6195906
|
chore: 收口已结束会话遗留的本地改动(RAM 台账/AGENTS/SOE 日志)
CI / L0 静态门禁 (pre-commit) (push) Failing after 1m12s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 17s
提交此前已结束会话在主工作区遗留、未提交的改动:
- docs/任务规划/ 与 RAM 占用台账、快照的同步更新
- AGENTS.md 索引与 scripts/ram_baseline.tsv 更新
- docs/测试说明/boot_log_data/ 新增 B9 IEC104/SOE 台架日志与解码产物
- .pre-commit-config.yaml 微调
来源为该会话结束时的未提交快照,整体收口便于并入 master。
|
2026-10-12 20:10:12 +08:00 |
|
wandering1
|
6cbf4003f2
|
merge: task/B9-soe-record 合入 v2-on-ui
CI / L0 静态门禁 (pre-commit) (push) Failing after 6m7s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 20s
任务 B9(1 个提交)经 task-worktree 回收:
- feat(soe): B9 动作记录 + 时标 SOE(L4-4/L4-5)+ 104 M_SP_TB_1 自发
|
2026-10-12 19:44:37 +08:00 |
|
wandering1
|
c077e9a481
|
merge: 远程 CI 分支 v2-on-ui-ci 合入 v2-on-ui
CI / L0.5 主机侧单测 (MSVC) (push) Has been cancelled
CI / L0 静态门禁 (pre-commit) (push) Has been cancelled
将 origin/v2-on-ui-ci(13 个提交:远程 CI 文档独立成 docs/CI/、
runner 保活/日志编码/gitlint 空转修复、ci_local L0b 等)合入开发主线。
冲突 5 处,按「两侧意图取并集」解决:
- AGENTS.md / docs/README.md:保留主线 待处理内容.md→任务规划/ 重构,
并入 CI 分支的 docs/CI/ 索引行与更新日志
- 测试开发标准流程.md §9.1:取 CI 分支,引用改指
../CI/远程CI完整指南.md 对应小节
- docs/待处理内容.md:接受主线删除,已重构为 docs/任务规划/
- docs/环境与部署/CI配置指南.md:接受 CI 分支删除,已并入 docs/CI/
合并引入的 doc-links 失效已修(doc-links 合并态走 --sections-strict,
自引用解析失败即硬错误):
- CI 指南 §0.0 标题把 ⚠️ 移到编号后(编号须打头才解析得出)
- CI 指南对 待处理内容.md 的引用改指 docs/任务规划/登记簿.md T-7 条
- CI 指南并入来源《测试开发标准流程》§9.4 / §9.2 改为全路径限定
- 测试开发标准流程 §9.4:§0.2/§2/§2.4/§4.1.3 原与 CI 文档路径间隔
超过链式继承上限 40 字符,改为紧跟路径并拆分明细句
- 测试开发标准流程 §9.1:步骤级细节引用同样全路径限定到 CI 指南
|
2026-10-12 19:42:24 +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
|
0d39cf63b1
|
docs(b8): B8 销项回填——freq 钩子登记 + 规划 L3-5/P2 置位 + RAM 快照再生
- RAM 快照再生(合并后 .map):RW_IRAM1 96,776 B(73.8%)/ CCM 不变 /
ram_baseline.tsv 追加 B8 行(B8 分支 --no-verify 时欠的两条钩子在此补平)
- .pre-commit-config.yaml:新增 freq-unit-test(31→32);prot-elm /
iec104 两钩子 files: 追加 App/algo/freq
- AGENTS.md:钩子计数 32 / 单测 14;算法层行补 freq = L2.5 测频(B8)
- pre-commit 使用说明:§2.21 freq-unit-test 详解 + 计数同步
- 保护规划:§3.3 L3-5 置 ✅(软件侧)、§7 P2 更新、变更记录 B8 行
(自适应窗三代弯路 0.317→0.197→0.0101 Hz、J1~J6 判据、blob VER 1→2
换代/损坏分流、prot_elm 7→9、OF/UF 暂只经 YX15 可见归 B10 分点)
- W1 卡:B8 销项删行;M2 注 B8 ✅;mermaid 代码道只剩 B9;
写范围注更新(B9 sync 时 iec104_test.c 两边叠加)
- 任务规划 README:代码道 B7✅→B8✅→B9
- 合并侧已完成:merge 37f74f0(@build 0/0,L0 全绿)
- 验证:doc-links 全绿(142 文档)
|
2026-10-12 19:29:34 +08:00 |
|
wandering1
|
c9aa12e8bd
|
fix(arch_diagram): 生成器自写尾换行(gen_net_pending/gen_memory)
gen_*.py 里 8 个已自带尾换行('...</svg>\n'),仅
gen_net_pending_svg.py 少一个尾 \n → 每次重跑都被 pre-commit 的
end-of-file-fixer 补回,产生无意义的 1 行尾差异。
- gen_net_pending_svg.py: return "\n".join(svg) + "\n",
并把 open(...) 补 newline="\n"(与其余生成器一致)
- gen_memory_svg.py: open(...) 补 newline="\n"(输出本已带尾换行)
重跑验证:Net层阻塞模型.svg 与已提交 blob 逐字节一致
(hash-object --path 相同、git diff 为空);内存 3 张 SVG 亦无差异。
|
2026-10-12 19:26:28 +08:00 |
|
wandering1
|
37f74f0b37
|
merge: task/B8-freq-protection 合入 v2-on-ui
任务 B8(1 个提交)经 task-worktree 回收:
- feat(algo): B8 频率测量层 + 过频/低频保护(L3-5)
|
2026-10-12 19:19:14 +08:00 |
|
wandering1
|
01b9a90f45
|
docs(net): 同步 docs/网络 之外残留旧函数名(测试说明 + 生成图)
docs/网络/ 主体已在 1a17d73 更新。自查发现两处「现状性」引用
仍用旧函数名(历史记录类保持原样,不改):
- docs/测试说明/链路延迟测试说明.md §8 D10 排障行:
net_relisten_try/retry_tick → net_listener_try/retry_tick
- tools/arch_diagram/gen_net_pending_svg.py 主循环标签
net_relisten_retry_tick() → net_listener_retry_tick(),并重跑
生成 docs/images/Net层阻塞模型.svg(该图被 Net层阻塞模型架构设计.md 内嵌)
|
2026-10-12 19:18:38 +08:00 |
|
wandering1
|
ea10dbae53
|
修 gitlint 门禁在 CI 空转:runner 无 git 身份致 254 被误报成信息违规
CI / L0 静态门禁 (pre-commit) (push) Successful in 3m41s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 33s
task 31(首次真跑出的 L0)失败与提交信息无关:actions/checkout 把 HOME
指向每次任务的临时目录,SYSTEM 账号没有全局 git 身份,gitlint 在读到任何
规则之前就以 Missing git configuration: please set user.name 退出——254
是配置错误,不是规则违规。旧脚本还把失败原因写死成"标题超 100 字符",加
上该步 exit 1,后面 26 个钩子一个都没跑。
改三处:① 先探测身份,缺失则用 GIT_CONFIG_COUNT/KEY/VALUE 注入一次性身
份,只进子进程环境、不写任何文件,开发者机器不受影响;② 254 与真实违规
分开报(2 = 门禁没跑起来,1 = 信息确实违规),不再替 gitlint 猜规则;
③ 钩子输出改走 ForEach-Object { "$_" },避免 PS 5.1 把原生 stderr 包成
ErrorRecord 污染日志。
实测:空 HOME 下同一条命令改前 254、改后 0 failed;正常环境 10 条提交全
过;脚本纯 ASCII、解析 0 错。同批文档:§7 排障表新增本坑与"新建分支首
次 push 不触发 run",两份变更记录各加一行。
|
2026-10-12 19:17:11 +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
|
1a17d73e35
|
docs(net): N-32 监听生命周期文档同步(4 tick/五层自愈/net_listener.c)
N-32 把监听生命周期抽为 net_listener.c,并把周期性重建收敛到
唯一入口 net_listener_pump;文档与代码注释滞后于实现,本次同步:
- 主循环自愈 tick 3 → 4(新增 net_listener_pump,100ms)
- 自愈分层 四层 → 五层(新增 N-32 pump 行)
- net_reconcile_tick 对账收窄为 ①②,③④ 移交 pump
- 函数更名:net_relisten_try/clear/retry_tick → net_listener_*
- Trap 23 沉降等级订正:异常 400ms / 正常 100ms(正常 FIN 亦沉降)
- net_socket.c 注释同步(四个自愈 tick、函数名、pump 条目)
权威设计见 docs/子系统设计/网络Socket监听生命周期设计说明.md §10。
|
2026-10-12 19:16:31 +08:00 |
|
wandering1
|
2fdc5f6dda
|
修 ci.yml 注释写死的钩子数:改为"报告数 = 定义数 − 1"
CI / L0 静态门禁 (pre-commit) (push) Failing after 1m10s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 31s
钩子数在两个分支上不同(master 18、v2-on-ui 26),注释里写死 18/17 会让
另一分支上的读者按错数字去核对,正是本轮文档清理里修掉的同类漂移。头部
注释改为讲规则并给分分支实测快照;run 块内那行同步改成纯 ASCII 的规则
表述,避免增删钩子后再次过期。
同时作为非文档路径的普通 push:新建分支 v2-on-ui-ci 的那次 push 没有产生
run(runner 在线且空闲,job 日志最新仍是 10-03),怀疑新建分支的 push 拿
不到变更文件集、被 paths-ignore 滤空,用这次提交验证。
验证:YAML 可解析、全部 run 块纯 ASCII、无 BOM、LF;pre-commit 对该文件
通过。
|
2026-10-12 19:04:09 +08:00 |
|
wandering1
|
e5d3dc1205
|
fix(task-worktree): build/bench 分锁 TTL + done 自动接管陈旧锁
A:LOCK_TTL_HOURS 由全局 6h 改为按锁分设(build 1h / bench 6h)——
兜底窗口应与操作真实时长同量级:编译是秒~分钟级,6h 太钝。
并支持 lock acquire --ttl 自报窗口(keil_build 按其 --timeout 自报,
timeout/3600+15min,下限 0.5h),使 build 锁窗口自动跟随构建上限。
B:done 收口前置把陈旧锁视为空闲并自动释放(原为硬失败),
仅当锁仍被有效占用时才拒绝。
新增 lock_ttl_hours / lock_is_stale / release_stale_locks 三个辅助;
lock status 显示各锁 TTL;cmd_done 改调 release_stale_locks。
验证:20 项 TTL 探针 + 5 项 lock_cli 接线探针全绿;
假 UV4 端到端(exit 0 自持自释、payload ttl=0.5)与 busy 路径(exit 4)。
|
2026-10-12 18:59:49 +08:00 |
|
wandering1
|
3c7ad9c75c
|
fix(skill): 修正 @build 退出码口径不符(环境错误 1→2、用法 2→3)
`AGENTS.md` 与 `keil-build` / `new-machine-setup` 的 SKILL.md 一直写着
"2=UV4 未找到/无效(环境错误)、3=用法",但实现是反的:
- 环境错误走 `raise SystemExit("...")` → **实际退出码 1**(与"构建失败"
撞号,调用方分不清"编译不过"和"UV4 没配好");
- 用法错误由 argparse 抛 `SystemExit(2)` → 恰好占用了文档里"环境错误"
的位置,于是 `new-machine-setup` 里"报 exit 2 先分清真没设还是没继承"
这条排障指引**从未生效**。
改法(让实现服从既有文档口径,而非改文档):
- 新增 `BuildEnvError`;`find_uv4` / `find_project` / `load_config` 失败
一律抛它,由 `main()` 捕获 → 打印 + 退出码 **2**;
- 覆盖 argparse 的 `error()`(默认 `SystemExit(2)`)→ 用法错误退出码 **3**;
- `run_build` 的档案解析失败原为 `return 3`(用法),实属环境错误 → 并入 2。
调用方安全性:`test/run_all_suites.py` 与 `task-worktree` 的 `run_script`
都只判 `rc == 0` / `rc != 0`,不区分具体码,故本次改动不影响它们。
验证(全部实测,用假 UV4 避免与在途构建争 UV4 与 build 锁):
| 场景 | 期望 | 实测 |
|---|---|---|
| `--help` | 0 | 0 |
| 成功构建(假 UV4 写 0E0W) | 0 | 0(BUILD_OK) |
| 构建失败(假 UV4 写 `error:`) | 1 | 1(BUILD_FAIL) |
| `--project` 不存在 | 2 | 2 |
| 档案 `uvprojx` 不存在 | 2 | 2 |
| 档案 JSON 解析失败 | 2 | 2 |
| 未知参数 `--bogus` | 3 | 3 |
| 参数缺值 `--timeout` | 3 | 3 |
| build 锁被占用 | 4 | 4(B9 在构建时实测) |
同步更新 `AGENTS.md` 的退出码行(补 2 的完整含义与 4)与 `keil-build`
SKILL.md(记录本次修正的来龙去脉)。pre-commit 全绿。
|
2026-10-12 18:49:24 +08:00 |
|
wandering1
|
8cd815d046
|
docs(ram): N-33 销项回填——台账登记抬栈 +1536 B,M1 台架闭环达成
- RAM预算台账 §6:defaultTask 1024→1280 / timeSyncTask 512→640 words,
堆内用量 +1536 B(配额 56 KB 不变);min_ever 预算 8464 = 实测吻合
- RAM使用分析 §2.3:N-33 注记 + 表更新(default 3016/2104 41%、
timeSync 1264/1296 50%、netTask 复测 1944(N32 监听模块化后链)、
adcTask 复测 1320)
- Src/freertos.c 栈注释:netTask 1872→1944、adcTask 补 2026-10-12 复测值
- W1 卡:N-33 销项删行;M1 判据全满足 ✅ 达成;mermaid 台架道清空、
M1((✅));B8/B9 行转 🟦(worktree 进行中,方案已审)
- 登记簿:N-33 行删除(证据已沉淀两份内存文档 + W1 卡 §1 指针)
- 合并侧已完成:merge c95a9cd(done N33,9 任务 0 FAIL + @test PASS)
- 验证:doc-links 全绿(142 文档)
|
2026-10-12 18:36:04 +08:00 |
|
wandering1
|
4bad54b607
|
merge: master 的远程 CI 修复带入 v2-on-ui(门禁数字改为分支中立)
把 master 上本轮 10 个 CI 相关提交合入 v2-on-ui,使该分支同样具备可用的
runner 保活与本地门禁自查能力。合并只涉及文档与脚本,零 C 代码改动。
冲突两处,均按"保留 v2-on-ui 新版结构 + 搬入语义"解决:
- AGENTS.md:丢弃 master 侧已被瘦身版取代的旧门禁 bullet,保留其分层边界
行;把"CI 资料集中在 docs/CI/README.md、只跑本机一台 runner"这条指针
并入新版 CI bullet 与文末索引表。
- docs/README.md:两侧都是变更记录历史行,按日期先后并列保留。
数字口径改为分支中立:本分支 26 个钩子 / 10 个主机单测套件,master 是
18 / 3,写死任一数字都会让同一篇文档在另一分支上失真。指南 §6 验收第
8 行、§7 排障表、§10 验收标准改为讲规则(报告数 = 定义数 − 1;runner 数
= test/host 下 run_unit_test.py 个数)+ 分分支实测快照。
验证:@build 0 错误 0 警告;ci_local.py 全绿(L0 25 钩子 + L0.5 10 runner
/ 647 断言,fail=0)。首轮 mem-numbers 失败系 master 构建遗留的 .map 所
致,本分支重新构建后即一致。
|
2026-10-12 18:28:02 +08:00 |
|
wandering1
|
c95a9cd0cb
|
merge: task/N33-stack-margins 合入 v2-on-ui
任务 N33(1 个提交)经 task-worktree 回收:
- fix(stack): N-33 抬栈收口 defaultTask/timeSyncTask 栈余量(2 FAIL -> 0 FAIL)
|
2026-10-12 18:11:11 +08:00 |
|
wandering1
|
74bf338328
|
docs: 编号规范规划稿(实体编号体系重写,check_ids.py 规划)
- 划界:实体编号 vs C 标识符/位号/章节号;§2~§5 强制(规划机械校验),
§6~§10 约定 + 迁移计划;状态 = 规划稿(阶段 1 落地前未生效)
- 本提交为 Lead 代提交(用户批准):文件由并行会话 17:56 写完静置,
阻塞 task-worktree done 的主工作树干净前置检查
|
2026-10-12 18:10:31 +08:00 |
|
wandering1
|
1b450be0ef
|
fix(skill): @build 自持自释 build 锁,根治忘记 release 的泄漏
问题:锁不绑定进程存活(`lock acquire` 是短命进程,真正用 UV4 的是另一个
进程),所以释放只能靠调用方记得。Agent 手工 `lock acquire build` 后忘
了 `release`,锁要挂到 6 小时 TTL 才被下次 acquire 接管——期间其他任务
要么立即失败、要么干等。`done` 自己已用 try/finally 兜住,但手工路径没有。
改法:让**用资源的人**持锁。`keil_build.py` 进入 acquire、`finally`
**无条件** release(构建失败 / 异常 / SystemExit 都会释放)。
- `--lock-task`:持有者名。默认 `$DTU_TASK_ID` → 从 cwd 的
`_wt/<ID>-<slug>/` 反推 `<ID>` → `build-cli`。反推意味着"手工
`lock acquire build --task <ID>` 后再跑 @build"仍幂等,不会自我死锁。
- `--lock-wait N`:锁被占时等待(默认 0 = 立即失败)。
- `--no-lock`:完全不加锁。
- 新增退出码 **4 = build 锁被占用**(原先无此语义,占用会直接去构建)。
- 锁工具 = 兄弟 skill `task-worktree`;**找不到则降级为不加锁并告警**,
保持本 skill 可独立搬运。
`done` 的兼容处理:它自己持锁,给子进程设 `DTU_LOCK_HELD=build` 告知
跳过自持自释。**对"工作树里还是旧 keil_build.py"的在途任务同样安全**
——旧版根本不看该变量、也不会自锁,故不会出现"双重持锁"死锁。
`bench` 锁**不动**:它是**会话作用域**(跨烧录→@test→探针多条命令),
逐命令自动释放会让别的任务插进来扰动设备,必须继续由 Agent 持有。
验证(主工作树实测):
- 自持自释:acquire → BUILD_OK → release,前后 `lock status` 均空闲;
- 被占:由 other-task 占锁 → exit 4,且**未触发构建**;
- 调用方持锁:`DTU_LOCK_HELD=build` → 打印"跳过自持自释",且
**未释放调用方的锁**(锁仍归 __done__)——关键安全性质;
- 错误路径:无调用方持锁 + `--project` 不存在 → 失败但 **finally 已释放**;
- 持有者名推导:主工作树 → `build-cli`,`_wt/N33-stack-margins` → `N33`;
- 门禁:`mem-numbers` 一致;pre-commit 全绿。
|
2026-10-12 18:07:58 +08:00 |
|
wandering1
|
d7b9204245
|
修 ci.yml 头部指向已删文档的失效引用(doc-links 只扫 md 的盲区)
ba40cc0 把两篇 CI 指南合并为 docs/CI/远程CI完整指南.md 并删除原文件,但
ci.yml 第 24 行那句"(见 CI配置指南 §4.3)"没跟着改——它指向一篇已经不存在的
文档,且章节号也变了(旧 §4.3 内网 action → 合并稿 §5.3)。
为什么漏掉:scripts/check_doc_links.py 只遍历 .md 文档,.gitea/workflows/*.yml
里的纯文本引用(非 markdown 链接、非带扩展名的反引号路径)不在它的规则覆盖内。
已全仓扫描确认:非 md 文件里这类失效引用仅此 1 处,现已修;md 里余下 9 处均为
"两篇均已删除"的状态说明或变更记录历史行(按仓库惯例历史行不改写)。
本提交同时充当远程 CI 的端到端触发:workflow 的 paths-ignore 挡掉 docs/** 与
**/*.md,所以前几轮的纯文档提交不会触发运行;改 .gitea/workflows/ci.yml 本身
落在忽略集之外,可用来验证 runner 恢复后 run 能否真正执行(此前 run 16~21 因
runner 停摆全部 cancelled,尚无一次成功运行)。
验证:check_doc_links.py --all 125 篇 0 问题;pre-commit run --all-files 17 项
全 Passed(含 check-yaml)。
|
2026-10-12 18:04:00 +08:00 |
|
wandering1
|
3557b60ceb
|
CI runner 修日志噪声与 -Status 假警:PS5.1 把原生 stderr 包成 ErrorRecord
双看门狗缺陷已实测收敛:管理员 -StartNow 清掉 3 个残留(孤儿看门狗 26900/19716 +
占锁 daemon 53848)→ "daemon up: pid 40360 (single instance)",监管链恢复为
svchost(任务) → 看门狗 → daemon,看门狗日志 25 秒零增长,runner 回 online。
切换瞬间新看门狗先失败 1~2 次(旧 daemon 刚死、锁未释放)后自愈,属预期。
顺带查出并修掉两个由验证动作暴露的问题:
1) 日志噪声:daemon 把日志写到 stderr,PS 5.1 的 2>&1 会把每行原生 stderr 包成
ErrorRecord,Out-File 渲染出 "gitea-runner.exe : " 前缀 + 4 行 CategoryInfo 块。
实测对比(用无效子命令产生真实 stderr):& exe 2>&1 | Out-File 把 2 行真日志写成
8 行——每 4 行有 3 行是 PowerShell 噪声,而且就在文档让大家第一个打开的文件里。
改为 2>&1 | ForEach-Object { "$_" } | Out-File -Encoding utf8:实测与 cmd 包装等价
但不用操心 cmd 对含空格路径的引号剥离,ErrorRecord.ToString() 即原始行,
$LASTEXITCODE 不受影响(看门狗靠它打印退出码)。§7.2 方式 B 的示例原本正是
"> log 2>&1"(UTF-16LE + ErrorRecord 双坑),已改;新增 §7.3 汇总这两条陷阱。
2) -Status 两处不诚实:① 非管理员读不到 SYSTEM 进程的 CommandLine(返回 null),
过滤器静默匹配 0 个 → 会谎报"没有看门狗"(今天两次被这个假象误导),改为明说
"需提权";② 重启循环判据原本靠"日志尾部 40 行里有没有 lock 字样",而日志不轮转,
修好之后旧失败仍留在尾部 → 对健康 runner 报假警。改看 daemon 进程存活时长
(活过 10 秒重拉间隔就不可能在循环里);用 CIM CreationDate,因为
Process.StartTime 对 SYSTEM 进程不可读。
验证:bootstrap parse 0 错 / 纯 ASCII / -Status 与 -DryRun 均正常;
check_doc_links.py --all 125 篇 0 问题;pre-commit run --all-files 17 项全 Passed。
注:磁盘上的 run_runner_watchdog.ps1 仍是旧模板,噪声修复要下次管理员 -StartNow
(或开机自启)时才生效,纯观感问题,不必专门再重启一次 runner。
|
2026-10-12 17:59:45 +08:00 |
|
wandering1
|
82cedcadb7
|
docs(skill): task-worktree 补 done 的三个实测陷阱
1) done 的门禁跑在 @build 之前 → mem-budget/mem-numbers 拿旧 .map 比对新台账
必然误报 FAIL;处置为主工作树 --write 后追加提交再重跑 done
2) 增量构建可能不重链 → .map 数字瞬态不一致(实测同源两次读到 223,560/223,724,
差 164B);以主工作树(集成点)为准
3) 合并冲突常落在生成物(RAM 快照)上,两边都不能直接选,须按合并后实际构建重生成
|
2026-10-12 17:51:09 +08:00 |
|
wandering1
|
51bc325b57
|
fix(stack): N-33 抬栈收口 defaultTask/timeSyncTask 栈余量(2 FAIL -> 0 FAIL)
既有债收口(非新引入):B7 定值持久化把 defaultTask 静态最坏链推到
3016 B、timeSyncTask 推到 1264 B,两者跌破 stack_report 判据
(余量 >= max(1024 B ISR, 配置 x 30%))。本轮只抬栈,不动调用链。
前基线(stack_report,9 任务):
- defaultTask cfg 4096 B / 静态 3016 B / 余 1080 B (26%) FAIL
- timeSyncTask cfg 2048 B / 静态 1264 B / 余 784 B (38%) FAIL
- 其余 7 任务 PASS(net 2112/1728、ftp 1456/2640、ui 1336/15048、
test 736/7456、adc 1320/1240、iec104 1456/1104、protect 872/1176)
改动:
- defaultTask 1024 -> 1280 words(4096 -> 5120 B):余 2104 B / 41%
- timeSyncTask 512 -> 640 words(2048 -> 2560 B):余 1296 B / 50%
- 后基线:9 任务 0 FAIL(stack_report 退出码 0)
堆开销(任务栈来自 FreeRTOS 堆,.map 静态数字不变):
- defaultTask +1024 B、timeSyncTask +512 B,合计 +1536 B
- 台架背书基线 heap free=17936 / min_ever=10000 B(B6),抬后
min_ever 预计 ~8464 B,仍远高于 3072 B 告警线
防丢失(CubeMX 存活 L1 纪律):
- STM32F407-Demo.ioc 的 FREERTOS.Tasks01 同步改 1024 -> 1280
(.ioc 是 CubeMX 生成任务栈值的事实源,未跑重生成)
- Src/freertos.c 生成区 .stack_size 与 .ioc 保持一致
- USER CODE BEGIN Variables 核算注释块补 N-33 依据(栈值理由唯一落点)
- .cubemx_survival_baseline.json 经 --write 重建(仅 ioc-task-stacks 一行)
task-table 生成区随栈变更再生成(README.md + AGENTS.md 的
TASK_TABLE 锚点区各 2 行,锚点区外无任何改动)。
验证:@build 0 错误 0 警告(Program Size 与改前逐字节一致);
ci_local 全绿(L0 + L0.5,826/826 断言);stack_report 前后各跑一次。
台架 @test 与串口 [STACK] 水位复测在提交后单独跑。
|
2026-10-12 17:47:15 +08:00 |
|
wandering1
|
7aecc50248
|
merge: task/N32-funpara-bit3-safety 合入 v2-on-ui
任务 N32(9 个提交)经 task-worktree 回收:
- merge: N32 并入 v2-on-ui 主干(解 RAM 快照冲突并重生成)
- docs(net): N-32 §10 模块化执行结果与判据修订
- refactor(net): N-32 §10 监听生命周期抽为 net_listener.c(纯搬移)
- docs(net): N-32 新增 §10 监听生命周期模块化边界设计(未执行)
- docs(net): N-32 P2a 落地记录 + 修正设计文档的 P2 原计划
- feat(net): N-32 P2a 监听器 pump 单一所有者(周期性重建收敛)
- docs(net): N-32 P1 台架验收记录 + 验收腿否定结论
- feat(net): N-32 P1 会话结束电平化,消灭抢先 relisten 饿死消费者
- docs(net): 修正 FUN_PARA bit3 口径注释 + 补必要性论证
|
2026-10-12 17:43:42 +08:00 |
|