chore(编号): 存量编号全量转语义短语,门禁识别面与语料同批重打

登记簿、文档与代码注释里的存量字母加数字编号(N-x / S-x / T-x / E-x / A-x / 卡号)
一律改写为语义短语,净删 2,028 处引用;删除基线与待确认、并行分道方案、排期详述、
采集保护收尾 4 篇(内容已并入 docs/任务规划/README 与登记簿)。

门禁机器与三张账同批重打:check_ids.py 新增变更记录行豁免与第二根护栏
undecidable_total_ceiling;check_test_traceability.py 只加 stdout/stderr UTF-8
reconfigure(TC_RE 未动);check_cubemx_survival.py 的 --write 固定 newline=LF;
id_registry / id_aliases(+19 条 retired-to-phrase)/ id_known_backlog 重打。

test/ 56 个文件同步 TC 标签语义化,其中 18 个 TU 改了 CHECK / printf 里的标签文字,
是本批唯一改变构建产物的文件集合。

为什么合成一笔、不拆四笔(实测撞闸,非偏好):pre-commit 跑钩子前会 stash 未 staged
部分,拆开后中间提交必然是「新规则 + 旧语料」——实跑可判定 85.15% < 基线 86.00%、
不可判定 1,453 > 上限 1,166,编号门禁直接拦下。编号识别面与它描述的语料只能同码移动。

实跑基线(工作区全量):754 文件 / 8,230 处编号字面量 / 可判定 7,079 = 86.01%
(基线 86.0%,容差 0.1pp)/ 不可判定绝对数 1,151(上限 1,166)/ 校验 1-6 错误级 0 /
告警 = 悬空 2(App/algo/freq.c 的 S2,属 §4.4 同号不同义)+ 孤儿 50。

基线从 84.0 抬到 86.0 的理由见 docs/门禁说明/id-check.md §7.6:本批真删了 2,028 处
引用,可判定面随真实内容上升,不是把分母做小。同批新增排除 docs/硬件平台/ 语料,使
识别面少 264 处——芯片手册位号与网表料号不属编号空间(registry 有 excluded_paths_note)。

⚠ 余量只剩 0.11pp(约 10 处)与绝对数 15 处:把「可判定的引用」改成散文会立刻撞第二
根护栏。另遗留一项:id_aliases 里 retired 的 N / S / T / A 别名没有 scope(U1~U5 有),
今后有人新写一个 A-4,校验 3 不会响,只能靠人,建议下批补 scope。

固件不变证据:115 个 .c/.h 剥注释并归一字符串后与 HEAD 逐字节全等,残留代码差异 0;
App / Src / Drivers 的字符串字面量零改动。@build 0 错误 0 警告;40/40 主机套件、2,889
断言全通过;覆盖率 line 89.2% / func 92.6%;pre-commit 48 钩子 --all-files 全绿;
check_doc_links --all 通过(176 文档,章节引用无法判定 0);逐字节卫生核过:14 个带
BOM 文件与 HEAD 一致、0 个 CR、0 个 U+FFFD,字符串字面量纯 ASCII。

.cubemx_survival_baseline.json 的 watchdog-module 哈希 56bf27 变 2bb051 属合法:
Src/freertos.c 的 USER CODE 区内只有注释文字随编号改写,代码未变。

同批带上体积同码凭证与 RAM 台账行(@build 之后盖戳):RW_IRAM1 79,008 B / 60.3%,
RW_CCM 57,376 B / 87.9%,阈值 92%。
This commit is contained in:
2026-10-26 12:28:14 +08:00
parent 7635480e06
commit 0f7b5a87fb
253 changed files with 2234 additions and 4541 deletions
+2 -2
View File
@@ -28,9 +28,9 @@
* 描述符 init_cb(开页后调一次,页面模块重置运行态)
* 2026-09-13 王建锋 cp_draw_cb 按区块拆为四个绘制子函数(cp_draw_deco/header/rows/footer),
* 主函数仅编排(行数取一次供行窗口/页脚共用),行为零变化
* 2026-10-15 王建锋 U1 设计令牌层:屏幕/骨架/行距/缓冲/1bpp 语义色字面量收进
* 2026-10-15 王建锋 UI 设计令牌层:屏幕/骨架/行距/缓冲/1bpp 语义色字面量收进
* ui_tokens.h(纯替换,像素逐位一致)
* 2026-10-15 王建锋 U3 页面原型化:删 content_page_id_t 枚举与 s_defs[],open() 改收
* 2026-10-15 王建锋 UI 页面原型化:删 content_page_id_t 枚举与 s_defs[],open() 改收
* 描述符指针、s_open 变指针(NULL = 未打开);7 个页面头包含移交
* ui_page_registry.c;日志页身份改打描述符 id(ASCII 页名,比原
* id=%u 更可定位);绘制/按键/几何一律未动
+1 -1
View File
@@ -25,7 +25,7 @@
* 是否过密码页/所输密码决定);描述符新增 edit_capable(页面
* 是否支持编辑模式)+ 新 API ui_content_page_is_editable
* (页面钩子据以决定编辑行为:edit_capable 且修改权限)
* 2026-10-15 王建锋 U3 页面原型化:删 content_page_id_t 枚举与框架侧 s_defs[],
* 2026-10-15 王建锋 UI 页面原型化:删 content_page_id_t 枚举与框架侧 s_defs[],
* open() 改收描述符指针;节点→页面绑定移交给生成物
* ui_page_registry.c(菜单树 #page= 注记为唯一真源),
* 逻辑层手写 menu_content_page_for() 随之删除;
+1 -1
View File
@@ -53,7 +53,7 @@ uint8_t ui_menu_tab_children(uint8_t node, uint8_t out[], uint8_t max);
* 入口参数:node - 节点下标 uint8_t 0 - 表长-1
* 返回值:true - 有子项(显示为菜单,带 ▶);false - 无子项(叶子,可进内容页)
* 限定条件:纯查询,无副作用;node 越界返回 false
* 函数说明:这是**谓词**(bool 合法),不是成败码——S-5 的 err-type 检查里白名单放行的形态。
* 函数说明:这是**谓词**(bool 合法),不是成败码——err-type 检查里白名单放行的形态。
*/
bool ui_menu_tab_has_children(uint8_t node);
+17 -17
View File
@@ -12,10 +12,10 @@
* 2026-09-10 王建锋 改为双端共用:底层改用 net_* API + 平台后端;接收改为逐字节
* 状态机(失步自动重同步);断开/网络重建后经 net_get_sock 判活
* 并重建监听(修复 MCU 单连接模型断线后无法重连的隐患)
* 2026-10-02 王建锋 E-04:remo_send 校验 net_send 返回值(原丢弃)——短写/失败
* 2026-10-02 王建锋 remo_send 校验 net_send 返回值(原丢弃)——短写/失败
* 告警,连续 3 次失败阻断推送,新连接/网络重建解除阻断
* (MCU 单连接模型不得 net_close 数据 fd,会连监听一起毁掉)
* 2026-10-10 王建锋 I-1 门控 + I-2 兜底(销项 N-10):accept/recv
* 2026-10-10 王建锋 判活门控 + 兜底收帧:accept/recv
* 前先用 net_can_accept()/net_can_read()(纯 RAM 读控制块)判
* "有没有活",无活直接返回——台架常态(无客户端)从每 10 ms
* 一次 RPC(100 msg/s,与 FTP 抢深度 8 的队列)降到 0 次。
@@ -23,7 +23,7 @@
* "RX 非空但 readable=0",故每 32 轮无条件 recv 一次(≈320 ms);
* 门控放行时若监听控制块已消失则置 g_listen=-1 触发重建,
* 避免"门控把端口永久不再接受新客户端"这一新卡死路径
* 2026-10-12 王建锋 N-32(B10 根治 P1,设计文档 §2.3 不变量 II):accept 门控
* 2026-10-12 王建锋 监听生命周期 P1(B10 根治,设计文档 §2.3 不变量 II):accept 门控
* 由 net_can_accept()(只认 ESTABLISHED)改判
* net_listener_armed()(LISTENING 或 CLOSED+auto_relisten)——
* 旧门控在断连待重建窗口恒 0,:7003 永不进 net_accept,
@@ -35,7 +35,7 @@
* (accept / recv_nb / send / close / 重建三件套)返回点
* 调用——风暴期单轮多往返串成 UI 心跳缺口(实测 bit4
* 8 连击、uisn=154ms 仍在段内样本),往返本身不动
* (语义不变,上界收口 = 登记簿 E-27/E-28 批 3),心跳
* (语义不变,上界收口为登记簿批 3 事项),心跳
* 在往返边界续命。钩子未注册 = 零行为变化(模拟器/黄金
* 回归不注册)。判读与设计口径见
* docs/UI设计/UI_设计架构.md §5.8
@@ -51,7 +51,7 @@
#include "test_config.h" /* TEST_LATENCY_PROBE(链路时延探针编译开关) */
#include "net_latency_test.h" /* M3 探针:prod_cycle_mcu(LCDMEM 处理净成本) */
/* E-04(2026-10-02):发送短写/失败告警(MCU=控制台日志,模拟器=printf 桩) */
/* (2026-10-02):发送短写/失败告警(MCU=控制台日志,模拟器=printf 桩) */
#define DBG_TAG "[UI_NET_SINK]"
#include "dbg_log.h"
@@ -77,11 +77,11 @@ static int g_listen = -1; /* 监听 Socket fd(未启动或已停止时
static int g_client = -1; /* 当前客户端 Socket fd(无连接时为 -1) */
static uint16_t g_port; /* 监听端口(网络重建 / 断线后重监听用) */
static uint32_t g_gen; /* 建立监听时的网络代次号(变化 = 网络已重建) */
static uint8_t s_send_fail_run; /* 连续发送失败计数(E-04:0 = 正常) */
static uint8_t s_send_fail_run; /* 连续发送失败计数(0 = 正常) */
static uint8_t s_sink_blocked; /* 推送阻断标志(1 = 停发帧,等客户端重连解除) */
/*
* 兜底收帧节拍(门控失效保险,2026-10-10 I-2):
* 兜底收帧节拍(门控失效保险,2026-10-10):
* net_can_read() 的 readable 只由 RECV_OK 中断置位,而 TRAP-NET-17 的
* net_reconcile_tick() 三类对账**不含**"芯片 RX 非空但 readable=0" →
* 该中断一旦丢失,纯门控会把已到达的数据永久藏住(改前靠每轮 recv 内的
@@ -170,7 +170,7 @@ static void put_u32(uint8_t *p, uint32_t v) {
* 限定条件:g_tx 空间足够容纳 4+len+1 字节;g_client >= 0(已有连接)
* 函数说明:帧格式 [TAG_DEVICE][CMD][LEN_H][LEN_LO][DATA][CRC];CRC 为 payload 异或;
* 无连接时直接返回
* E-04(2026-10-02):校验 net_send 返回值(原丢弃)——短写 = 客户端收到坏帧
* (2026-10-02):校验 net_send 返回值(原丢弃)——短写 = 客户端收到坏帧
* (CRC 不符 → 画面卡死黑屏,而设备侧日志全正常);连续 3 次失败 →
* 停发:客户端察觉无帧自行重连,芯片侧 DISCONNECT/TIMEOUT 自动重开
* 监听重建连接;MCU 单连接模型严禁 net_close 数据 fd(会连监听一起毁)
@@ -516,10 +516,10 @@ int ui_net_sink_start(uint16_t port) {
* 3. 无客户端时**先门控**(net_listener_armed,纯 RAM 读)再 accept,成功则复位状态机。
* 门控判据 = "监听器还在服役"(LISTENING 或 CLOSED+auto_relisten)而非
* "本轮必然有连接"——后者会让断连待重建窗口内永不进 net_accept,
* 把 CONNECT 事件未收到的补 accept 探测永久挡在门外(N-32)
* 把 CONNECT 事件未收到的补 accept 探测永久挡在门外(监听生命周期模块化)
* 4. 有客户端时**先门控**(net_can_read)再非阻塞 recv 逐字节喂入状态机;
* 门控判为"无数据"时仍每 RM_LIVENESS_DIV 轮无条件收一次(兜底)
* 5. 对端关闭/真错误时关闭客户端。**不再自行重建监听**(N-32 不变量 II):
* 5. 对端关闭/真错误时关闭客户端。**不再自行重建监听**(监听生命周期不变量 II):
* recv 的 EOF/错误分支已触发 net 层 auto_relisten,另有对账④兜底;
* 仅 g_listen 的 fd 真消失(net_get_sock 返 NULL)才置 -1 交回 2 重启
* ⚠ **门控只消除"无谓的往返",不消除"往返本身无上界"**:一旦真有活要干
@@ -543,7 +543,7 @@ void ui_net_sink_poll(void) {
sink_beat(); /* F3:重建前的一对 close 往返结束 */
g_client = -1;
rm_parser_reset();
s_send_fail_run = 0U; /* 网络重建:失败累计清零、解除推送阻断(E-04) */
s_send_fail_run = 0U; /* 网络重建:失败累计清零、解除推送阻断 */
s_sink_blocked = 0U;
s_liveness_ctr = 0U; /* 网络重建:兜底节拍重新起算 */
(void)ui_net_sink_start(g_port);
@@ -556,7 +556,7 @@ void ui_net_sink_poll(void) {
return;
}
/* 无客户端时尝试接受连接(N-32 P1 不变量 II:门控从 net_can_accept〔只认
/* 无客户端时尝试接受连接(监听生命周期 P1 不变量 II:门控从 net_can_accept〔只认
* ESTABLISHED〕换成 net_listener_armed〔LISTENING 或 CLOSED+auto_relisten〕)
* 原因:MCU 单连接模型下断连后 fd 会停在 CLOSED 等 relisten,旧门控在该窗口
* 内恒 0 → :7003 永不进 net_accept → net_lost_connect_probe 对该端口等于
@@ -577,14 +577,14 @@ void ui_net_sink_poll(void) {
if (c >= 0) {
g_client = c;
rm_parser_reset();
s_send_fail_run = 0U; /* 新连接:失败累计清零、解除推送阻断(E-04) */
s_send_fail_run = 0U; /* 新连接:失败累计清零、解除推送阻断 */
s_sink_blocked = 0U;
s_liveness_ctr = 0U; /* 新连接:兜底节拍重新起算 */
}
return;
}
/* 有客户端时非阻塞收帧(I-1 门控 + I-2 兜底;DONTWAIT 已转正
/* 有客户端时非阻塞收帧(判活门控 + 兜底节拍;DONTWAIT 已转正
* 为具名 API net_recv_nb——uiTask 在 IWDG required_mask 内且有 10ms UI 推流
* 周期职责,禁止无限阻塞 recv,非阻塞轮询是义务):
* 无数据可读 → 多数轮次直接返回,省掉一次 recv 往返(该往返内部
@@ -612,7 +612,7 @@ void ui_net_sink_poll(void) {
}
g_client = -1;
rm_parser_reset();
/* N-32(P1 不变量 II):重建**不再**由本处自行 bind_listen。
/* 监听生命周期 P1 不变量 II:重建**不再**由本处自行 bind_listen。
* ① net_recv_locked 的 EOF 分支已触发 auto_relisten(D10 非阻塞重试);
* ② 对账④还会兜底补一次 relisten(TRAP-NET-17 实证事件面不是可靠唯一信源——
* E14 复核:非芯片丢事件——两层不可互替)。
@@ -625,7 +625,7 @@ void ui_net_sink_poll(void) {
} else {
/* n < 0:区分"暂无数据"(继续等待)与"真错误"(断开并视情况重建监听) */
if (net_get_errno() != NET_ERR_WOULDBLOCK) {
/* N-32(P1):加 `g_client != g_listen` 护栏,与上面 n==0 分支
/* 监听生命周期 P1:加 `g_client != g_listen` 护栏,与上面 n==0 分支
* 的 :552 一致——MCU 单连接模型下 g_client 可能就是 g_listen 本身,
* 无护栏的 net_close 会直接关掉监听 fd(:563,与 :134 注释"严禁"
* 自相矛盾),端口随 TRAP-NET-09 沉降窗短死。PC 模拟器多连接后端下
@@ -636,7 +636,7 @@ void ui_net_sink_poll(void) {
sink_beat(); /* F3:EOF/错误路径的 close 往返结束 */
g_client = -1;
rm_parser_reset();
/* N-32(P1 不变量 II):同 EOF 分支——不再自行 bind_listen,
/* 监听生命周期 P1 不变量 II:同 EOF 分支——不再自行 bind_listen,
* 重建交回 net 层(recv 的错误分支同样会走 relisten)。仅 fd 真消失
* 时置 -1 交回主循环走 start */
if (net_get_sock(g_listen) == NULL) {
+1 -1
View File
@@ -71,7 +71,7 @@ void ui_net_sink_poll(void);
* 重建三件套)返回处调用钩子。动因:netTask 重建风暴期,单轮内多个
* 往返串行排队,把宿主(uiTask,IWDG 必需位)的心跳间隔拖过 800ms
* (2026-10-25 台架实测 bit4 单任务 8 连击窗、uisn=154ms 仍在段内);
* 往返时长本身不改(上界收口 = 登记簿 E-27/E-28,批 3),但心跳在每个
* 往返时长本身不改(上界收口为登记簿批 3 事项),但心跳在每个
* 往返边界续命——单任务停摆判据(按位连击,docs/子系统设计/看门狗设计说明.md
* §5.3)只应
* 抓真挂死,不该抓「多个都回来了但各自偏慢的往返之和」。
+2 -2
View File
@@ -10,7 +10,7 @@
* 创建日期:2026-09-14
* 修改记录:
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.3)
* v1.1 2026-10-20 王建锋 改用 ui_w_records 共享组件(W6 U2:合并两页重复实现)
* v1.1 2026-10-20 王建锋 改用 ui_w_records 共享组件(W6:合并两页重复实现)
* v1.2 2026-10-25 王建锋 记录 reader 注入(道B task-6):不再 include sys_log.h,
* 数据经组件内注入的 ui_rec_reader_t 取;日志 ID 换
* 不透明编号 UI_W_REC_LOG_RUN(映射在两端绑定处)
@@ -37,7 +37,7 @@
* 返回值:总行数 uint16_t
*/
/*
* 记录页薄跳板:内容全部走 ui_w_records 共享组件(W6 U2)。
* 记录页薄跳板:内容全部走 ui_w_records 共享组件(W6)。
* 实例 s_rec 携带日志 ID 与**本实例自己的**读盘缓存——两页共用组件代码,
* 但缓存不得共享,否则切页会命中上一记录号而显示另一页的陈旧行。
*/
+2 -2
View File
@@ -10,7 +10,7 @@
* 创建日期:2026-09-14
* 修改记录:
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.4)
* v1.1 2026-10-20 王建锋 改用 ui_w_records 共享组件(W6 U2:合并两页重复实现)
* v1.1 2026-10-20 王建锋 改用 ui_w_records 共享组件(W6:合并两页重复实现)
* v1.2 2026-10-25 王建锋 记录 reader 注入(道B task-6):不再 include sys_log.h,
* 数据经组件内注入的 ui_rec_reader_t 取;日志 ID 换
* 不透明编号 UI_W_REC_LOG_SELFTEST(映射在两端绑定处)
@@ -37,7 +37,7 @@
* 返回值:总行数 uint16_t
*/
/*
* 记录页薄跳板:内容全部走 ui_w_records 共享组件(W6 U2)。
* 记录页薄跳板:内容全部走 ui_w_records 共享组件(W6)。
* 实例 s_rec 携带日志 ID 与**本实例自己的**读盘缓存——两页共用组件代码,
* 但缓存不得共享,否则切页会命中上一记录号而显示另一页的陈旧行。
*/
+1 -1
View File
@@ -6,7 +6,7 @@
* 作者:王建锋
* 创建日期:2026-10-15
* 修改记录:
* v1.0 2026-10-15 王建锋 创建初始版本(U3:原三处逐字相同的定义合并到此单一来源)
* v1.0 2026-10-15 王建锋 创建初始版本(原三处逐字相同的定义合并到此单一来源)
*/
/* 头文件包含区 */
+1 -1
View File
@@ -11,7 +11,7 @@
* 作者:王建锋
* 创建日期:2026-10-15
* 修改记录:
* v1.0 2026-10-15 王建锋 创建初始版本(U3:合并三处逐字重复的 flat 常量样式定义)
* v1.0 2026-10-15 王建锋 创建初始版本(合并三处逐字重复的 flat 常量样式定义)
*/
#ifndef UI_STYLE_H
#define UI_STYLE_H
+1 -1
View File
@@ -10,7 +10,7 @@
* 作者:王建锋
* 创建日期:2026-10-15
* 修改记录:
* v1.0 2026-10-15 王建锋 创建初始版本(U1:收编散落各 UI 文件的布局/颜色/缓冲魔数,
* v1.0 2026-10-15 王建锋 创建初始版本(收编散落各 UI 文件的布局/颜色/缓冲魔数,
* 纯替换、零行为变化;像素与替换前逐位一致)
*/
#ifndef UI_TOKENS_H
+1 -1
View File
@@ -6,7 +6,7 @@
* 作者:王建锋
* 创建日期:2026-10-20
* 修改记录:
* v1.0 2026-10-20 王建锋 创建(W6 U2)
* v1.0 2026-10-20 王建锋 创建(W6)
* v2.0 2026-10-25 王建锋 reader 注入(道B task-6):syslog_count/syslog_get_record
* 直调改为 s_reader 函数表调用;未注入按空态渲染
*/
+1 -1
View File
@@ -11,7 +11,7 @@
* 作者:王建锋
* 创建日期:2026-10-20
* 修改记录:
* v1.0 2026-10-20 王建锋 创建(W6 U2:合并 ui_page_runlog / ui_page_selftest 的重复实现)
* v1.0 2026-10-20 王建锋 创建(W6:合并 ui_page_runlog / ui_page_selftest 的重复实现)
* v2.0 2026-10-25 王建锋 记录 reader 注入(道B task-6):删 #include "sys_log.h",
* 改 ui_rec_reader_t 函数表 + ui_w_records_bind();
* log_id 换不透明编号(UI_W_REC_LOG_*);缓冲容量宏本地化