Files
STM32F4-Base/Drivers/BSP/NETCFG/sntp_cfg.c
T
super_agent_bot ad7338365c
CI / 静态门禁 (pre-commit) (push) Failing after 6m14s
CI / 主机侧单测 (MSVC) (push) Successful in 54s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 4m35s
CI / 主机侧单测 (MSVC) (pull_request) Successful in 47s
feat(sntp): 板端 SNTP 校时接入——coreSNTP 序列化器 + [sntp] 段 + 设置页(#73)
- vendored coreSNTP v2.0.0 序列化器(MIT,仅 serializer+LICENSE,零堆),
  48 字节报文编解码在库,节奏与准入判据在本方(RFC 4330 §10 调研口径)
- App/sync/time_sntp.c 挂 timeSyncTask 的 8888 事件循环,等待切片 ≤50 ms,
  不饿任务狗与 IWDG;懒建 UDP socket,代际变化/禁用/死错误码即关闭归还
- 防伪 = OriginTimestamp 逐位等于发出时 T1(含低 16 位随机小数位);
  mode/stratum/闰秒指示/KoD 按 RFC 拒收;DENY·RSTR 换服务器、RATE 只退避
- 主备轮换 + 失败指数退避(5 s 起、60 s 封顶)+ 首轮 1~5 分钟随机错峰;
  成功恢复 poll_min 周期(1~1440 分,出厂默认 60,默认不启用不发包)
- 钟面 = 本地时间:UTC+8 固定偏移落 sys_clock_set_unix(§1.1 时基裁定,
  第三个写入口,装置仍不存时区);|offset|<2 s 只记日志不步进,冷启动或
  更大偏差步进并回写 SD2506,留痕 [SNTP] step 与 syslog OPER
- 首个校验通过的同步置 SYS_EVT_TIMESYNC_READY(就绪位,消费方按需 NoClear)
- [sntp] 配置段(enable/server1/server2/poll_min)属主 sntp_cfg.c,
  注册在 net_cfg_load();UI 页 31「SNTP 设置」(密码叶):启用开关 +
  主/备服务器 octet 编辑 + 周期(分) + 保存,复用 net_cfg_save_request 链
- 测试与门禁:test/host/sntp 新套件(报文/防伪/KoD/退避周期/阶跃域/配置
  注册表)、net_cfg 与 time_sync 套件补 fake、黄金参考 66→74 张零漂移、
  字符集 228 字、Keil 0 错 0 警(RO +5,848 B 含字体)、覆盖率基线回填
- 文档:墙钟维护说明 §16、网络配置说明 [sntp] 节、配置文件设计说明变更记录、
  产品需求 FR-TIME-3 与 8.3/9.1.2 台账、UI 补齐规划/UI补齐 31 叶口径、
  登记簿销项并登记「SNTP 校时真机判据」等台架(PC 时间源 192.168.31.161/.13)
2026-11-04 16:20:22 +08:00

104 lines
3.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:SNTP 配置核心 (SNTP Configuration Core)
* 模块功能:RAM 配置副本 + 工厂默认 + 读写出口(INI [sntp] 段:
* enable/server1/server2/poll_min);加载/保存编排复用 [network]
* 段的既有链路(net_cfg_load/save + UI 保存行请求链)。段描述符
* 由 net_cfg.c 的 s_sntp_register() 组装注册——分层门禁 layer-deps
* 要求本模块不 include 配置引擎头(App/cfg/cfg_file.h),只留
* 数据本体与访问器
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:王建锋
* 创建日期:2026-11-04
* 修改记录:
* v1.0 2026-11-04 王建锋 创建初始版本(SNTP 客户端接入,#57 调研结论:
* 出厂默认关闭、服务器 IPv4 字面量、周期 1~1440 分钟)
* v1.1 2026-11-04 王建锋 分层门禁口径改造:注册编排移出本模块(见 .h 同名注)
*/
/* 头文件包含区 */
#include <string.h>
#include "sntp_cfg.h"
/* 静态变量定义区 */
/* RAM 配置副本:以工厂默认值静态初始化(落 .data),自启动即有效——
* 不依赖 cfg_file_load 是否成功(与 net_cfg s_cfg 同一口径)。
* 命名带 s_sntp_ 前缀:net_cfg.c 与本文件会在同一 TU 里被主机单测并入
* (test/host/net_cfg),裸 s_cfg/s_defaults 会同名重定义 */
static sntp_cfg_t s_sntp_cfg = {
.enable = SNTP_CFG_DEF_ENABLE,
.server_pri = SNTP_CFG_DEF_SERVER,
.server_bak = SNTP_CFG_DEF_SERVER,
.poll_min = SNTP_CFG_DEF_POLL_MIN,
};
/* 工厂默认(引擎注册 p_defaults 指向;与 s_sntp_cfg 初值共用宏单一来源) */
static const sntp_cfg_t s_sntp_defaults = {
.enable = SNTP_CFG_DEF_ENABLE,
.server_pri = SNTP_CFG_DEF_SERVER,
.server_bak = SNTP_CFG_DEF_SERVER,
.poll_min = SNTP_CFG_DEF_POLL_MIN,
};
/* 函数定义区 */
/*
* 函数功能:取 [sntp] 段 RAM 副本(引擎注册专用写入口)
* 入口参数:无
* 返回值:RAM 配置副本指针(恒非空) sntp_cfg_t *
* 限定条件:仅 net_cfg.c 组段描述符用;业务读走 sntp_cfg_get(),
* UI 编辑走 sntp_cfg_set()
*/
sntp_cfg_t *sntp_cfg_data(void) {
return &s_sntp_cfg;
}
/*
* 函数功能:取工厂默认值(引擎注册 p_defaults 指向)
* 入口参数:无
* 返回值:工厂默认结构指针(只读,恒非空) const sntp_cfg_t *
* 限定条件:仅 net_cfg.c 组段描述符用
*/
const sntp_cfg_t *sntp_cfg_defaults(void) {
return &s_sntp_defaults;
}
/*
* 函数功能:取 [sntp] 段 RAM 副本(只读)
* 入口参数:无
* 返回值:RAM 配置副本指针(恒非空) const sntp_cfg_t *
* 限定条件:无
*/
const sntp_cfg_t *sntp_cfg_get(void) {
return &s_sntp_cfg;
}
/*
* 函数功能:更新 RAM 副本(不写盘)
* 入口参数:p_new - 新配置(NULL 忽略) const sntp_cfg_t *
* 返回值:无
* 限定条件:UI 编辑路径(net_cfg_set 同口径:整结构体一次拷贝,
* 写盘走 net_cfg_save_request 整档链,属主 defaultTask)
*/
void sntp_cfg_set(const sntp_cfg_t *p_new) {
if (p_new != NULL) {
(void)memcpy(&s_sntp_cfg, p_new, sizeof(s_sntp_cfg));
}
}
/*
* 函数功能:取轮询周期(带外自愈读出口)
* 入口参数:无
* 返回值:合法范围内 = 存储值;0 或 >1440 = 工厂默认 60 uint16_t
* 限定条件:无
*/
uint16_t sntp_cfg_poll_min(void) {
uint16_t v = s_sntp_cfg.poll_min;
if ((v < SNTP_CFG_POLL_MIN_MIN) || (v > SNTP_CFG_POLL_MIN_MAX)) {
return SNTP_CFG_DEF_POLL_MIN;
}
return v;
}