修复 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。
This commit is contained in:
@@ -36,10 +36,10 @@
|
||||
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
|
||||
| 区域 | 用量 | 容量 | 占比 |
|
||||
|---|---|---|---|
|
||||
| ER_IROM1 | 265,940 B (259.71 KB) | 1,048,576 B (1024 KB) | 25.4% |
|
||||
| ER_IROM1 | 266,548 B (260.30 KB) | 1,048,576 B (1024 KB) | 25.4% |
|
||||
| RW_IRAM1 | 84,960 B (82.97 KB) | 131,072 B (128 KB) | 64.8% |
|
||||
| RW_CCM | 49,184 B (48.03 KB) | 65,280 B (64 KB) | 75.3% |
|
||||
| **Flash (ROM 合计)** | **266,676 B (260.4 KB)** | 1,048,576 B (1024 KB) | **25.4%** |
|
||||
| **Flash (ROM 合计)** | **267,288 B (261.0 KB)** | 1,048,576 B (1024 KB) | **25.5%** |
|
||||
<!-- MEM_SNAPSHOT:END -->
|
||||
|
||||
各区的容量与常量来源:
|
||||
|
||||
+20
-17
@@ -39,7 +39,7 @@
|
||||
|---|---|---|
|
||||
| **P0** | 0 | **P0-1 已闭环**:2026-09-18 修复(cfg_file 临时缓冲改走 FreeRTOS 堆)+ 2026-10-03 真机 `@test` PASS + 2026-10-04 独立复跑 PASS(见 §4 说明与 `子系统设计/配置文件设计说明.md` v1.13) |
|
||||
| **P1** | 2 (+1 收尾) | **P1-1 ADC 采样路径产品构建中死亡**;**P1-7 MAC 写入顺序**(待 CH395F 手册 §9.2.1);P1-10 测试固件构建实测闭环(主体已闭环,见 §3.1) |
|
||||
| **P2** | 10 | 健壮性/错误传播/文档失真:P2-1/2/7/8/9/10/11/12/13/15(详见 §3.2) |
|
||||
| **P2** | 0 | **全部销项(2026-10-04)**:P2-1/2/7/8/9/10/11/12/13/15 共 10 项已全部闭环,明细与证据见 §3.2 |
|
||||
| **P3** | 6 | 卫生项:P3-1/2/4/6/8/11(其余已销项),可随其他修改顺手处理 |
|
||||
| 登记簿 | 10 | 网络:N-2(49s 日志静默,**低风险观察项**)、N-3(L5 基线重验)、N-4(pending 二期)、N-16(A2/A4 专项负向验证)、N-17(探针窗口心跳缺口);存储/日志:**S-1(defaultTask 栈余量 10%,需尽快处理)**、S-2(boot_log 存档)、S-3(USART1 TX-only 根治)、S-4(dhara 重试自旋)、S-5(可选全序列卷锁) |
|
||||
| 测试/基础设施 | 5 | T-7(CI runner 未就绪)+ 测试架构专项 **S12**(断言宏)、**S1-c**(可选单测)、**A-4**(采集链路测试约束)、**A-5 残余**(CI 体积门禁盲区) |
|
||||
@@ -92,7 +92,7 @@
|
||||
| **C1** | **pending 二期(ACCEPT + SEND)** | 沿一期机制扩展;同期消化 E-25(net_select 语义)、E-24/E-27/E-28(跨上下文收口);基线重锁 + 探针族扩充 + 看门狗接 selftest。**设计基线见 §5.1** | 第二档 #2 / N-4 |
|
||||
| **C3** | **存储侧日志管线**(消化 N-2) | 丢弃可观测性**代码已具备**(`console_log.c` `s_con_drop`+`[ERR] CONSOLE dropped`、`sys_log_mcu.c` 队列满 `DBG_ERROR`、TX 僵尸通道自愈);V5 30 min 日志**未复现 49s 静默**(运行期 >10s 静默全为 ~28s、均在 `e02_probe` 窗口内=N-17)。剩余:与 S8(非阻塞日志)合并评估 + **S-3(USART1 TX-only 结构根治)** | N-2 / S-3 |
|
||||
| **C4** ⚠️ | **defaultTask 栈余量**(S-1,**需尽快处理**) | **2026-10-04 实测 3664/4096(余量 432 B ≈ 10%,远低于 30% 判据)**。处置:栈 4096→4608(CCM 堆余量可覆盖 +512B)或 GC 链局部削减;**建议随阶段 B 之前先做** | S-1 |
|
||||
| **C5** | 一档剩余 + P2 收口 | E-49(RS485 DE 收尾)、E-15(ringbuf 定去留——**已确认零调用者,倾向删除**)、E-61(SD2506 注释订正)、E-16(cfg_file 段名长度)、E-26(UDP 定案,倾向移除)、E-23、E-30 + P2-1/2/7/8/9/10/11/12/13/15 | 一档/二档 |
|
||||
| **C5** | 一档剩余 + P2 已收口 | E-49(RS485 DE 收尾)、E-15(ringbuf 定去留——**已确认零调用者,倾向删除**)、E-61(SD2506 注释订正)、E-16(cfg_file 段名长度)、E-26(UDP 定案,倾向移除)、E-23、E-30(P2 十项已于 2026-10-04 全部销项,见 §3.2) | 一档/二档 |
|
||||
| **C6** | **USART1 TX-only 结构根治**(S-3) | 灭 ORE 僵尸机制根源:改 `.ioc` 令 USART1 不使能 RX / PA10 不复用为 `USART1_RX` → CubeMX 重生成 → 跑 `check_cubemx_survival.py`。属结构性改动,需单开一轮 + 复跑台架闭环 | S-3 |
|
||||
|
||||
### 2.4 阶段 D:验证与卫生(常态化)
|
||||
@@ -128,7 +128,7 @@
|
||||
#### P1-1 ADC 采样数据路径产品构建中死亡
|
||||
- **位置**:`App/app/app_main.c`(`tpafe5160_start_conv_irq()` 仅启动时调用一次)+ `Drivers/BSP/TPAFE5160/tpafe5160.c`
|
||||
- **证据**:启动序列调用一次 `tpafe5160_start_conv_irq()`;全仓库无周期性 CONVST 重触发;`data_ready` / `get_buf` 无任何消费者(`adc_task.c` 是空桩)。
|
||||
- **影响**:上电后仅采集 1 个样本,此后数据永久陈旧;`APP_ADC_ENABLE` 开关又无人引用(见 P2-12),形成"看似启用实则失效"的假象。
|
||||
- **影响**:上电后仅采集 1 个样本,此后数据永久陈旧;且 `APP_ADC_ENABLE` 为未接线占位(P2-12 已销项:已如实标注,不再冒充开关),形成"看似启用实则失效"的假象。
|
||||
- **修复建议**:周期 CONVST 重触发(定时器或任务)+ 数据消费任务;若基线版本有意不实现采集,应删除启动调用并以 `APP_ADC_ENABLE` 真实门控。
|
||||
- **置信度**:high(代码级确证);P0/P1 定级取决于产品定义(见 §4 待确认)。
|
||||
|
||||
@@ -149,20 +149,23 @@
|
||||
- **剩余**:① CH395F 套件(`TEST_SUITE_CH395F`,HW 全阶段 / NET 层 7 配置)实际构建确认链接通过——PHASE5 三静态缓冲 3×4093B 仍在,理论余量足够但未实测;② `@test` 闭环;③ **不建议**扩 scatter 到 192KB(破坏既有克隆芯片兼容决策)。
|
||||
- **置信度**:high(基线数据来自 2026-09-21 map;测试固件构建未复验)。
|
||||
|
||||
### 3.2 P2(未闭环 10 项)
|
||||
### 3.2 P2 —— ✅ 全部销项(2026-10-04)
|
||||
|
||||
| # | 位置 | 问题 | 修复建议 | 置信度 |
|
||||
|---|---|---|---|---|
|
||||
| P2-1 | `App/cfg/cfg_file.c` | 受管键行 >127 字符时外科保存产生重复键行(值静默截断,旧行残留;Pass1 匹配仍受 `CFG_LINE_TEST_MAX=127` 限制) | 行长超限时拒绝保存并报错,或整卷重写 | high |
|
||||
| P2-2 | `Drivers/BSP/CH395F/ch395f.c` | `ch395f_spi_dma_transfer` 为 void:DMA 超时/abort 后不向调用方传播错误(调用方当成功继续 → 静默数据损坏) | 超时路径置错误标志并经返回值/查询接口上报 | high |
|
||||
| P2-7 | `Drivers/BSP/NET/net_select.c` `check_socket_readable` | LISTENING 视为恒可读 → 单连接模式下对监听 socket select(readfds) 永久立即返回(当前无调用方,潜在地雷) | LISTENING 仅在写集合/异常集合计数可读,或明确文档化 | high |
|
||||
| P2-8 | `App/sync/time_sync.c` + `Drivers/BSP/NET/net_config.h` | `NET_RECV_TIMEOUT_MS=30000`;且 `time_sync.c` 的 `net_recv` 现传 timeout=0(**无限等待**)——静默对端使同步任务永久卡死 | 同步收包单独用短超时(如 3s),与通用收发超时分离 | high |
|
||||
| P2-9 | `App/log/sys_log_mcu.c` | 挂载时 mkdir 失败 → `s_fs_ready` 不置位,drain 永久 no-op 无重试(`syslog_mcu_mounted` 仅调用一次) | 周期重试挂载/建目录 | medium |
|
||||
| P2-10 | `App/log/sys_log_mcu.c` | 容量满 unlink 与 UI 读记录(FA_READ)存在竞态窗口 | unlink 前等待读者释放,或双文件轮转 | medium |
|
||||
| P2-11 | `App/task/net_task.c` | RECONFIG 事件用 `osEventFlagsGet`+Clear,非原子(检查与清除间可丢事件) | 改 `osEventFlagsWait` 原子获取 | high |
|
||||
| P2-12 | `App/app/app_cfg.h` | `APP_NET_ENABLE`/`APP_ADC_ENABLE`/`APP_RS485_ENABLE` 全仓库无 .c 引用,纯装饰 | 真实接入模块门控,或从文档/注释中删除"开关"说法 | high |
|
||||
| P2-13 | `Src/freertos.c` | testTask 无条件创建,产品构建空转占 2048 words(8KB,CCM 堆) | 按 `test_config.h` 门控创建 | high |
|
||||
| P2-15 | `MDK-ARM/download.bat` | 调用 UV4 前不删旧 `download_log.txt`:陈旧 "Application running" 掩盖失败烧录 | 调用前先删旧日志 | high |
|
||||
P2-1/2/7/8/9/10/11/12/13/15 共 10 项已全部闭环(代码 + 主机单测 + `@build` 0/0)。
|
||||
**按"只保留待办"约定,明细条目已删除**;结论与证据沉淀进各模块文档,此处只留索引:
|
||||
|
||||
| # | 位置 | 闭环方式(摘要) | 证据落点 |
|
||||
|---|---|---|---|
|
||||
| P2-1 | `App/cfg/cfg_file.c` | 受管键行 > `CFG_LINE_TEST_MAX`(127) 时 `s_surgical_pass1` 返回 -1 → 拒绝保存、原文件不动、自检留痕(消除"超长行静默跳过 → 重复键行") | 本文件 §3.2;主机单测 TC-CFG-044(`test/host/cfg_file/cfg_file_test.c`) |
|
||||
| P2-2 | `Drivers/BSP/CH395F/ch395f.c` | `ch395f_spi_dma_transfer` 改返回状态;失败锁存通道故障(`ch395f_spi_byte_fault()` 现覆盖字节级 + DMA 级);`read_recv_buf` 失败时不再拷入不可信 rx 数据(改零填充) | 本文件 §3.2;`ch395f.c` v 变更记录 |
|
||||
| P2-7 | `Drivers/BSP/NET/net_select.c` | `check_socket_readable` 对 LISTENING 不再恒返回 1(本层无挂起 accept 队列,CONNECT 事件直接把该 socket 转 ESTABLISHED)→ 消除 select/poll 忙轮询地雷 | 本文件 §3.2;`net_select.c` 函数注释 |
|
||||
| P2-8 | `App/sync/time_sync.c` | **核实已由 L3 pending 改写闭环**:收包用 `net_recv_to`(≤50ms 分片 + 30s 总预算 + 每片喂心跳),无 `net_recv` 无限等待 | 本文件 §3.2;`time_sync.c` 头注释 |
|
||||
| P2-9 | `App/log/sys_log_mcu.c` | `syslog_mcu_mounted()` 改幂等 + 卷锁保护;`defaultTask` 每 2s 复查(`STORAGE_READY` 已置位但日志后端未就绪时重试建 `/log`) | 本文件 §3.2;`sys_log_mcu.c` v1.4 |
|
||||
| P2-10 | `App/log/sys_log_mcu.c` | `s_read_raw()` 纳入卷锁 try(读者 vs 写者 unlink 互斥),消除"UI 读记录时文件被 unlink"竞态 | 本文件 §3.2;`sys_log_mcu.c` v1.4 |
|
||||
| P2-11 | `App/task/net_task.c` | RECONFIG 位改用 `osEventFlagsWait(timeout=0)` 原子取走+清除,替换 `Get`+`Clear` 两步(消除丢事件窗口) | 本文件 §3.2;`net_task.c` 主循环注释 |
|
||||
| P2-12 | `App/app/app_cfg.h` | 三个 `APP_*_ENABLE`(及 `APP_SYS_TIME_SRC`)全库零引用 → 如实标注为"未接线占位",删除"开关"说法(同步 `项目部署环境要求.md`) | 本文件 §3.2;`app_cfg.h` v1.1 |
|
||||
| P2-13 | `Src/freertos.c` | 产品构建(`!TEST_SUITE_SELECTED`)下 `MX_FREERTOS_Init()` 于内核启动前 `vTaskDelete(testTask)` 回收 8KB CCM 栈(不改生成区/.ioc,重生成不丢) | 本文件 §3.2;`项目架构总览.md` §2.1 |
|
||||
| P2-15 | `MDK-ARM/download.bat` | 调 UV4 前先删旧 `download_log.txt` + 增"未产出日志"判定(对齐 `build.bat`),消除陈旧 "Application running" 掩盖烧录失败 | 本文件 §3.2;`download.bat` 注释 |
|
||||
|
||||
> **已销项 P2(勿重复报)**:P2-3(`gd5f_bbt_save` 返回值检查)、P2-4(`dhara_nand_read` 检查 `gd5f_read_from_cache`)、P2-5(`sd2506.c` 负温 `-(int8_t)(val & 0x7F)`)、P2-6(SD2506 CTR1 写禁止)、P2-14(`build.bat` 删旧日志)、P2-16(AGENTS.md 栈表)。
|
||||
|
||||
@@ -304,7 +307,7 @@ S14 已在 workflow 显式提示"体积门禁未执行"(`::notice::`)并在
|
||||
|
||||
1. TPAFE5160 是否有自动扫描模式(决定 P1-1 定 P0 还是 P1)。
|
||||
2. CH395F 手册 §9.2.1:`INIT_CH395` 是否锁存 MAC 寄存器(决定 P1-7 修复紧迫度)。
|
||||
3. `APP_ADC_ENABLE` / `APP_RS485_ENABLE` 是否应在产品构建真实门控模块(关联 P1-1、P2-12、P3-11)。
|
||||
3. `APP_ADC_ENABLE` / `APP_RS485_ENABLE` 是否应在产品构建真实门控模块(关联 P1-1、P3-11;P2-12 已销项——宏已如实标注为"未接线占位",此处确认的是**是否接入真实门控**)。
|
||||
4. RS-485 PD0 DE 的半双工方向语义需硬件实测确认(本次仅静态审查)。
|
||||
|
||||
---
|
||||
|
||||
+2
-2
@@ -55,13 +55,13 @@
|
||||
| `defaultTask` | 4096 | Normal | FatFS 挂载(无卷 `f_mkfs`)→ 卷健康探针/自愈 → `net_cfg_load`(配置引擎属主)→ 置 `STORAGE_READY`(= 存储+配置就绪)→ 日志落盘(唯一写者,`syslog_drain`)+ 配置保存执行/2s poll + LED 闪烁 + **栈水位观测**(`stack_probe_poll`:首次 5s 后报告,此后仅在出现更深峰值时打印) | `StartDefaultTask` |
|
||||
| `netTask` | 4096 | Normal | 等存储(配置已由 defaultTask 就绪,本任务只读 RAM 副本)→ `net_stack_bring_up()`(不触碰配置文件引擎)→ 置 `NET_READY` → `net_poll` 轮询(CH395F 硬件层测试模式下入口自挂起) | `StartNetTask` |
|
||||
| `ftpTask` | 4096 | Normal | 等网络**且**存储(`WaitAll`)→ `lftpd_start("/", 21)` → 单客户端会话循环(断开后重开监听) | `StartFtpTask` |
|
||||
| `testTask` | 8192 | BelowNormal | 测试套件入口(`test/board/test_config.h` 选择;产品构建空转) | `start_test_task` |
|
||||
| `testTask` | 8192 | BelowNormal | 测试套件入口(`test/board/test_config.h` 选择)。**产品构建不创建**:CubeMX 生成区无条件建后,`MX_FREERTOS_Init()` 在未选套件时(`!TEST_SUITE_SELECTED`)立即 `vTaskDelete` 回收其 8KB CCM 栈(P2-13,2026-10-04) | `start_test_task` |
|
||||
| `uiTask` | 16384 | BelowNormal | 等网络 → `ui_port_init`/`ui_menu_init`/`ui_standby_init`(空闲 60s 切待机屏)/`ui_net_sink` → 10ms 刷新 | `ui_task_func` |
|
||||
| `timeSyncTask` | 2048 | Normal | 等网络 → TCP :8888 收 PC 推送时间 → 写 RTC | `time_sync_task` |
|
||||
|
||||
> `idle`(128 words)/ `timer`(256 words)由 FreeRTOS 内核创建。所有任务栈从 48KB heap_4 堆分配。
|
||||
> **栈实测与预算**(2026-09-21,工具 `scripts/stack_report.py` = Keil 静态调用图 + 串口 `[STACK]` 水位;详见 `docs/内存管理/RAM使用分析与优化方案.md` §0.6):
|
||||
> defaultTask 静态最坏 2776B/4096B(余量 32%)、ftpTask 实测 **1184B/4096B(余量 71%)**(lftpd 大局部缓冲静态化前为 3480B / 15%,见内存方案 §1.4)、uiTask 实测 3824B/16384B(缩栈空间大,内存方案 §1.3 目标 6KB)、netTask 588B、timeSyncTask 420B、testTask(产品构建)348B。
|
||||
> defaultTask 静态最坏 2776B/4096B(余量 32%)、ftpTask 实测 **1184B/4096B(余量 71%)**(lftpd 大局部缓冲静态化前为 3480B / 15%,见内存方案 §1.4)、uiTask 实测 3824B/16384B(缩栈空间大,内存方案 §1.3 目标 6KB)、netTask 588B、timeSyncTask 420B、testTask 348B(2026-09-21 实测;P2-13 后产品构建已不再创建该任务,仅测试构建保留)。
|
||||
> ⚠ 改栈或加大栈内局部变量前后**必须**重跑该脚本——静态分析低估含递归/间接调用的链(优化前 ftpTask:静态 2528B vs 实测 3480B)。
|
||||
|
||||
### 2.2 就绪屏障(Event Flags,取代魔法延时)
|
||||
|
||||
@@ -488,9 +488,9 @@ $env:DTU_KEIL_UV4 = 'D:\NotExist\UV4.exe' # 仅当前会话,不动用户级
|
||||
|---|---|---|---|
|
||||
| CH395F 以太网 | SPI2 | PB12 CS / PB13 SCK / PB14 SDO / PB15 SDI | PHY 强制 100M 全双工;SPI 分频系数必须为 8(PCB 设计约束,速度受限) |
|
||||
| GD5F2GQ5UE NAND(2 Gbit) | SPI1 | PE0 CS / PB3 SCK / PB4 MISO / PB5 MOSI / PB8 WP / PE1 HOLD | FatFS(FAT32)+ dhara FTL;上电无卷自动 `f_mkfs` |
|
||||
| TPAFE5160 ADC | 并行 16 位 | PG0~PG15 数据 / PD3 RD / PD4 CONVST / PD7 BUSY | `APP_ADC_ENABLE` 开关 |
|
||||
| TPAFE5160 ADC | 并行 16 位 | PG0~PG15 数据 / PD3 RD / PD4 CONVST / PD7 BUSY | 编译期常驻(`app_cfg.h` 的 `APP_ADC_ENABLE` 为**未接线占位**,不门控本模块) |
|
||||
| USART1(调试串口) | UART | PA9 TX / PA10 RX | 115200 8N1;printf 日志 + `@test` 采集通道 |
|
||||
| UART5(RS-485) | UART | PC12 TX / PD2 RX / PD0 DE | 半双工;`APP_RS485_ENABLE` 开关 |
|
||||
| UART5(RS-485) | UART | PC12 TX / PD2 RX / PD0 DE | 半双工;编译期常驻(`APP_RS485_ENABLE` 为**未接线占位**) |
|
||||
| 状态 LED ×6 | GPIO | PC4 / PC5 / PB1 / PB2 / PF11 / PF12 | **低电平点亮** |
|
||||
|
||||
### 3.3 资源预算(部署红线)
|
||||
@@ -529,9 +529,7 @@ $env:DTU_KEIL_UV4 = 'D:\NotExist\UV4.exe' # 仅当前会话,不动用户级
|
||||
|
||||
| 开关 | 位置 | 当前值 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `APP_NET_ENABLE` | `App/app/app_cfg.h` | 开 | 网络(CH395F + 全部 TCP 服务) |
|
||||
| `APP_ADC_ENABLE` | 同上 | 开 | TPAFE5160 采样 |
|
||||
| `APP_RS485_ENABLE` | 同上 | 开 | RS-485 通信 |
|
||||
| `APP_NET_ENABLE` / `APP_ADC_ENABLE` / `APP_RS485_ENABLE` | `App/app/app_cfg.h` | 全定义 | **未接线占位,不门控任何代码**(P2-12,2026-10-04 核实):三个宏全库零消费点,各模块一律编译进产品;"能否裁剪"取决于产品定义(待处理内容.md §2 阶段 B0),落定后再接入真实门控。**不要把它们当开关** |
|
||||
| `TEST_SUITE_*` | `test/board/test_config.h` | 全注释(产品构建) | 测试套件**互斥**:一次构建只开一个(CH395F / 存储 / GD5F / RTC);全注释 = 正常产品固件 |
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user