Files
STM32F4-Base/Drivers/BSP/NETCFG/sntp_cfg.h
T
super_agent_bot 10322208fd
CI / 静态门禁 (pre-commit) (push) Failing after 5m1s
CI / 主机侧单测 (MSVC) (push) Successful in 42s
CI / 静态门禁 (pre-commit) (pull_request) Has been cancelled
CI / 主机侧单测 (MSVC) (pull_request) Has been cancelled
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:13:24 +08:00

98 lines
4.0 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] 段)
* 模块功能:板端 SNTP 客户端配置——RAM 副本 + 工厂默认 + 读写出口
* ([sntp] 段:enable / server1 / server2 / poll_min);段描述符
* 由 net_cfg.c 在 net_cfg_load 里组好交引擎(分层门禁 layer-deps:
* 本模块不 include 引擎头);消费者(App/sync/time_sntp.c)与 UI 页
* 经 sntp_cfg_get() 只读访问,配置引擎属主仍为 defaultTask
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:王建锋
* 创建日期:2026-11-04
* 修改记录:
* v1.0 2026-11-04 王建锋 创建初始版本(SNTP 客户端接入,#57 调研结论)
* v1.1 2026-11-04 王建锋 分层门禁口径:sntp_cfg_register 改为
* sntp_cfg_data/sntp_cfg_defaults 数据口,
* 段描述符编排移 net_cfg.c(本模块不再依赖引擎头)
*/
#ifndef SNTP_CFG_H
#define SNTP_CFG_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
/* 轮询周期合法范围(分钟);范围外的存储值读取时回落工厂默认(同 [comm]
* 频段自愈口径,见 iec104_comm.c 带外值自愈) */
#define SNTP_CFG_POLL_MIN_MIN 1u
#define SNTP_CFG_POLL_MIN_MAX 1440u
/* 工厂默认:enable=0(出厂不启用,调研 §6 产品口径)、服务器留空
* (0.0.0.0 = 未配置,客户端跳过该服务器)、poll_min=60(1 小时) */
#define SNTP_CFG_DEF_ENABLE 0u
#define SNTP_CFG_DEF_SERVER { 0u, 0u, 0u, 0u }
#define SNTP_CFG_DEF_POLL_MIN 60u
typedef struct {
uint8_t enable; /* 1 = 启用 SNTP 客户端;0 = 停用(默认) */
uint8_t server_pri[4]; /* 主 SNTP 服务器 IPv4(全零 = 未配置) */
uint8_t server_bak[4]; /* 备 SNTP 服务器 IPv4(全零 = 无备) */
uint16_t poll_min; /* 成功后的轮询周期(分钟,1~1440) */
} sntp_cfg_t;
/*
* 函数功能:取 [sntp] 段 RAM 副本(引擎注册专用写入口)
* 入口参数:无
* 返回值:RAM 配置副本指针(恒非空,静态常驻) sntp_cfg_t *
* 限定条件:仅供 net_cfg.c 组 [sntp] 段描述符交配置引擎(net_cfg_load 编排);
* 分层门禁 layer-deps:本模块不 include cfg_file.h,段注册集中在
* net_cfg.c(同层基线文件)完成
*/
sntp_cfg_t *sntp_cfg_data(void);
/*
* 函数功能:取工厂默认值(引擎注册 p_defaults 指向)
* 入口参数:无
* 返回值:工厂默认结构指针(只读,恒非空) const sntp_cfg_t *
* 限定条件:同上,net_cfg.c 组段描述符专用
*/
const sntp_cfg_t *sntp_cfg_defaults(void);
/*
* 函数功能:取 [sntp] 段 RAM 副本(只读)
* 入口参数:无
* 返回值:恒非 NULL(静态常驻,load 前初值 = 工厂默认) const sntp_cfg_t *
* 限定条件:无
* 函数说明:defaultTask poll 重载瞬间可能读到撕裂值——IPv4 4 字节 / uint16
* 在本平台是单条 LDR 指令天然原子,enable 单字节同理;即便撕裂,
* SNTP 客户端最坏多用一次旧值,下一轮自愈(配置变更本就罕见)
*/
const sntp_cfg_t *sntp_cfg_get(void);
/*
* 函数功能:更新 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);
/*
* 函数功能:取轮询周期(带外自愈读出口)
* 入口参数:无
* 返回值:合法范围内 = 存储值;0 或 >1440 = 工厂默认 60 uint16_t
* 限定条件:无
* 函数说明:不改写 RAM 副本(UI 显示的仍是用户写的原值,避免"保存后
* 数字自己变了"的困惑);消费方(time_sntp)用本口而非裸字段
*/
uint16_t sntp_cfg_poll_min(void);
#ifdef __cplusplus
}
#endif
#endif /* SNTP_CFG_H */