Files
STM32F4-Base/App/sync/time_sntp.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

54 lines
2.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.
/*
* 模块名称:Time SNTP — 板端 SNTP 客户端(UDP 48 字节报文)
* 模块功能:按 [sntp] 段配置向主/备 SNTP 服务器发送 RFC 4330 请求、校验应答
* (originate 精确匹配 + 源地址 + mode/stratum/LI/KoD)、计算钟差并
* 按阈值步进本地墙钟(sys_clock_set_unix,钟面 = 本地时间 UTC+8),
* 首次成功后置 SYS_EVT_TIMESYNC_READY;报文编解码用 vendor 的
* coreSNTP serializer(Lib/coreSNTP,MIT)
* 适用平台:STM32F407ZGTx + CH395F(timeSyncTask 内运行,模拟器不编)
* 作者:王建锋
* 创建日期:2026-11-04
*/
#ifndef TIME_SNTP_H
#define TIME_SNTP_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
/*
* 函数功能:SNTP 客户端节拍入口(幂等、非阻塞——除等待应答期一次 ≤50ms 收片)
* 入口参数:net_gen - 调用方本轮读取的网络代次(net_get_generation()) uint32_t
* 返回值:无
* 限定条件:**仅 timeSyncTask 上下文**调用(看门狗心跳由调用方在片间喂,
* 本模块单次调用最长驻留 = 一个 50ms 收片,满足 100ms 抽样窗约束)
* 函数说明:内部状态机 停用 → 到期 → 发送 → 等应答 → 步进/退避;配置
* (sntp_cfg_get())每轮现读,代次变化自动弃旧 Socket 重开
*/
void time_sntp_run(uint32_t net_gen);
/*
* 函数功能:取累计成功同步次数(诊断/测试锚点)
* 入口参数:无
* 返回值:成功次数(含死区内的"未步进但校验通过") uint32_t
* 限定条件:无
*/
uint32_t time_sntp_sync_count(void);
/*
* 函数功能:取最近一次校验通过应答的钟差(诊断锚点)
* 入口参数:无
* 返回值:钟差毫秒,截断到 int32;正 = 本地钟落后服务器;从未成功 = 0 int32_t
* 限定条件:无
*/
int32_t time_sntp_last_offset_ms(void);
#ifdef __cplusplus
}
#endif
#endif /* TIME_SNTP_H */