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:
+1
-1
@@ -33,5 +33,5 @@ FreeRTOS/CMSIS-RTOS API**(见 `AGENTS.md`「平台约束」)。
|
||||
|
||||
- 架构全景:`docs/架构设计/项目架构总览.md`
|
||||
- 启动顺序:`docs/架构设计/项目启动顺序管理.md`
|
||||
- 配置引擎:`docs/子系统设计/配置文件设计说明.md`
|
||||
- 配置引擎:`docs/子系统设计/配置文件设计.md`
|
||||
- 日志:`docs/子系统设计/控制台单写者日志设计说明.md`、`docs/子系统设计/运行与自检记录设计说明.md`
|
||||
|
||||
+1
-3
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
@@ -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`)。
|
||||
> 保留只会造成"有统一实现"的误导,故整体移除。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user