docs(cfg): 配置设计档重写为现状版,删除旧二进制档叙述

原「配置文件设计说明.md」是 2026-09 的规划文档(P1~P8 实施计划、D1~D15
决策表、差距调研、模块清单动作列、已终结的开放问题),与现在跑的系统
已有明显出入。改写成只描述当前状态的「配置文件设计.md」。

新文档 9 节:概览 / 文件格式(路径与容量、语法、出厂模板原文、值类型)/
运行时机制(上电加载、外科手术式保存、2s 轮询与沉降、视图一致性守卫、
写者归属)/ 段与键表(8 段全满、注册顺序、接入新段模板、段回调)/
接口(引擎 API、平台后端)/ 内存占用(编译期钉死的 9217B 暂存)/
异常与恢复 / 双端差异 / 已知限制。

顺带修正一处事实错误:旧文档称 FTP STOR 是「写 .TMP 再 rename 原子更新」,
实际 lftpd receive_file 是原地覆写,已按代码现状改写。

旧二进制档(NCFG)的叙述按裁定从全仓移除:文档只描述当前状态,不再
交代旧版本兼容性。删掉网络配置说明 §3.2 整节(后续小节重排为 3.2~3.5),
并清理 README / 架构总览 / 产品需求 / 部署环境等 11 处同类叙述。

同步:
- 8 段注册、FTP 原地覆写、2s FAT mtime 粒度等数据更新进配置分层架构图,
  重跑后与生成器逐字节一致,check_generated_fresh 里这条存量基线下架
- 全仓 24 处引用改用新文档名,旧节号逐条映射到新节号
- 文档规范 §7.1 变更记录例外名单 4 篇减为 3 篇(该档实际无变更记录表)

验证:48 个提交期钩子全通过;Keil 构建 0 错误 0 警告;
check_doc_links / check_mermaid / check_generated_fresh 均通过。
This commit is contained in:
2026-11-15 20:55:04 +08:00
parent 26293f5054
commit 007f6a0e2f
41 changed files with 501 additions and 719 deletions
+1 -1
View File
@@ -33,5 +33,5 @@ FreeRTOS/CMSIS-RTOS API**(见 `AGENTS.md`「平台约束」)。
- 架构全景:`docs/架构设计/项目架构总览.md`
- 启动顺序:`docs/架构设计/项目启动顺序管理.md`
- 配置引擎:`docs/子系统设计/配置文件设计说明.md`
- 配置引擎:`docs/子系统设计/配置文件设计.md`
- 日志:`docs/子系统设计/控制台单写者日志设计说明.md`、`docs/子系统设计/运行与自检记录设计说明.md`
+1 -3
View File
@@ -20,11 +20,9 @@
- **零分配共享核心**:核心逻辑不含任何分配符号,动态内存收进平台后端
(`cfg_store_alloc/free`:MCU→`pvPortMalloc`,模拟器→宿主堆)
- **原子写**:写 `/config.TMP` 后 `f_rename` 替换,避免掉电损坏
- **旧档迁移已删除(2026-10-10)**:旧格式 `/cfg/netcfg.bin` 不再读取——存在则被忽略(不读、
不删、不迁移),配置回落工厂默认;`net_cfg_legacy.c/h` 与 `cfg_store_legacy_path()` 已移除
- **自研代码禁用 C 库堆分配**:MicroLIB 堆仅 512B(`malloc` 必返回 NULL)
## 相关文档
- `docs/子系统设计/配置文件设计说明.md` — 完整设计(分层/解析/持久化)
- `docs/子系统设计/配置文件设计.md` — 完整设计(分层/解析/持久化)
- `docs/子系统设计/网络配置说明.md` — 网络段
+22 -3
View File
@@ -1,4 +1,4 @@
/*
/*
* 模块名称:cfg_file
* 模块功能:通用配置文件引擎(双端共享核心)——INI 段/键表解析校验、外科手术式
* 保存(保留注释/未知内容,缺失段/键写回)、出厂模板生成、沉降去抖轮询
@@ -49,7 +49,7 @@
* 开机 load 始终正确,因 load 只解析一轮)
* 函数说明:引擎状态非重入——调用方须收敛同一任务(defaultTask:poll/save;
* 启动期 load 先于任务竞争);FS 卷并发由 FatFS REENTRANT 卷锁保证
* (见《配置文件设计说明》D15 A+ 方案)
* (见《配置文件设计》第 5 节「并发与写者收敛」)
*/
/* 头文件包含区 */
@@ -122,6 +122,7 @@ static uint8_t s_base_valid; /* 基线是否已建立 */
static uint8_t s_snap[CFG_SNAP_MAX];
static uint16_t s_reject_streak; /* 连续被拒重载计数(视图不一致;0 = 无进行中
拒绝;饱和不回绕,仅用于告警限速节奏) */
static uint16_t s_missing_streak; /* 建立基线后连续缺失的轮询数(FTP DELE 留痕的限速节奏) */
static int s_sec_hdr[CFG_FILE_MAX_SECTIONS]; /* 段头行号(0xFFFF = 未见) */
static uint16_t s_key_line[CFG_FILE_MAX_SECTIONS][CFG_FILE_MAX_KEYS]; /* 受管键行号(0xFFFF = 未见) */
@@ -1423,9 +1424,27 @@ void cfg_file_poll(void) {
cfg_file_stat_t st;
if (cfg_store_stat(cfg_store_config_path(), &st) != 0) {
return; /* 文件缺失/读失败:保留当前 RAM 配置 */
/* 文件缺失/读失败:保留当前 RAM 配置。文件曾经在位、如今不在了 =
* FTP DELE 或卷层掉文件——运行期不重建柜出模板(FTP 上传会在下趟
* poll 建基线),但持续缺失必须留痕:否则"恢复出厂 = 删文件"会静默
* 变成"什么都不发生"(setdefault 的既有语义见文件头) */
if (s_base_valid != 0u) {
if (s_missing_streak < 0xFFFFu) {
s_missing_streak++;
}
if (s_missing_streak == 1u) {
DBG_ERROR("poll: config file GONE (%s), RAM kept (recreate + reboot = factory)",
cfg_store_config_path());
}
else if ((s_missing_streak % 30u) == 0u) {
DBG_INFO("WARN: config file missing %u rounds", (unsigned)s_missing_streak);
}
}
return;
}
s_missing_streak = 0u; /* 在位/重建 = 缺失期结束 */
if (s_base_valid == 0u) {
s_base = st;
s_last = st;
+1 -1
View File
@@ -21,7 +21,7 @@
* v1.5 2026-11-05 DTU 项目组 契约同步视图一致性守卫(issue #73 SNTP 补验揪出):
* poll 读视图与 stat 令牌不符或内容坏 = 拒绝应用(RAM/基线不动、2s
* 重试自愈);save 读视图不符 = 拒存返回 -1(原文件不动)。
* 细节见 cfg_file.c v1.6 与《配置文件设计说明》变更节
* 细节见 cfg_file.c v1.6 与《配置文件设计》第 5 节视图守卫
*/
#ifndef CFG_FILE_H
+1 -1
View File
@@ -104,7 +104,7 @@ const char *cfg_store_config_path(void);
const char *cfg_store_tmp_path(void);
/* 注:旧版遗留档 getter `cfg_store_legacy_path()` 已于 2026-10-10 随旧档迁移
* net_cfg_legacy 一并删除(旧格式 /cfg/netcfg.bin 不再兼容、不再读取) */
* net_cfg_legacy 一并删除(旧二进制档不再读取) */
#ifdef __cplusplus
}
+2 -2
View File
@@ -188,7 +188,7 @@ int cfg_store_write_atomic(const char *p_path, const uint8_t *p_buf, size_t len)
* 返回值:0 - 成功;-1 - 文件缺失/读失败 int
* 限定条件:无
* 函数说明:FAT 时间分钟级粒度——同分钟内同长度重写不可检出(可接受,
* 见《配置文件设计说明》§6.2 mtime 令牌说明)
* 见《配置文件设计》第 6 节 mtime 令牌说明)
*/
int cfg_store_stat(const char *p_path, cfg_file_stat_t *p_st) {
FILINFO fno;
@@ -251,7 +251,7 @@ const char *cfg_store_tmp_path(void) {
}
/*
* 旧版遗留文件 /cfg/netcfg.bin 的路径 getter(cfg_store_legacy_path)已于
* 旧二进制档的路径 getter(cfg_store_legacy_path)已于
* 2026-10-10 随旧档迁移 net_cfg_legacy 一并删除:无调用者即无必要保留
* (留着"看起来还支持旧档"的入口会误导后续维护)
*/
+1 -1
View File
@@ -11,7 +11,7 @@
> **已删除(2026-10-02)**:`crc.c/h`(CRC-16 Modbus / CRC-8)与 `ringbuf.c/h`(SPSC 环形缓冲)
> 两模块**零调用者**且未编入任何构建——CRC 从未被链接使用:名义上的关联点 `net_cfg_legacy.c`
> (旧档 `/cfg/netcfg.bin` 迁移,**该文件亦已于 2026-10-10 删除**)自带静态 `s_crc16_modbus()`,
> (旧档迁移,**该文件亦已于 2026-10-10 删除**)自带静态 `s_crc16_modbus()`,
> 从不调用本模块;环形缓冲由 `App/log/console_log.c` 内联实现(`s_con_ring`)。
> 保留只会造成"有统一实现"的误导,故整体移除。