728d60675f
三条道在同一棵树上交付,故合并成**一次权威构建**(@build 0 错 0 警,Code=235236 RO=26308 RW=1572
ZI=136924)后同笔入库;台账已按该构建回填(`ram_baseline.py --update` + `--write`、`chec
k_mem_numbers.py
--write`),凭证与实际 .map 同源。归属如下:
· **通讯设置页**(道G task-9):新增 `Drivers/BSP/UI/ui_page_comm.{c,h}`(通道六注入,与死
区页同骨架同纪
律),`#page=comm` 绑定使 bound **21 → 22**、内容页黄金 **47 → 53**(旧 47 页字节零变化,
新增六态含
WAIT/OK 两张);`iec104_comm` 脏位 + store_save(**无事件位**)挂 defaultTask 同点位
轮询;`port_104` 由
宏改走 getter、`IEC104_SERV_PORT` 删除;字体 +听/监(185 字全覆)。**实机链已闭环**:FTP 外改
[comm]
的 ca/port → 复位 → 串口出现 `section 'comm' (2 keys)` 与 `i104: listening o
n 9004` → 还原 2404,全程无
FAIL ⇒「重启即生效 + 端口真值」不是推断是实测。上限核对 6/8 段、2/16 键,超限现象由 TC-CONFIG-056/057
钉死(注册 -1 + `comm init: FAIL` 锚 + getter 回 ROM),**不抬宏**。
· **开机账本**(道F task-12):新增 `App/util/boot_stats.{c,h}`——上电次数落 SD2506 用户
SRAM(magic +
小端计数 + 版本 + 异或校验),一次上电 = 1 读 + ≤1 写,**零 NAND、零卷锁、零配置段**;四态互斥
UNKNOWN / FRESH / CONTINUED / RESTARTED(BLF=1 才算电池域掉过电),**读失败绝不回写**;
文案口径「自 RTC
电池周期起」,**禁写终身次数**。复位原因优先级链从 `app_main.c` 的 if-else 收进一份真源(串口与屏幕同
源);104 四个只增不清计数 + `iec104_serv_get_stats()` 留在 serv、未塞进 link(会被 open
/close 洗掉)。
运行时长按用户裁定 = **只报本次开机以来**,零新增代码。新套件 `test/host/boot_stats` 21/21,五处注入
**全部有牙**(含「漂一字节被校验和挡下而不是报 256 倍错账」)。
· **adc_cal 可诊断化**(道E task-43):三个 volatile 计数 + `adc_cal_get_stats()`
/ `adc_cal_note_persisted()`
(水位**盖写非自增**,因为一次 save 覆盖整档,数 save 会留假未落盘);「差额 × 脏位」三态语义唯一落在
`adc_cal.h`,其中「差额 > 0 且脏位恒 0」= 绕过语义 setter 的静默丢失;TC-ADCCAL-019~023。
三条**必须留档的自纠**(都是执行道自己报的,我不替他们润色):
① stdint 那条断链是**宿主套件抓到、通讯道先修**,采集道承认自己是重复添加者并删掉自己那份;
② 「exit 2 不是证据,断言变红才是」——采集道第一版反证注入了未声明标识符导致编译错,差点当成功;
③ 套件汇总行原写 `s_total/s_total`,失败时会打印「21/21 PASSED (failed=1)」这种自相矛盾的行,已改。
另修:`check_registration.py` 的 `SIM_EXEMPT` 加一行豁免 `App/util/boot_stats.c
`(依赖 I2C 与 RCC 位掩码,
MCU 专属;核过 `sys_clock.c`/`sha256.c` 同形态先例),注册反向校验 exit 1 → 0。发号 TC-IEC1
04-034、
TC-UIDATA-029 已实抬游标(`TC-IEC104-033→034`、`TC-UIDATA-026→029`)。
门禁:id-check --strict 与 plain 均 rc=0、doc-links --all rc=0、注册校验 0、cppche
ck / coding-standard /
bom-drift 0;iec104 179/179、ui_data 295/295、boot_stats 21/21、adc_cal 11
7/117、run_par 67/67;菜单 8 状态
池 5368 不变、内容页 53/53。**已知遗留**:内容页数 47 → 53 的全仓文本同步尚未做(另卡跟踪),本笔只保
证代码与黄金一致;面板注键真机那一腿缺 CLI,交台架道补。
56 lines
2.8 KiB
C
56 lines
2.8 KiB
C
/*
|
||
* 模块名称:IEC 60870-5-104 被控站服务(对外接口)
|
||
* 模块功能:声明 iec104Task 任务体与监听端口;协议实现在 App/protocol/iec104/,
|
||
* 本接口仅供 Src/freertos.c 创建任务使用。
|
||
* 创建日期:2026-10-12(B4)
|
||
*/
|
||
#ifndef IEC104_SERV_H
|
||
#define IEC104_SERV_H
|
||
|
||
#include <stdint.h> /* uint32_t(观测计数声明):头文件自含——2026-10-27 @build 实测
|
||
* 本头此前全靠包含者先带 stdint,feed 换 include 即断链报 #20 */
|
||
/* 监听端口的宏出口已删除(道G task-9 收口 task-8 交接痕):运行期真源 =
|
||
* [comm] 段 getter(App/protocol/iec104/iec104_comm.h 的 iec104_comm_port(),
|
||
* 工厂默认 IEC104_COMM_DEF_PORT = 2404 = DL/T 634.5104 标准端口)。 */
|
||
|
||
/*
|
||
* 函数功能:iec104Task 任务体(在 Src/freertos.c USER CODE 区 osThreadNew 创建)
|
||
* 入口参数:argument - 未用
|
||
* 返回值:无(任务不返回)
|
||
*/
|
||
void iec104_serv_task(void *argument);
|
||
|
||
/*
|
||
* 104 只读观测计数(道G task-12):四个数都是**上电以来**、跨重连不清零,语义各自
|
||
* 独立、不得互相换算:
|
||
* conn_up = 主站接入次数(accept 成功并建立协议层链路)
|
||
* apdu_tx = 成功发出的 APDU 帧数(短写算 tx_fail,不算这里)
|
||
* tx_fail = 发送短写/失败次数(含拆链前那几次连败)
|
||
* rx_bytes = 收到的**字节**数(不是帧数:帧边界在 link 层重组,serv 看不见)
|
||
* ⚠ 与 App/task/iec104_serv.c 里 s_liveness_ctr / s_send_fail_run / s_conn_dead 三枚
|
||
* **控制量**无关:那三枚会被复位、只有 8 位,为"要不要拆链"服务,拿来当统计必错。
|
||
* 到顶饱和在 0xFFFFFFF0,不回绕(回绕成个位数会被读成"刚上电")。
|
||
* 页面这一栏要写「本次开机以来」,与运行时长同一类,别让人读成终身值。
|
||
*/
|
||
typedef struct {
|
||
uint32_t conn_up;
|
||
uint32_t apdu_tx;
|
||
uint32_t tx_fail;
|
||
uint32_t rx_bytes;
|
||
} iec104_serv_stats_t;
|
||
|
||
/*
|
||
* 函数功能:读 104 观测计数(纯拷字段)
|
||
* 入口参数:p_out - 输出缓冲;NULL 时无害返回 iec104_serv_stats_t *
|
||
* 返 回 值:无 void
|
||
* 限定条件:**任意上下文可读**——不取锁、不读时刻、不碰 socket、不阻塞(照
|
||
* adc_cal_get_stats() / boot_stats_get() 的形态:观测口一旦去抢总线或等锁,
|
||
* 观测就成了故障的一部分)
|
||
* 函数说明:写者 = iec104Task,读者 = uiTask/喂数据侧;u32 单字读写原子,跨字段
|
||
* **不保证同一瞬间**——四枚之间没有"合起来才成立"的判据,混窗对显示无害。
|
||
* 本函数无任何清零能力(能清零的统计口不是统计口)。
|
||
*/
|
||
void iec104_serv_get_stats(iec104_serv_stats_t *p_out);
|
||
|
||
#endif /* IEC104_SERV_H */
|