3a2f9b21fb
SNTP 客户端已随 #73/PR #77 上线合入(merge 2b848c4a),用户裁定
8888 对时任务退出历史舞台(gitea:77 线程原话,跟踪 Issue #78)。
生产侧(App/sync/time_sync.c v2.0,任务入口名不变,freertos.c 零改动):
- 删除 :8888 监听、TIME 包重组、sys_clock 写入、OPER 落痕、
net_drop_conn 队头自救整条链(TIME_SYNC_PORT 宏随退役删除)
- 任务体收敛为:就绪屏障(100ms 分片、osFlagsNoClear)→
200ms 校时节拍 task_wd_beat → time_sntp_run(net_get_generation())
→ 分片延时;喂狗节奏(TASK_WD_TIMESYNC=5,required_mask)不变
- 时钟写入口自此 = SNTP / UI 手工 / 104 C_CS,双写竞态(后写者赢)
随之消失(墙钟说明 §15 退役公告、§16 现势口径)
工具与测试:
- 删除 test/host/time_sync_server.py(对时源)与 e02_probe.py
(队头阻塞探针,载体随监听退役;判据脚本 v5_log_gap_report.py
保留供旧日志解读)
- time_sync 主机单测重写 v2.0:33 断言覆盖分片延时 / 屏障 /
SNTP 节拍与网络代次当轮交接 / 未出网守门;stub 的
net_socket.h 裁剪至 net_get_generation 作编译期绊线
- 覆盖率基线 --update-baseline 收口(time_sync.c 101→20 行为刻意
缩减,全仓 48/48 套绿)
文档与图:墙钟说明 §15 改退役公告(教训保留:CH395F FIN 丢未读
缓冲)、§16 单一网络来源;产品需求 FR-TIME-2 退役注记、§6.3 重写;
架构总览 / 软件架构规格 / 网络配置 / 网络自愈 §9.3 / BSD 指南 /
看门狗说明心跳与白名单行 / 实机测试指南 / 部署环境 / 继保规划 /
UI补齐时基口径 / 页面补齐规划 SNTP 页行 / 任务规划 README 叶数与
暂缓项行(SNTP 叶已绑、UI_PAGE_MAP_COUNT=31 口径)等约 30 处现势
口径同步;arch / net_stack 两图生成器与 SVG 同笔重跑。
台账:ram_baseline --update + check_mem_numbers --write + 体积凭证
(Code 254,648→253,428,−1,220 B)。静态链复测发现 timeSyncTask
1,904 B / iec104Task 1,600 B 低于 ISR 硬线:master 2b848c4a 同判据
timeSyncTask 即 2,056 B(本 PR 只减不增,−152 B 旧任务自身帧),
双 FAIL 为 #74/#77 后既有债;抬栈属 Ask-first 未擅自执行,登记簿
新增「静态链硬线双 FAIL」待台架复采,复测快照入 docs/内存管理/data。
验证:keil-build 0 错 0 警;time_sync/sntp 主机单测绿;
ci_local 全绿;doc-links --all 0。
123 lines
6.2 KiB
C
123 lines
6.2 KiB
C
/*
|
||
* 模块名称:IEC 60870-5-104 通讯参数段([comm] 配置)公共接口
|
||
* 模块功能:/config.ini [comm] 段的对外契约——公共地址(CA = ASDU 公共地址,
|
||
* 2B)与被控站 TCP 监听端口的工厂默认、getter/setter 与合法带。
|
||
* 实现 = 配对文件 App/protocol/iec104/iec104_comm.c(coding-standard
|
||
* CODE-RULE-17 (2.2)「非 static 函数须在**配对头文件**声明」按文件名
|
||
* 判定;初版曾寄身 iec104_pts.c 尾段,2026-10-26 lead 纠偏迁出)。
|
||
* 修改记录:
|
||
* 2026-10-26 DTU 项目组 创建(道G task-8);同日实现位置改配对拆分。
|
||
* 2026-10-27 DTU 项目组 道G task-9:脏位 + iec104_comm_dirty_peek() /
|
||
* store_save()(run_par B7 同款,通讯设置页与
|
||
* defaultTask 轮询的消费面)。
|
||
* 线程约定:注册/复位 = app_main_init 内核前(run_par_init / adc_cal_init 同款
|
||
* "先注册后 load"契约);load/save/poll = defaultTask(配置引擎属主,
|
||
* netTask/uiTask 不得直接触碰引擎);getter = 任意消费上下文(u16
|
||
* 半字对齐读天然原子,重载瞬间最坏 = 单字段新旧值之一);setter =
|
||
* UI 保存交接路(task-9,net_cfg_set_* 先例)。
|
||
* 生效语义:**改后重启生效**(通讯设置页验收口径,docs/任务规划/UI补齐.md §2)——
|
||
* iec104Task 启动时取一次 getter 填 link cfg;端口另在下次重 bind
|
||
* (拆链/网络代次重建)自然生效,不必整机重启。不挂段回调、不新增
|
||
* 事件位、不走 SYS_EVT_NET_RECONFIG(网络代次链语义不同;且 CH395F
|
||
* 单连接 socket 上"换端口/拒绝重听"= close + re-listen,扫描主机
|
||
* 可打成风暴,详见 docs/子系统设计/IEC104上行设计说明.md §8)。
|
||
* 主站地址(accept 过滤)本卡**不做**:现无既有消费点,理由同上 §8。
|
||
* 创建日期:2026-10-26(道G task-8,「UI 补齐」第 5 项非 UI 前置)
|
||
*/
|
||
|
||
#ifndef IEC104_COMM_H
|
||
#define IEC104_COMM_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#include <stdint.h>
|
||
|
||
/* 段名(cfg_file 引擎注册用;≤ CFG_FILE_MAX_NAME_LEN) */
|
||
#define IEC104_COMM_SEC "comm"
|
||
|
||
/* 工厂默认:CA = 1(点表口径,V0.1 沿用);端口 = 2404(DL/T 634.5104 标准)。
|
||
* 原同名宏 IEC104_SERV_PORT(App/task/iec104_serv.h)已随道G task-9 快照切
|
||
* getter 删除——本段 getter 自 task-8 起就是运行期唯一真源,本头文件是这两个
|
||
* 常量的唯一出口 */
|
||
#define IEC104_COMM_DEF_CA 1u
|
||
#define IEC104_COMM_DEF_PORT 2404u
|
||
|
||
/* getter 合法带(带外 = RAM 副本被直写/手改时的自愈回退,adc_cal「合法带哨兵」
|
||
* 同款先例):
|
||
* ca 1..65535:0 为非法公共地址(104 半字地址域,点表无 0 号站)
|
||
* port 1024..65535:拒绝把监听端口配到 1..1023 系统保留段,避免误配顶掉
|
||
* 系统服务;与 7003 带内相撞属配置者责任(启动锚点
|
||
* "i104: listening on %u" 打印实际端口,可核) */
|
||
#define IEC104_COMM_CA_MIN 1u
|
||
#define IEC104_COMM_CA_MAX 65535u
|
||
#define IEC104_COMM_PORT_MIN 1024u
|
||
#define IEC104_COMM_PORT_MAX 65535u
|
||
|
||
/*
|
||
* 函数功能:置工厂默认并向配置引擎注册 [comm] 段(幂等,内核前调用)
|
||
* 返回值:0 - 注册成功;-1 - 重复注册/段名冲突/段数超限(RAM 副本已复位
|
||
* 工厂默认,引擎侧仍按既有注册表工作) int
|
||
* 限定条件:必须先于 defaultTask 的 cfg_file_load(net_cfg_load 内);
|
||
* 重复调用 = 仅复位 RAM 副本(单测复位依赖此语义,adc_cal 同款)
|
||
* 函数说明:不挂变更回调(改后重启生效口径,见文件头)
|
||
*/
|
||
int iec104_comm_init(void);
|
||
|
||
/*
|
||
* 函数功能:取生效公共地址(消费点 = iec104Task 启动填 link cfg)
|
||
* 返回值:RAM 副本 ca,带外回退 IEC104_COMM_DEF_CA;恒 ∈ 1..65535 uint16_t
|
||
* 限定条件:无(任意上下文,纯读)
|
||
*/
|
||
uint16_t iec104_comm_ca(void);
|
||
|
||
/*
|
||
* 函数功能:取生效监听端口(消费点 = iec104_serv s_bind_listen + 启动日志)
|
||
* 返回值:RAM 副本 port,带外回退 IEC104_COMM_DEF_PORT;恒 ∈ 1024..65535 uint16_t
|
||
* 限定条件:无(任意上下文,纯读)
|
||
*/
|
||
uint16_t iec104_comm_port(void);
|
||
|
||
/*
|
||
* 函数功能:写 ca 到 RAM 副本(守卫 = getter 合法带;非法值不提交)
|
||
* 入口参数:ca - 公共地址 1..65535 uint16_t
|
||
* 返回值:0 - 提交;-1 - 带外(副本不动) int
|
||
* 限定条件:调用方 = 通讯设置页(ui_data 通道六注入转 uiTask 上下文);
|
||
* 成功置落盘脏——写盘 = defaultTask 每轮无条件
|
||
* iec104_comm_store_save()(run_par B7 同款,无事件位、不写盘于本模块)
|
||
*/
|
||
int iec104_comm_ca_set(uint16_t ca);
|
||
|
||
/*
|
||
* 函数功能:写 port 到 RAM 副本(守卫 = getter 合法带;非法值不提交)
|
||
* 入口参数:port - 监听端口 1024..65535 uint16_t
|
||
* 返回值:0 - 提交;-1 - 带外(副本不动) int
|
||
* 限定条件:同 iec104_comm_ca_set(生效时刻 = 下一次重 bind 监听,改后不必重启)
|
||
*/
|
||
int iec104_comm_port_set(uint16_t port);
|
||
|
||
/*
|
||
* 函数功能:落盘脏探查(非消费)——页面保存行 ENTER/WAIT/OK 判定源
|
||
* 返回值:1 - 有已改未落盘;0 - 干净 uint8_t
|
||
* 限定条件:无(任意上下文纯读)
|
||
* 函数说明:脏位段级(ca+port 同档共落);页面按「结果锁存」画,与 run_par
|
||
* 页同一条纪律(ui_w_ytview 文件头)
|
||
*/
|
||
uint8_t iec104_comm_dirty_peek(void);
|
||
|
||
/*
|
||
* 函数功能:执行落盘(整档外科 save 成功清脏;失败脏保持下轮重试)
|
||
* 返回值:0 - 成功/无脏;-1 - 写盘失败(屏上 ERR 的判定源) int
|
||
* 限定条件:**defaultTask(配置引擎属主)上下文**;由 default_task.c 的
|
||
* run_par_store_save() 同点位每轮无条件调用(本模块不挂回调、
|
||
* 不设事件位——task-8 D5 口径的持久化面)
|
||
*/
|
||
int iec104_comm_store_save(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* IEC104_COMM_H */
|