feat(采集标定): 卡1 TPAFE 量程口径定死 + 卡3 cfg_file 补 CFG_VAL_INT
卡 1(文档口径;卡 0/12 实测类按用户指示跳过,只落口径与占位): - ADC通道映射说明.md 文首摘要行的 ±10 V 更正为 ±5 V 双极性:板上 RANGE 接 GND,±5 V 满量程 = 10 V 跨度,LSB ≈ 152.59 µV/码(@引脚) - §7 TPAFE 量程行重写并括注 ±10 V 是芯片可选档(RANGE=HIGH,跨度 20 V、 LSB 305.18 µV)、本板未用;§1 缺陷实质 2 补「满量程 = 10 V 跨度」 - 新增 §7.1 端到端量纲链路分段口径:②引脚侧 LSB 系数定死(TPAFE 152.59 / STM32 805.66 µV/码,纯转换器事实、与前端网络无关,卡 2 的 ROM 默认按此 冻结);③1k+1k 网络「2:1 分压 vs 源阻抗匹配」两读法待卡 0 注入斜率判别; ④端子→AINn 变比为仓库缺口待卡 0b;305.18/1611.3 定性为读法 A 的条件值、 判别前禁入代码;§9 变更记录编号不动(继保规划有指向本文件 §9 的跨文档 引用),新增行追加于其后 - 全仓其余 ±10 V 仅剩芯片手册转写与 tpafe5160 RANGE 枚举可选档注释 (芯片能力描述,非本板口径);数据可信.md §2.1 冲突挂账归 lead 销项 卡 3(代码;cfg_file.c 带 BOM,编辑后核 EF BB BF 完好): - 新增值类型 CFG_VAL_INT(枚举尾部追加、既有值不变;len 1/2/4 小端补码): s_decode_int() = strtol + ERANGE + 宽度上下界双校验(两端 long 均 32 位, 超范围文本饱和成 LONG_MAX 仅比界抓不住,ERANGE 必查);s_encode() 带负号 %ld 输出;cfg_file_register() 拒 INT 非法 len - 单测新增 TC-CONFIG-006/007/008:-1 / INT32_MIN / INT32_MAX / 越界拒绝 (含饱和带 2147483648)/ 编码带负号 / [sys] 段 load-save-load 往返一致 / 注册拒绝 INT len=3 —— cfg_file 套件 200/200 PASS - 回归:net_cfg 45/45、ftp_cfg 16/16 PASS,既有 network/ftp 段行为不变 - 越界改动说明:TC-CONFIG-006~008 定义行登记进属主文档 docs/测试说明/配置文件单元测试说明.md(id-check 增量拦截要求在属主登记处 补定义,该文件不在本卡写范围但为门禁唯一修复路径,仅追加 3 行用例 + 1 行 变更记录,lead 评审时留意) gate:@build 0 错误 0 警告(Code=214104 RO=18860 RW=1204 ZI=131852); RAM 增量 0 B(RW/ZI 与 ram_baseline 2026-10-24 行完全一致,IRAM1 57.7%、 CCM 87.9% 不变),Flash +324 B;uvprojx 零挂载变化、未入库。 staged 门禁全绿,唯 mem-numbers / mem-budget 因 Flash 增量需台账回填 (--write 目标 docs/内存管理/** 属单写者文件,本道不得触碰): gate: only mem-budget/mem-numbers pending lead ledger backfill (--all-files 全量自查确认失败面仅此两条;BOM/CR/U+FFFD/字面量 ASCII 已 手工自查)
This commit is contained in:
+73
-1
@@ -25,6 +25,10 @@
|
||||
* s_gen_document 两处 `off += snprintf(...)` 改检查式(截断即
|
||||
* 返回 -1,不再跳过缓冲末尾);注册拒超长键名(≤ 15 字符),
|
||||
* 使每行 112 字节余量成为可编译期验证的前提
|
||||
* v1.5 2026-10-25 DTU 项目组 数据可信卡 3:新增值类型 CFG_VAL_INT(有符号十进制,
|
||||
* len 1/2/4 小端补码)——s_decode_int() 用 strtol + ERANGE +
|
||||
* 宽度上下界校验,s_encode() 带负号输出;负零点偏移从此可
|
||||
* 干净落盘(动因见 docs/任务规划/数据可信.md §4.4 与 §7 决策 3)
|
||||
* 函数说明:引擎状态非重入——调用方须收敛同一任务(defaultTask:poll/save,见 P1-3;
|
||||
* 启动期 load 先于任务竞争);FS 卷并发由 FatFS REENTRANT 卷锁保证
|
||||
* (见《配置文件设计说明》D15 A+ 方案)
|
||||
@@ -33,12 +37,14 @@
|
||||
/* 头文件包含区 */
|
||||
#include <string.h>
|
||||
|
||||
#include <stdlib.h> /* strtoul(键值解码);堆分配一律走 cfg_store_alloc,禁 malloc */
|
||||
#include <stdlib.h> /* strtoul / strtol(键值解码);堆分配一律走 cfg_store_alloc,禁 malloc */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#include <errno.h> /* ERANGE:strtol 饱和判别(INT 键解码需要,数据可信卡 3) */
|
||||
|
||||
#include "cfg_file.h"
|
||||
|
||||
#include "cfg_file_store.h"
|
||||
@@ -263,6 +269,28 @@ static int s_encode(const cfg_key_def_t *p_key, const uint8_t *p_src, char *p_ds
|
||||
n = snprintf(p_dst, cap, "%lu", v);
|
||||
break;
|
||||
}
|
||||
case CFG_VAL_INT: {
|
||||
long v = 0L;
|
||||
unsigned long raw = 0uL;
|
||||
size_t i;
|
||||
|
||||
if (p_key->len != 1u && p_key->len != 2u && p_key->len != 4u) {
|
||||
return -1;
|
||||
}
|
||||
for (i = 0u; i < p_key->len; i++) {
|
||||
raw |= ((unsigned long)p_src[i]) << (8u * i);
|
||||
}
|
||||
/* 小端补码还原为有符号值(两端 long = 32 位:ARMCC 32 位 ARM / MSVC LLP64) */
|
||||
if (p_key->len == 1u) {
|
||||
v = (long)(int8_t)(raw & 0xFFuL);
|
||||
} else if (p_key->len == 2u) {
|
||||
v = (long)(int16_t)(raw & 0xFFFFuL);
|
||||
} else {
|
||||
v = (long)(int32_t)raw;
|
||||
}
|
||||
n = snprintf(p_dst, cap, "%ld", v);
|
||||
break;
|
||||
}
|
||||
case CFG_VAL_IP4:
|
||||
n = snprintf(p_dst, cap, "%u.%u.%u.%u",
|
||||
(unsigned)p_src[0], (unsigned)p_src[1],
|
||||
@@ -329,6 +357,44 @@ static int s_decode_uint(uint8_t *p_dst, size_t len, const char *p_val) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:解析有符号十进制值(小端补码写入,数据可信卡 3)
|
||||
* 入口参数:p_dst - 目标字段 uint8_t *
|
||||
* len - 字段字节数(1/2/4) size_t
|
||||
* p_val - 值文本(可带 +/- 号) const char *
|
||||
* 返回值:0 - 成功;-1 - 非法(空/非数字/带后缀/超本宽度范围/strtol 饱和) int
|
||||
* 限定条件:无
|
||||
* 函数说明:两端 long = 32 位,strtol 对超范围文本饱和到 LONG_MAX/MIN 并置
|
||||
* ERANGE(如 "2147483648" 饱和成 INT32_MAX 本身,光比 v>max_v 抓不住),
|
||||
* 故 ERANGE 与宽度上下界两道都要查;1/2 字节键按 int8/int16 范围收窄
|
||||
*/
|
||||
static int s_decode_int(uint8_t *p_dst, size_t len, const char *p_val) {
|
||||
const long min_v = (len == 1u) ? -128L : ((len == 2u) ? -32768L : (-2147483647L - 1L));
|
||||
const long max_v = (len == 1u) ? 127L : ((len == 2u) ? 32767L : 2147483647L);
|
||||
char *p_end = NULL;
|
||||
long v;
|
||||
size_t i;
|
||||
|
||||
if (len != 1u && len != 2u && len != 4u) {
|
||||
return -1;
|
||||
}
|
||||
if (p_val[0] == '\0') {
|
||||
return -1;
|
||||
}
|
||||
errno = 0;
|
||||
v = strtol(p_val, &p_end, 10);
|
||||
if (p_end == p_val || *p_end != '\0' || errno == ERANGE) {
|
||||
return -1;
|
||||
}
|
||||
if (v < min_v || v > max_v) {
|
||||
return -1;
|
||||
}
|
||||
for (i = 0u; i < len; i++) {
|
||||
p_dst[i] = (uint8_t)(((unsigned long)v) >> (8u * i));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:解析点分 IPv4("a.b.c.d",每段 0~255)
|
||||
* 入口参数:p_dst - 4 字节目标 uint8_t *
|
||||
@@ -440,6 +506,8 @@ static int s_decode(const cfg_key_def_t *p_key, uint8_t *p_dst, const char *p_va
|
||||
switch (p_key->type) {
|
||||
case CFG_VAL_UINT:
|
||||
return s_decode_uint(p_dst, p_key->len, p_val);
|
||||
case CFG_VAL_INT:
|
||||
return s_decode_int(p_dst, p_key->len, p_val);
|
||||
case CFG_VAL_IP4:
|
||||
return s_decode_ip4(p_dst, p_val);
|
||||
case CFG_VAL_MAC:
|
||||
@@ -1025,6 +1093,10 @@ int cfg_file_register(const cfg_section_reg_t *p_reg) {
|
||||
(p_key->len != 1u && p_key->len != 2u && p_key->len != 4u)) {
|
||||
return -1;
|
||||
}
|
||||
if (p_key->type == CFG_VAL_INT &&
|
||||
(p_key->len != 1u && p_key->len != 2u && p_key->len != 4u)) {
|
||||
return -1;
|
||||
}
|
||||
if (p_key->type == CFG_VAL_IP4 && p_key->len != 4u) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
+7
-1
@@ -15,6 +15,9 @@
|
||||
* 超长;超长处置补自检留痕
|
||||
* v1.3 2026-10-15 王建锋 E-16(历史审计 P2,属主文档已删除):新增公开常量
|
||||
* CFG_FILE_MAX_NAME_LEN(段名/键名上限 15 字符)
|
||||
* v1.4 2026-10-25 DTU 项目组 数据可信卡 3:新增 CFG_VAL_INT 有符号十进制值类型
|
||||
* (len = 1/2/4,小端补码)——标定零点偏移等负值需有符号
|
||||
* 落盘,动因与取舍见 docs/任务规划/数据可信.md §4.4
|
||||
*/
|
||||
|
||||
#ifndef CFG_FILE_H
|
||||
@@ -51,12 +54,15 @@ extern "C" {
|
||||
* IP4 :点分 IPv4 "a.b.c.d";字段 uint8_t[4]
|
||||
* MAC :十六进制 MAC "xx:xx:xx:xx:xx:xx"(分隔符兼容 - 与 .);字段 uint8_t[6]
|
||||
* STR :ASCII 字符串;字段 char[len](len = 缓冲长度,自动补 NUL)
|
||||
* INT :有符号十进制(可带 + / - 号);len = 目标字段字节数(1/2/4,小端补码,
|
||||
* 范围按宽度收窄:int8/int16/int32;负值合法,如标定零点偏移)
|
||||
*/
|
||||
typedef enum {
|
||||
CFG_VAL_UINT = 0,
|
||||
CFG_VAL_IP4,
|
||||
CFG_VAL_MAC,
|
||||
CFG_VAL_STR
|
||||
CFG_VAL_STR,
|
||||
CFG_VAL_INT
|
||||
} cfg_val_type_t;
|
||||
|
||||
/* 键定义(offset/len 均相对段 RAM 副本起始) */
|
||||
|
||||
Reference in New Issue
Block a user