docs(104): 端口口径统一成「工厂默认」,登记「改后立即重 bind」待办

用户裁定两条:① 剩余裸写端口的地方加「工厂默认」限定词,不改固件行为;
② 生效语义按需求口径「保存即生效」定,现实现(端口下次重 bind 才生效)是
要改的一侧 → 建任务登记,本笔不动代码行为。

限定词(24 处 / 17 文件):AGENTS 数据主线、App/protocol/README、根 README
文档索引、Src/freertos.c 三处任务注释、docs/README、项目启动顺序管理、存储
架构说明、软件架构与运行时规格(2)、RAM 使用分析、产品需求设计文档(5)、
项目架构总览(3)、test/host/README、iec104_master 流程注释、IEC104 上行设
计说明、继电保护功能复现规划。配图两张同批重跑:gen_arch_svg.py 与
gen_memory_svg.py(脚本与产物同一笔)。

两处陈旧计数(都做过双源核证):
- 测试开发标准流程 像素层「60 内容页」→ 内容页黄金参考 66 张(64 页);
  双源 = simulator/tests/ref/shot_*.bin 实数 66 与 check_content_pages.py
  的 PAGES 66 条(含两个 _p2)。
- .pre-commit-config.yaml 的 uinav-selftest 注释「18 张黄金参考」→ 写成
  「接线当时 18 张、现 66 张」:git log -S 定到 6a904c1b(2026-10-25),那
  天 ref 目录确实 18 张,写时为真,但它描述的是钩子现有行为,属当前态。

口径修正与登记:
- 页面扩充详细方案「通讯设置 = 无配置模型(端口与 CA 都是 #define)」→ 标
  「当时」,并写明现已在 /config.ini 的 [comm] 段可配、UI 通讯设置页可改。
- 产品需求 §通讯配置:删掉「改后需重启生效」这句把两件事混为一谈的话,改成
  需求要求「保存即生效」+ 现实现(公共地址重启、端口下次重 bind)+ 指向登记簿。
- docs/任务规划/登记簿.md §1 新增「104 端口改后立刻重 bind」:含隐性耦合
  —— .serialtest/config.json 的必检锚点写死 listening on 2404,端口一改串口
  回归必假失败;改行为时要么锚点只查 listening on,要么由脚本注入端口。

复扫(旧形态归零判据)剩 20 处未带限定词,逐条定性为刻意不改:默认值定义处、
出厂模板与断言、usage 与 argparse default、UI 黄金参考显示值、台架主站地址
(同数不同义)、串口锚点、叙事句、引用关系图坐标。逐条理由见一次性台账。

门禁:check_doc_links --sections-strict 对 16 篇改动 .md 逐个 rc=0;
check_mermaid --all 31 文件 62 围栏新发 0;check_nested_comment --all 449
文件新发 0;check_bom_drift --all 99 个名单内文件无漂移;
check_generated_fresh PASS(25 生成器 / 21 一致 / 4 只减不增基线);字节体检
无新增 BOM / CR / U+FFFD / 行尾空格(三连空行与 HEAD 逐项相同 = 存量)。
/keil-build 0 错 0 警,Program Size Code=246720 RO=29836 RW=2052 ZI=149708
与凭证同码:本笔只碰注释与配图文字,无固件行为变更。
This commit is contained in:
2026-10-30 15:40:27 +08:00
parent b79ae0abfc
commit 2525c2d948
23 changed files with 49 additions and 47 deletions
+1 -1
View File
@@ -682,7 +682,7 @@ repos:
# 背景:大窗实测——靠预置键序盲走到深页时,9 帧里只有 3 帧真是它声称的态; # 背景:大窗实测——靠预置键序盲走到深页时,9 帧里只有 3 帧真是它声称的态;
# KEY 的 ACK 是空应答、不携带状态,所以**画面是唯一事实源**。判据脚本 # KEY 的 ACK 是空应答、不携带状态,所以**画面是唯一事实源**。判据脚本
# scripts/board_ui_nav.py 据此改成闭环:每按一键重新认屏再决定下一个键。 # scripts/board_ui_nav.py 据此改成闭环:每按一键重新认屏再决定下一个键。
# 本钩子跑它的**快检档** --selftest-quick:只核"认屏认得对"(18 张黄金参考 + # 本钩子跑它的**快检档** --selftest-quick:只核"认屏认得对"(接线当时 18 张、现 66 张黄金参考 +
# 真机留档帧,目录不在版本控制里、缺就整段跳过),秒级、无构建产物依赖。 # 真机留档帧,目录不在版本控制里、缺就整段跳过),秒级、无构建产物依赖。
# ⚠ 不挂完整 --selftest:第三段闭环需要 lvgl_sim.exe(构建产物,新工作树里没有) # ⚠ 不挂完整 --selftest:第三段闭环需要 lvgl_sim.exe(构建产物,新工作树里没有)
# —— 正是同一天 mem-numbers 缺 .map 那课的形状;脚本对缺 exe 报 FAIL 并给出 # —— 正是同一天 mem-numbers 缺 .map 那课的形状;脚本对缺 exe 报 FAIL 并给出
+1 -1
View File
@@ -16,7 +16,7 @@
- **采集**:TPAFE5160(计量级 8 路,并行总线)+ 片内 ADC1(9 路,DMA)→ TIM3 1 kHz 节拍 + 原子快照 → adcTask → 语义取数与有效性校验 → 全周傅氏相量 → **测频与遥测快照(`meas` 200 ms 双区,104 与 UI 共用同一份上游,批 2)**+ 保护判据(protectTask 20 ms 判据节拍,B5)→ 104 遥信/遥测上送 - **采集**:TPAFE5160(计量级 8 路,并行总线)+ 片内 ADC1(9 路,DMA)→ TIM3 1 kHz 节拍 + 原子快照 → adcTask → 语义取数与有效性校验 → 全周傅氏相量 → **测频与遥测快照(`meas` 200 ms 双区,104 与 UI 共用同一份上游,批 2)**+ 保护判据(protectTask 20 ms 判据节拍,B5)→ 104 遥信/遥测上送
- **存储**:GD5F SPI NAND → dhara FTL → FatFs → `/log` 运行/自检等七本记录 + SOE、`/config.ini` 配置、FTP 根目录 - **存储**:GD5F SPI NAND → dhara FTL → FatFs → `/log` 运行/自检等七本记录 + SOE、`/config.ini` 配置、FTP 根目录
- **网络**:CH395F → netTask 串行 socket 栈 → FTP(21) / 对时(8888) / RemoDispBus 远程显示(7003) / IEC 60870-5-104 上行(2404) - **网络**:CH395F → netTask 串行 socket 栈 → FTP(21) / 对时(8888) / RemoDispBus 远程显示(7003) / IEC 60870-5-104 上行(工厂默认 2404)
- **人机**:LVGL 160×160 单色菜单(uiTask),**与 PC 模拟器同一份 UI 源码**,远端可看图 + 注键 - **人机**:LVGL 160×160 单色菜单(uiTask),**与 PC 模拟器同一份 UI 源码**,远端可看图 + 注键
**目录地图**(只列顶层——稳定边界;细结构自己 `ls`,别背路径;**仓库根不放一次性产物**——提交信息草稿 / 临时改写脚本 / 门禁输出与日志一律进 `ci-artifacts/`(已忽略,口径见 `.gitignore` 尾注),根目录只留工程配置与两份生成器输入 `ui_menu_tree.txt`、`ui_cn_chars.txt`): **目录地图**(只列顶层——稳定边界;细结构自己 `ls`,别背路径;**仓库根不放一次性产物**——提交信息草稿 / 临时改写脚本 / 门禁输出与日志一律进 `ci-artifacts/`(已忽略,口径见 `.gitignore` 尾注),根目录只留工程配置与两份生成器输入 `ui_menu_tree.txt`、`ui_cn_chars.txt`):
+1 -1
View File
@@ -11,7 +11,7 @@
| 子目录 | 协议 | 说明 | | 子目录 | 协议 | 说明 |
|---|---|---| |---|---|---|
| `iec104/` | IEC 60870-5-104 被控站(TCP 2404 上行) | **纯逻辑**三件套(asdu/pts/link,零 I/O,数据源 vtable 注入)→ 全栈主机侧纯逻辑单测;板端胶水与点表决策 → `docs/子系统设计/IEC104上行设计说明.md` | | `iec104/` | IEC 60870-5-104 被控站(TCP 工厂默认 2404 上行) | **纯逻辑**三件套(asdu/pts/link,零 I/O,数据源 vtable 注入)→ 全栈主机侧纯逻辑单测;板端胶水与点表决策 → `docs/子系统设计/IEC104上行设计说明.md` |
## 何时使用本目录 ## 何时使用本目录
+1 -1
View File
@@ -421,7 +421,7 @@ pre-commit run --all-files
| `docs/网络/BSD_Socket_API_使用指南.md` | BSD Socket API 使用指南(`net_socket` / `net_select`:线程安全 / 快速开始 / TCP / UDP / I/O 多路复用 / 事件回调 / API 参考 / 常见问题) | | `docs/网络/BSD_Socket_API_使用指南.md` | BSD Socket API 使用指南(`net_socket` / `net_select`:线程安全 / 快速开始 / TCP / UDP / I/O 多路复用 / 事件回调 / API 参考 / 常见问题) |
| `docs/网络/Net层阻塞模型架构设计.md` | NET 阻塞模型(挂起请求表五路语义,recv 一期 / SEND 二期已落地) | | `docs/网络/Net层阻塞模型架构设计.md` | NET 阻塞模型(挂起请求表五路语义,recv 一期 / SEND 二期已落地) |
| `docs/网络/网络自愈架构设计.md` | 网络自愈架构(监听重建 / 沉降隔离 / 周期对账) | | `docs/网络/网络自愈架构设计.md` | 网络自愈架构(监听重建 / 沉降隔离 / 周期对账) |
| `docs/子系统设计/IEC104上行设计说明.md` | IEC 60870-5-104 上行(:2404 监听,B4) | | `docs/子系统设计/IEC104上行设计说明.md` | IEC 60870-5-104 上行(工厂默认 :2404 监听,B4) |
| `docs/子系统设计/ADC采样节拍设计说明.md` | TIM3 1kHz 采样节拍(两片转换器同源硬件驱动) | | `docs/子系统设计/ADC采样节拍设计说明.md` | TIM3 1kHz 采样节拍(两片转换器同源硬件驱动) |
| `docs/UI设计/UI_设计架构.md` | LVGL UI 系统架构(菜单 / 内容页 / 内存预算) | | `docs/UI设计/UI_设计架构.md` | LVGL UI 系统架构(菜单 / 内容页 / 内存预算) |
| `docs/UI设计/菜单页面设计.md` | 菜单导航行为、数据流与内容页设计 | | `docs/UI设计/菜单页面设计.md` | 菜单导航行为、数据流与内容页设计 |
+3 -3
View File
@@ -131,7 +131,7 @@ static int hook_ptr_ok(const void *p)
* ISR 底线 → 抬至 640 words(2.5 KB,堆余量 min_ever 7152→≈6640 B,可承受)。 * ISR 底线 → 抬至 640 words(2.5 KB,堆余量 min_ever 7152→≈6640 B,可承受)。
* 2026-10-12 复测链 1320 B(保护判据接线后),余 1240 B / 48% 仍 PASS。 * 2026-10-12 复测链 1320 B(保护判据接线后),余 1240 B / 48% 仍 PASS。
* 栈值以 `scripts/stack_report.py` 实测最坏链为准,改动前后各跑一次。 * 栈值以 `scripts/stack_report.py` 实测最坏链为准,改动前后各跑一次。
* iec104Task 640 words:B4(2026-10-12)104 上行服务(2404 监听 + link 状态 * iec104Task 640 words:B4(2026-10-12)104 上行服务(默认 2404 监听 + link 状态
* 机)。link/pts 缓冲全静态;stack_report 实测静态最坏链 1456 B(拆链 * 机)。link/pts 缓冲全静态;stack_report 实测静态最坏链 1456 B(拆链
* 重建监听 → net_bind → SPI 故障 → 日志尾,日志主导)。512 words 时余 * 重建监听 → net_bind → SPI 故障 → 日志尾,日志主导)。512 words 时余
* 592 B < 1024 B ISR 底线 → 抬至 640(2.5 KB)。 * 592 B < 1024 B ISR 底线 → 抬至 640(2.5 KB)。
@@ -159,7 +159,7 @@ const osThreadAttr_t adcTask_attributes = {
.stack_size = 640 * 4, .stack_size = 640 * 4,
.priority = (osPriority_t) osPriorityAboveNormal, .priority = (osPriority_t) osPriorityAboveNormal,
}; };
/* B4(2026-10-12):IEC 60870-5-104 被控站服务(2404 监听 + 链路状态机消费)。 /* B4(2026-10-12):IEC 60870-5-104 被控站服务(默认 2404 监听 + 链路状态机消费)。
* 手写于此而非 .ioc(同 timeSyncTask/adcTask:不在 Tasks01 里 → 重生成会丢, * 手写于此而非 .ioc(同 timeSyncTask/adcTask:不在 Tasks01 里 → 重生成会丢,
* 靠审计 WARN 提示)。640 words:stack_report 实测静态最坏链 1456 B(拆链→ * 靠审计 WARN 提示)。640 words:stack_report 实测静态最坏链 1456 B(拆链→
* 重建监听→net_bind→SPI 故障→日志尾,日志主导);512 words 时余 592 B * 重建监听→net_bind→SPI 故障→日志尾,日志主导);512 words 时余 592 B
@@ -386,7 +386,7 @@ void MX_FREERTOS_Init(void) {
adcTaskHandle = osThreadNew(adc_task_func, NULL, &adcTask_attributes); adcTaskHandle = osThreadNew(adc_task_func, NULL, &adcTask_attributes);
/* B4(2026-10-12):IEC 60870-5-104 上行服务任务。任务体内先等 NET_READY /* B4(2026-10-12):IEC 60870-5-104 上行服务任务。任务体内先等 NET_READY
* 屏障(100ms 分片 + 每片喂心跳,timeSyncTask 先例),再建 2404 监听并 * 屏障(100ms 分片 + 每片喂心跳,timeSyncTask 先例),再建默认端口 2404 监听并
* 100ms 循环服务;纳入 IWDG required_mask(TASK_WD_IEC104,任何构建都创建)。 */ * 100ms 循环服务;纳入 IWDG required_mask(TASK_WD_IEC104,任何构建都创建)。 */
iec104TaskHandle = osThreadNew(iec104_serv_task, NULL, &iec104Task_attributes); iec104TaskHandle = osThreadNew(iec104_serv_task, NULL, &iec104Task_attributes);
protectTaskHandle = osThreadNew(protect_task, NULL, &protectTask_attributes); protectTaskHandle = osThreadNew(protect_task, NULL, &protectTask_attributes);
+1 -1
View File
@@ -95,7 +95,7 @@ docs/
| [`看门狗设计说明.md`](子系统设计/看门狗设计说明.md) | IWDG(CubeMX 配置)+ 任务心跳位图:选型与超时推导、掩码与埋点、取证机制、验证记录;已台架闭环(V2/V4/V5)。**§11 = 任务级饥饿的诊断方法与 `[PROF]` 实测基线**(诊断沉淀:判读口径、量化归因、三条脆弱点、明确不做的四条) | | [`看门狗设计说明.md`](子系统设计/看门狗设计说明.md) | IWDG(CubeMX 配置)+ 任务心跳位图:选型与超时推导、掩码与埋点、取证机制、验证记录;已台架闭环(V2/V4/V5)。**§11 = 任务级饥饿的诊断方法与 `[PROF]` 实测基线**(诊断沉淀:判读口径、量化归因、三条脆弱点、明确不做的四条) |
| [`ADC采样节拍设计说明.md`](子系统设计/ADC采样节拍设计说明.md) | **ADC 采集链路采样节拍(现状说明)**:TIM3 1 kHz 更新事件同时触发 TPAFE CONVST 与(经 TRGO)STM32 ADC1 + DMA 乒乓缓冲;节拍源为什么是 TIM3、DMA 硬约束、事件驱动消费与就绪门、实现落点、观测计数、性能特征与设计边界 | | [`ADC采样节拍设计说明.md`](子系统设计/ADC采样节拍设计说明.md) | **ADC 采集链路采样节拍(现状说明)**:TIM3 1 kHz 更新事件同时触发 TPAFE CONVST 与(经 TRGO)STM32 ADC1 + DMA 乒乓缓冲;节拍源为什么是 TIM3、DMA 硬约束、事件驱动消费与就绪门、实现落点、观测计数、性能特征与设计边界 |
| [docs/子系统设计/故障录波设计说明.md](子系统设计/故障录波设计说明.md) | **故障录波设计与口径属主**:1 kHz 起步与 80 点口径的偏离登记、存原始码值的理由、四段所有权与四条并发陷阱、段文件字节布局、现场单通道回放显示契约、预算与 R6 前置 | | [docs/子系统设计/故障录波设计说明.md](子系统设计/故障录波设计说明.md) | **故障录波设计与口径属主**:1 kHz 起步与 80 点口径的偏离登记、存原始码值的理由、四段所有权与四条并发陷阱、段文件字节布局、现场单通道回放显示契约、预算与 R6 前置 |
| [`IEC104上行设计说明.md`](子系统设计/IEC104上行设计说明.md) | **B4 上行规约**:IEC 60870-5-104 被控站(TCP 2404)范围/点表(V0.1 有效子集)/链路流程(k/w/t1~t3、总召、COV、遥控两段式、定值)/netTask 接入决策/预算与测试方案;协议核心纯逻辑 + 主机侧纯逻辑单测全栈单测 | | [`IEC104上行设计说明.md`](子系统设计/IEC104上行设计说明.md) | **B4 上行规约**:IEC 60870-5-104 被控站(TCP 工厂默认 2404)范围/点表(V0.1 有效子集)/链路流程(k/w/t1~t3、总召、COV、遥控两段式、定值)/netTask 接入决策/预算与测试方案;协议核心纯逻辑 + 主机侧纯逻辑单测全栈单测 |
| [`屏板链路设计说明.md`](子系统设计/屏板链路设计说明.md) | **屏板串口链路(主机侧,`Drivers/BSP/ScreenLink/`)设计**:链路与角色、USART1 700 kbaud 配置与中断收发、物理接线(含台架日志口与 PC 顶替屏板)、协议实现口径(CRC 字节序 / 整帧 DMA / 时序)、键值与状态灯映射表、资源与耗时、对外接口表、验证状态与未闭环项、坑账本 | | [`屏板链路设计说明.md`](子系统设计/屏板链路设计说明.md) | **屏板串口链路(主机侧,`Drivers/BSP/ScreenLink/`)设计**:链路与角色、USART1 700 kbaud 配置与中断收发、物理接线(含台架日志口与 PC 顶替屏板)、协议实现口径(CRC 字节序 / 整帧 DMA / 时序)、键值与状态灯映射表、资源与耗时、对外接口表、验证状态与未闭环项、坑账本 |
| [`网络/BSD_Socket_API_使用指南.md`](网络/BSD_Socket_API_使用指南.md) | **上层视图**:BSD Socket API 公开语义、示例、常见问题 | | [`网络/BSD_Socket_API_使用指南.md`](网络/BSD_Socket_API_使用指南.md) | **上层视图**:BSD Socket API 公开语义、示例、常见问题 |
| [`网络/BSD_Socket_API_函数调用关系.md`](网络/BSD_Socket_API_函数调用关系.md) | **内部视图**:netTask / 消息队列 / 保护判据挂起 / 重试对账的调用关系与设计意图 | | [`网络/BSD_Socket_API_函数调用关系.md`](网络/BSD_Socket_API_函数调用关系.md) | **内部视图**:netTask / 消息队列 / 保护判据挂起 / 重试对账的调用关系与设计意图 |
+1 -1
View File
@@ -402,7 +402,7 @@ int run_par_set_deadband(uint8_t yc_idx, float v); /* 范围校验 */
| 页 | 形态 | 现状 | 结论 | | 页 | 形态 | 现状 | 结论 |
|---|---|---|---| |---|---|---|---|
| 网口设置 | 已有真页 | `net_cfg` 全链闭环 | ✅ 不动 | | 网口设置 | 已有真页 | `net_cfg` 全链闭环 | ✅ 不动 |
| 通讯设置 | 只读信息页 | **无配置模型**(104 端口 2404、CA=1 都是 `#define`) | 做只读页,值经快照下发 | | 通讯设置 | 只读信息页 | **当时无配置模型**(104 端口与 CA 都是 `#define`;2026-10-30 核实:现已在 `/config.ini` `[comm]` 段可配、UI 通讯设置页可改) | 做只读页,值经快照下发 |
| SNTP设置 | — | **无 SNTP 客户端** | ⛔ 本批不建 | | SNTP设置 | — | **无 SNTP 客户端** | ⛔ 本批不建 |
**通讯设置 4 行**(值必须在 App 侧取、经快照下发,页面不得自己 include 协议头): **通讯设置 4 行**(值必须在 App 侧取、经快照下发,页面不得自己 include 协议头):
+14 -14
View File
@@ -43,20 +43,20 @@
<text x="1255" y="275" font-size="13" fill="#1e293b" text-anchor="middle">task/(9 任务)</text> <text x="1255" y="275" font-size="13" fill="#1e293b" text-anchor="middle">task/(9 任务)</text>
<rect x="811" y="300" width="421" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/> <rect x="811" y="300" width="421" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/>
<text x="1021" y="323" font-size="13" fill="#1e293b" text-anchor="middle">algo/(语义取数与有效性~保护判据 · 遥测快照 · 录波数据面)</text> <text x="1021" y="323" font-size="13" fill="#1e293b" text-anchor="middle">algo/(语义取数与有效性~保护判据 · 遥测快照 · 录波数据面)</text>
<rect x="1242" y="300" width="272" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/> <rect x="811" y="348" width="298" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/>
<text x="1378" y="323" font-size="13" fill="#1e293b" text-anchor="middle">protocol/iec104(104 上行 :2404)</text> <text x="960" y="371" font-size="13" fill="#1e293b" text-anchor="middle">protocol/iec104(104 上行默认 :2404)</text>
<rect x="811" y="348" width="227" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/> <rect x="1119" y="348" width="227" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/>
<text x="924" y="371" font-size="13" fill="#1e293b" text-anchor="middle">ui_data_feed(App→UI 装配)</text> <text x="1233" y="371" font-size="13" fill="#1e293b" text-anchor="middle">ui_data_feed(App→UI 装配)</text>
<rect x="1048" y="348" width="208" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/> <rect x="811" y="396" width="208" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/>
<text x="1152" y="371" font-size="13" fill="#1e293b" text-anchor="middle">sys_log · soe(记录引擎)</text> <text x="915" y="419" font-size="13" fill="#1e293b" text-anchor="middle">sys_log · soe(记录引擎)</text>
<rect x="811" y="396" width="264" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/> <rect x="1029" y="396" width="264" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/>
<text x="943" y="419" font-size="13" fill="#1e293b" text-anchor="middle">console_log(UART5 控制台单写者)</text> <text x="1161" y="419" font-size="13" fill="#1e293b" text-anchor="middle">console_log(UART5 控制台单写者)</text>
<rect x="1085" y="396" width="298" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/> <rect x="811" y="444" width="298" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/>
<text x="1234" y="419" font-size="13" fill="#1e293b" text-anchor="middle">cfg_file · prot_set_store(配置引擎)</text> <text x="960" y="467" font-size="13" fill="#1e293b" text-anchor="middle">cfg_file · prot_set_store(配置引擎)</text>
<rect x="811" y="444" width="148" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/> <rect x="1119" y="444" width="148" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/>
<text x="885" y="467" font-size="13" fill="#1e293b" text-anchor="middle">lftpd(FTP :21)</text> <text x="1193" y="467" font-size="13" fill="#1e293b" text-anchor="middle">lftpd(FTP :21)</text>
<rect x="969" y="444" width="227" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/> <rect x="1277" y="444" width="227" height="38" rx="8" fill="#ffffff" stroke="#0d9488" stroke-opacity="0.55"/>
<text x="1083" y="467" font-size="13" fill="#1e293b" text-anchor="middle">time_sync(TCP 对时 :8888)</text> <text x="1391" y="467" font-size="13" fill="#1e293b" text-anchor="middle">time_sync(TCP 对时 :8888)</text>
<rect x="26" y="542" width="1508" height="140" rx="12" fill="#f0fdf4" stroke="#16a34a" stroke-opacity="0.45"/> <rect x="26" y="542" width="1508" height="140" rx="12" fill="#f0fdf4" stroke="#16a34a" stroke-opacity="0.45"/>
<text x="44" y="568" font-size="17" font-weight="700" fill="#16a34a">④ 中间件层</text> <text x="44" y="568" font-size="17" font-weight="700" fill="#16a34a">④ 中间件层</text>
<text x="151" y="568" font-size="12" fill="#64748b">通用库 / 协议栈</text> <text x="151" y="568" font-size="12" fill="#64748b">通用库 / 协议栈</text>

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

@@ -142,7 +142,7 @@ flowchart LR
| 角色 | 与产品的接触面 | 关心的事 | | 角色 | 与产品的接触面 | 关心的事 |
|---|---|---| |---|---|---|
| **主站操作员 / 调度** | IEC 60870-5-104(:2404):总召、变位、遥控、定值、对时 | 数据可信(品质位如实)、动作可追溯(SOE 时标)、异常可自恢复 | | **主站操作员 / 调度** | IEC 60870-5-104(工厂默认 :2404):总召、变位、遥控、定值、对时 | 数据可信(品质位如实)、动作可追溯(SOE 时标)、异常可自恢复 |
| **现场调试与运维** | 串口屏板(本地带屏运行)、UART5 日志口(:115200)、FTP(:21)、ST-LINK 烧录 | 上电即用的接线口径、看得见的状态灯与日志、改配置不重启、掉电不丢参数 | | **现场调试与运维** | 串口屏板(本地带屏运行)、UART5 日志口(:115200)、FTP(:21)、ST-LINK 烧录 | 上电即用的接线口径、看得见的状态灯与日志、改配置不重启、掉电不丢参数 |
| **工厂生产 / 出厂** | `/config.ini` 工厂默认、UI 工厂菜单、自检记录 | 产线可批量预置网络与口令、自检留痕可查 | | **工厂生产 / 出厂** | `/config.ini` 工厂默认、UI 工厂菜单、自检记录 | 产线可批量预置网络与口令、自检留痕可查 |
| **远程看图 / 注键人员** | TCP :7003(RemoDispBus)+ DTU-RemoteLCD | 与本地屏板同源的画面与按键(两出口并发互不干扰) | | **远程看图 / 注键人员** | TCP :7003(RemoDispBus)+ DTU-RemoteLCD | 与本地屏板同源的画面与按键(两出口并发互不干扰) |
@@ -150,7 +150,7 @@ flowchart LR
### 2.4 典型使用场景 ### 2.4 典型使用场景
1. **开关柜现场部署**:设备上电 → 按 `/config.ini` 出厂 IP 组网 → 主站连 :2404 总召 → 1. **开关柜现场部署**:设备上电 → 按 `/config.ini` 出厂 IP 组网 → 主站连工厂默认 :2404 总召 →
现场用屏板看测量、按按键翻菜单;死机由看门狗自恢复(无需到场)。 现场用屏板看测量、按按键翻菜单;死机由看门狗自恢复(无需到场)。
2. **远程运维**:PC 经 :7003 看同一份 UI、注键操作;FTP 取 `/log`(运行/自检/SOE 记录) 2. **远程运维**:PC 经 :7003 看同一份 UI、注键操作;FTP 取 `/log`(运行/自检/SOE 记录)
与 `/config.ini`;改 IP 后 2~5 s 生效不重启;PC 推 :8888 对时。 与 `/config.ini`;改 IP 后 2~5 s 生效不重启;PC 推 :8888 对时。
@@ -1195,7 +1195,7 @@ for (i = 1; i < LED_COUNT; i++) /* LE
| FTP | TCP **21** | 文件上传/下载(根目录 `/`,NAND 存储) | 登录后任意 FTP 客户端列目录/读写(鉴权见 §7.6) | | FTP | TCP **21** | 文件上传/下载(根目录 `/`,NAND 存储) | 登录后任意 FTP 客户端列目录/读写(鉴权见 §7.6) |
| 墙钟对时 | TCP **8888** | PC 主动推送时间到设备 | 对时后核对设备时间 / 日志时间戳 | | 墙钟对时 | TCP **8888** | PC 主动推送时间到设备 | 对时后核对设备时间 / 日志时间戳 |
| 远程显示(RemoDispBus) | TCP **7003** | 远端看图(160×160 1bpp)+ 远端导航按键 | DTU-RemoteLCD 或任意 TCP 客户端连 7003 收帧 | | 远程显示(RemoDispBus) | TCP **7003** | 远端看图(160×160 1bpp)+ 远端导航按键 | DTU-RemoteLCD 或任意 TCP 客户端连 7003 收帧 |
| IEC 60870-5-104 上行 | TCP **2404** | 被控站接入:遥测/遥信上送、总召、遥控/定值下发(点表见 §6.8) | 任意 104 主站连 2404,STARTDT+总召往返(→ `docs/子系统设计/IEC104上行设计说明.md`) | | IEC 60870-5-104 上行 | TCP **工厂默认 2404** | 被控站接入:遥测/遥信上送、总召、遥控/定值下发(点表见 §6.8) | 任意 104 主站连 2404,STARTDT+总召往返(→ `docs/子系统设计/IEC104上行设计说明.md`) |
> **现场组网要求**:设备与客户端**同网段**(默认 .100/24、网关 .1);跨网段先改 IP 再上线。 > **现场组网要求**:设备与客户端**同网段**(默认 .100/24、网关 .1);跨网段先改 IP 再上线。
@@ -1375,7 +1375,7 @@ mac=00:00:00:00:00:00
> 同期(13)、看门狗(63)、遥测越限(10)等整单元(复刻明细 §1)。 > 同期(13)、看门狗(63)、遥测越限(10)等整单元(复刻明细 §1)。
**链路参数**:k=12 / w=8 / t1=15 s / t2=10 s / t3=20 s;IOA 3 字节、公共地址 2 字节、传送原因 2 字节; **链路参数**:k=12 / w=8 / t1=15 s / t2=10 s / t3=20 s;IOA 3 字节、公共地址 2 字节、传送原因 2 字节;
公共地址与端口可配(`[comm]` 段,工厂默认 1 / 2404,改后需重启生效)。 公共地址与端口可配(`[comm]` 段,工厂默认 1 / 2404)。**生效语义**(用户裁定 2026-10-30):两者都按「保存即生效」要求;现实现 = 公共地址改后重启、端口下次重 bind 才生效,差距已登记 `docs/任务规划/登记簿.md` §1「104 端口改后立刻重 bind」。
--- ---
@@ -1751,7 +1751,7 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
| 6 | 对时 | PC 推送 8888 | 设备墙钟更新、日志时间戳正确 | | 6 | 对时 | PC 推送 8888 | 设备墙钟更新、日志时间戳正确 |
| 7 | 掉电保持 | 写文件 / 改网口配置 / 改定值 → 重启 | 数据仍在(`/config.ini`、`/prot_set.bin` 按新值生效) | | 7 | 掉电保持 | 写文件 / 改网口配置 / 改定值 → 重启 | 数据仍在(`/config.ini`、`/prot_set.bin` 按新值生效) |
| 8 | LED 状态 | 目检 | 6 路 LED 随系统状态变化(低电平点亮) | | 8 | LED 状态 | 目检 | 6 路 LED 随系统状态变化(低电平点亮) |
| 9 | 104 总召与变位 | PC 主站连 :2404 → STARTDT → 总召 | 四组数据回全、`actterm` 正常;制造变位后 COT=3 上送 | | 9 | 104 总召与变位 | PC 主站连工厂默认 :2404 → STARTDT → 总召 | 四组数据回全、`actterm` 正常;制造变位后 COT=3 上送 |
| 10 | 104 遥控与定值 | `YK12` 软压板投退、`C_SE` 写定值 | 两段式正答、压板行为可观测、定值跨复位保持 | | 10 | 104 遥控与定值 | `YK12` 软压板投退、`C_SE` 写定值 | 两段式正答、压板行为可观测、定值跨复位保持 |
| 11 | 保护闭锁态 | 未标定状态下观察 `YX31` 与日志 | 判据停走且**明确可见**(不得静默不动作) | | 11 | 保护闭锁态 | 未标定状态下观察 `YX31` 与日志 | 判据停走且**明确可见**(不得静默不动作) |
| 12 | 记录可追溯 | FTP 下载 `/log/soe.log`、`/log/run.log`、`/log/selftest.log` | 记录连续、时标正确、解码校验通过 | | 12 | 记录可追溯 | FTP 下载 `/log/soe.log`、`/log/run.log`、`/log/selftest.log` | 记录连续、时标正确、解码校验通过 |
+1
View File
@@ -13,6 +13,7 @@
| 队列往返基线待重验 | **队列往返基线(1223/988µs)在发送分块握手改造后的重验**——队列往返测 DONTWAIT 队列全程;发送分块握手对该路径逐位不变 → 机制上无影响,但基线数值属分片时代,严格重锁需跑一轮 Phase 13(需 PC peer) | 2026-09-22(发送分块握手收尾留档) | 低风险:10ms/100ms 阈值余量 >8×;下次 Phase 13 窗口顺带重锁即可 | `链路延迟测试说明.md` §6.4 队列往返行的注¹ | | 队列往返基线待重验 | **队列往返基线(1223/988µs)在发送分块握手改造后的重验**——队列往返测 DONTWAIT 队列全程;发送分块握手对该路径逐位不变 → 机制上无影响,但基线数值属分片时代,严格重锁需跑一轮 Phase 13(需 PC peer) | 2026-09-22(发送分块握手收尾留档) | 低风险:10ms/100ms 阈值余量 >8×;下次 Phase 13 窗口顺带重锁即可 | `链路延迟测试说明.md` §6.4 队列往返行的注¹ |
| 网络负向场景台架验证 | **负向场景台架验证待办**(拔线断链 / 芯片级 `net_init` 失败分支 / 短写压测;正常路径已实测零回归):① PHY 拔线负向测试——断链需断 **DTU 侧**线缆或关**受管交换机端口**;② 芯片级 `net_init` 失败分支(需 SPI 故障注入);③ 短写压测(需远显客户端 + UI 推流压力) | 2026-10-03(台架拓扑 = CH395↔交换机,拔线操作受限) | 待专项台架窗口 | `实机测试实施指南.md` §10 | | 网络负向场景台架验证 | **负向场景台架验证待办**(拔线断链 / 芯片级 `net_init` 失败分支 / 短写压测;正常路径已实测零回归):① PHY 拔线负向测试——断链需断 **DTU 侧**线缆或关**受管交换机端口**;② 芯片级 `net_init` 失败分支(需 SPI 故障注入);③ 短写压测(需远显客户端 + UI 推流压力) | 2026-10-03(台架拓扑 = CH395↔交换机,拔线操作受限) | 待专项台架窗口 | `实机测试实施指南.md` §10 |
| reconcile 突发饿死 uiTask | **对时 reconcile/relisten 突发(0~4s 窗)把唯一 BelowNormal 的 uiTask 压成同一任务 800ms+ 单串缺席(饿死型,非等待型——F3 返回点喂位射程外)**:8 连窗级 UI 缺席期间喂狗面本身未断(cf=0 seg=1)、uisn=0(不在 sink 段内)、uip 在途 307→1083ms 而 uis 峰仅 183ms——被拖的 1s 在 feed/port 纯计算段墙钟。**2026-10-25 台架两轮分箱定案**:同负载换 :7003 churn 2200 周期 stall=0(阻塞型已被 F3 治愈),探针轮 3 事件 8 行全为该签名(漏检零、误报零,v1.1 口径 FAIL 面精确收缩)。处置方向 = 自愈设计 §11.3 脆弱点 1 实测样本并档「net 层跨上下文收口」项:优先级矩阵复核与 reconcile 突发分片让路两案并评;**排期 = UI 完成后的第一项**,与裸指针收口同批 | 2026-10-25(F2/F3 验收轮②,v1.1 判据下捕获) | `docs/测试说明/测试数据/boot_log_data/f3rounds_r2_probe_30min.log.gz`(3 事件 8 行 + STALL 证据行 + 同行 PROF);对照轮 `f3rounds_r1_7003_churn_30min.log.gz`;机理归档 `../网络/网络自愈架构设计.md` §4.6、`../子系统设计/看门狗设计说明.md` §11.3、`../UI设计/UI_设计架构.md` §5.8 | `../算法/继电保护功能复现规划.md`(裸指针收口项属主文档指针) | | reconcile 突发饿死 uiTask | **对时 reconcile/relisten 突发(0~4s 窗)把唯一 BelowNormal 的 uiTask 压成同一任务 800ms+ 单串缺席(饿死型,非等待型——F3 返回点喂位射程外)**:8 连窗级 UI 缺席期间喂狗面本身未断(cf=0 seg=1)、uisn=0(不在 sink 段内)、uip 在途 307→1083ms 而 uis 峰仅 183ms——被拖的 1s 在 feed/port 纯计算段墙钟。**2026-10-25 台架两轮分箱定案**:同负载换 :7003 churn 2200 周期 stall=0(阻塞型已被 F3 治愈),探针轮 3 事件 8 行全为该签名(漏检零、误报零,v1.1 口径 FAIL 面精确收缩)。处置方向 = 自愈设计 §11.3 脆弱点 1 实测样本并档「net 层跨上下文收口」项:优先级矩阵复核与 reconcile 突发分片让路两案并评;**排期 = UI 完成后的第一项**,与裸指针收口同批 | 2026-10-25(F2/F3 验收轮②,v1.1 判据下捕获) | `docs/测试说明/测试数据/boot_log_data/f3rounds_r2_probe_30min.log.gz`(3 事件 8 行 + STALL 证据行 + 同行 PROF);对照轮 `f3rounds_r1_7003_churn_30min.log.gz`;机理归档 `../网络/网络自愈架构设计.md` §4.6、`../子系统设计/看门狗设计说明.md` §11.3、`../UI设计/UI_设计架构.md` §5.8 | `../算法/继电保护功能复现规划.md`(裸指针收口项属主文档指针) |
| 104 端口改后立刻重 bind | **改了 `[comm]` 段 `port` 之后要求立刻重 bind**(不等拆链重建、不等网络代次重建)——用户裁定 2026-10-30:需求口径按「保存即生效」定,**代码语义是要改的一侧** | 现实现 = `App/task/iec104_serv.c` 的 `s_bind_listen` 每次现取 `iec104_comm_port()`,注释自陈「下次重 bind(拆链重建/网络代次重建)即生效」;连带隐性耦合:`.serialtest/config.json` 必检锚点写死 `i104: listening on 2404`,端口一改串口回归必假失败(要么锚点只查 `listening on`,要么由脚本把端口注入锚点) | 属固件行为变更,需真机验证;本笔只登记不动代码 | 用户裁定 2026-10-30;`docs/产品需求/产品需求设计文档.md` §通讯配置、`docs/测试说明/流程与规范/自动化测试流程.md` |
| relisten 沉降段原语化受阻 | **relisten 沉降段统一到驱动 `sock_reset` 原语受阻**——"去重复实现"的收口已实测回退:原语版 `ftp_abort_probe` RST **0/10**、FIN **0/5**(中止后首笔复连仍被截断到 ≤2048B),另新增 `sock_reset_sync timeout (600ms)` 与 `close: sock_reset not done` 两条 `[ERR]`;同场 net 层自建序列 **10/10 + 5/5** | 2026-10-14(同一块板 A/B,判据 `test/host/ftp_abort_probe.py`;快复连 50/50、背靠背 30/30 两版都过 → 失效面精确落在"中止后首笔复连") | **现状 = `net_listener.c` 保留自建排渣序列**(排空 + CLOSE + 排事件 + 等 CLOSED,30 ms 重试轮持续清)。重开前置三条语义:① 隔离窗内**持续**排空/关闭(残渣在 CLOSE 之后才落进 RX,一次排空接不住)② **复用让位**(复位机不得拆上层刚在同一芯片 Socket 上重建的监听)③ `net_sock_reset_sync` 改"已在运行 = 加入等待"(`begin` 返 -1 ≠ 失败) | `../网络/网络自愈架构设计.md` §8 延后项 1、§5.2 E16;`../问题记录/CH395F_Trap_Records.md` TRAP-NET-18 | | relisten 沉降段原语化受阻 | **relisten 沉降段统一到驱动 `sock_reset` 原语受阻**——"去重复实现"的收口已实测回退:原语版 `ftp_abort_probe` RST **0/10**、FIN **0/5**(中止后首笔复连仍被截断到 ≤2048B),另新增 `sock_reset_sync timeout (600ms)` 与 `close: sock_reset not done` 两条 `[ERR]`;同场 net 层自建序列 **10/10 + 5/5** | 2026-10-14(同一块板 A/B,判据 `test/host/ftp_abort_probe.py`;快复连 50/50、背靠背 30/30 两版都过 → 失效面精确落在"中止后首笔复连") | **现状 = `net_listener.c` 保留自建排渣序列**(排空 + CLOSE + 排事件 + 等 CLOSED,30 ms 重试轮持续清)。重开前置三条语义:① 隔离窗内**持续**排空/关闭(残渣在 CLOSE 之后才落进 RX,一次排空接不住)② **复用让位**(复位机不得拆上层刚在同一芯片 Socket 上重建的监听)③ `net_sock_reset_sync` 改"已在运行 = 加入等待"(`begin` 返 -1 ≠ 失败) | `../网络/网络自愈架构设计.md` §8 延后项 1、§5.2 E16;`../问题记录/CH395F_Trap_Records.md` TRAP-NET-18 |
## 2. 存储 / 日志管线 ## 2. 存储 / 日志管线
@@ -127,7 +127,7 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1`
| defaultTask | `1280*4` | 5KB | FatFS 挂载/探针 + 配置引擎 + syslog + 栈水位探针 | 2152 B(余 41%)/ 静态 **3016 B**(栈余量收口时抬栈 1024→1280,2026-10-12) | | defaultTask | `1280*4` | 5KB | FatFS 挂载/探针 + 配置引擎 + syslog + 栈水位探针 | 2152 B(余 41%)/ 静态 **3016 B**(栈余量收口时抬栈 1024→1280,2026-10-12) |
| timeSyncTask | `640*4` | 2.5KB | TCP 时间同步 | 616 B(余 50%)/ 静态 **1264 B**(栈余量收口时抬栈 512→640,2026-10-12) | | timeSyncTask | `640*4` | 2.5KB | TCP 时间同步 | 616 B(余 50%)/ 静态 **1264 B**(栈余量收口时抬栈 512→640,2026-10-12) |
| adcTask | `640*4` | 2.5KB | TPAFE5160 采样消费 + 全周傅氏相量 + 有效性校验(TIM3 1 kHz 节拍,B1→全周傅氏相量→「采样有效性校验」 2026-10-11) | **952 / 2560**(余 1608 B / 62%,台架 `/serial-boot-test` 实测 2026-10-11);静态 **1320 B**(2026-10-12 复测,保护判据接线后) | | adcTask | `640*4` | 2.5KB | TPAFE5160 采样消费 + 全周傅氏相量 + 有效性校验(TIM3 1 kHz 节拍,B1→全周傅氏相量→「采样有效性校验」 2026-10-11) | **952 / 2560**(余 1608 B / 62%,台架 `/serial-boot-test` 实测 2026-10-11);静态 **1320 B**(2026-10-12 复测,保护判据接线后) |
| iec104Task | `640*4` | 2.5KB | IEC104 上行服务(2404 监听 + link 状态机,B4 2026-10-12) | 未上板 / 静态 **1456 B**(拆链→重建监听→net_bind→SPI 故障→日志尾,日志主导;512 words 时余 592 B < ISR 底线 → 抬至 640,余 1104 B / 43%) | | iec104Task | `640*4` | 2.5KB | IEC104 上行服务(默认 2404 监听 + link 状态机,B4 2026-10-12) | 未上板 / 静态 **1456 B**(拆链→重建监听→net_bind→SPI 故障→日志尾,日志主导;512 words 时余 592 B < ISR 底线 → 抬至 640,余 1104 B / 43%) |
| protectTask | `512*4` | 2KB | 保护判据节拍(prot_elm_run 消费者 + 「自检失败闭锁」采样闭锁,B5 2026-10-12) | 未上板 / 静态 **872 B**(float 判据 + phasor 快照 + 日志尾,余 1176 B / 57%) | | protectTask | `512*4` | 2KB | 保护判据节拍(prot_elm_run 消费者 + 「自检失败闭锁」采样闭锁,B5 2026-10-12) | 未上板 / 静态 **872 B**(float 判据 + phasor 快照 + 日志尾,余 1176 B / 57%) |
| idle(内核) | `configMINIMAL_STACK_SIZE=128` | 0.5KB | 空闲 | 未观测(未取句柄) | | idle(内核) | `configMINIMAL_STACK_SIZE=128` | 0.5KB | 空闲 | 未观测(未取句柄) |
| timer(内核) | `configTIMER_TASK_STACK_DEPTH=256` | 1KB | 软定时器 | 未观测 | | timer(内核) | `configTIMER_TASK_STACK_DEPTH=256` | 1KB | 软定时器 | 未观测 |
@@ -164,7 +164,7 @@
HW 测试层 0x1F5,含 B5 protect 位 bit8);主循环 100ms 节拍喂位,屏障等待按 HW 测试层 0x1F5,含 B5 protect 位 bit8);主循环 100ms 节拍喂位,屏障等待按
100ms 分片喂位(timeSyncTask 2026-10-02 台架先例)。 100ms 分片喂位(timeSyncTask 2026-10-02 台架先例)。
- **就绪屏障**:等 `SYS_EVT_NET_READY`(`osFlagsNoClear` + 分片)后才建监听。 - **就绪屏障**:等 `SYS_EVT_NET_READY`(`osFlagsNoClear` + 分片)后才建监听。
- **单连接语义**(`AGENTS.md` 模块约定,抄 `ui_net_sink.c` 模板):2404 监听与 - **单连接语义**(`AGENTS.md` 模块约定,抄 `ui_net_sink.c` 模板):监听端口(工厂默认 2404)与
数据通道复用同一 socket(accept 返回即 listen fd);EOF 时 net 层 auto_relisten, 数据通道复用同一 socket(accept 返回即 listen fd);EOF 时 net 层 auto_relisten,
应用层**不得**关 fd(`client == listen` 分支);仅模拟器多连接后端(fd 不同)显式关。 应用层**不得**关 fd(`client == listen` 分支);仅模拟器多连接后端(fd 不同)显式关。
- **门控 + 兜底**:`net_listener_armed`/`net_can_read`(纯 RAM 读)省无谓 RPC 往返 - **门控 + 兜底**:`net_listener_armed`/`net_can_read`(纯 RAM 读)省无谓 RPC 往返
@@ -32,7 +32,7 @@ HAL_Init → SystemClock_Config → MX_GPIO/DMA/USART1/SPI2/SPI1/I2C1/UART4/IWDG
├─ netTask → 网络协议栈轮询(等 STORAGE_READY) ├─ netTask → 网络协议栈轮询(等 STORAGE_READY)
├─ ftpTask → lftpd_start("/", 21)(等 NET_READY + STORAGE_READY) ├─ ftpTask → lftpd_start("/", 21)(等 NET_READY + STORAGE_READY)
├─ adcTask → TIM3 1kHz 唤醒,ADC 采集(纯消费者) ├─ adcTask → TIM3 1kHz 唤醒,ADC 采集(纯消费者)
├─ iec104Task → IEC 60870-5-104 上行(:2404) ├─ iec104Task → IEC 60870-5-104 上行(默认 :2404)
├─ protectTask → 保护判据 20ms 节拍 ├─ protectTask → 保护判据 20ms 节拍
└─ rs485Task → 未创建(B2 暂缓,见 docs/任务规划/暂缓-RS485.md) └─ rs485Task → 未创建(B2 暂缓,见 docs/任务规划/暂缓-RS485.md)
``` ```
@@ -44,7 +44,7 @@
| `uiTask` | 4096 / 16384 | BelowNormal | 等网络 → `ui_port_init`/`ui_menu_init`/`ui_standby_init`(空闲 60 s 切待机屏)/`ui_net_sink` → 10 ms 刷新 + 数据注入 | | `uiTask` | 4096 / 16384 | BelowNormal | 等网络 → `ui_port_init`/`ui_menu_init`/`ui_standby_init`(空闲 60 s 切待机屏)/`ui_net_sink` → 10 ms 刷新 + 数据注入 |
| `timeSyncTask` | 640 / 2560 | Normal | 等网络 → TCP :8888 收 PC 推送时间 → 写 RTC | | `timeSyncTask` | 640 / 2560 | Normal | 等网络 → TCP :8888 收 PC 推送时间 → 写 RTC |
| `adcTask` | 640 / 2560 | AboveNormal | **采集主线唯一消费者**:每拍 `adc_input_poll()`(TPAFE 快照 + ADC1 DMA 帧)→ `adc_health` 有效性 → `phasor_run()` 相量 → `freq_run()` 测频 → 每 200 ms `meas_tick()` 发布遥测快照 | | `adcTask` | 640 / 2560 | AboveNormal | **采集主线唯一消费者**:每拍 `adc_input_poll()`(TPAFE 快照 + ADC1 DMA 帧)→ `adc_health` 有效性 → `phasor_run()` 相量 → `freq_run()` 测频 → 每 200 ms `meas_tick()` 发布遥测快照 |
| `iec104Task` | 640 / 2560 | Normal | 等网络 → TCP :2404 监听 → 104 链路状态机(总召/变位/周期/遥控/定值/对时)+ 断链重听 + 网络代次自愈 | | `iec104Task` | 640 / 2560 | Normal | 等网络 → TCP 工厂默认 :2404 监听 → 104 链路状态机(总召/变位/周期/遥控/定值/对时)+ 断链重听 + 网络代次自愈 |
| `protectTask` | 512 / 2048 | Normal | **20 ms 判据节拍**:采样故障闭锁判定 → 定值校验和巡检 → `prot_elm_run()` 元件判据 → 动作边沿投递 SOE(**不做 NAND I/O**) | | `protectTask` | 512 / 2048 | Normal | **20 ms 判据节拍**:采样故障闭锁判定 → 定值校验和巡检 → `prot_elm_run()` 元件判据 → 动作边沿投递 SOE(**不做 NAND I/O**) |
> `idle`(128 words)/ `timer`(256 words)由 FreeRTOS 内核创建。所有任务栈从 **56 KB** `heap_4` 堆 > `idle`(128 words)/ `timer`(256 words)由 FreeRTOS 内核创建。所有任务栈从 **56 KB** `heap_4` 堆
@@ -115,7 +115,7 @@ sequenceDiagram
N-->>F: set SYS_EVT_NET_READY N-->>F: set SYS_EVT_NET_READY
F->>F: wait NET_READY|STORAGE_READY(All|NoClear)→ lftpd_start("/", 21) F->>F: wait NET_READY|STORAGE_READY(All|NoClear)→ lftpd_start("/", 21)
U->>U: wait NET_READY(Any|NoClear)→ ui_port_init → ui_menu_init → ui_net_sink_start(7003) U->>U: wait NET_READY(Any|NoClear)→ ui_port_init → ui_menu_init → ui_net_sink_start(7003)
I->>I: wait NET_READY(Any|NoClear)→ TCP listen :2404 / :8888 I->>I: wait NET_READY(Any|NoClear)→ TCP listen :2404(默认)/ :8888
``` ```
> **顺序铁律**:① 配置段注册必须**先于** `cfg_file_load`(否则 FTP 上传的段不生效); > **顺序铁律**:① 配置段注册必须**先于** `cfg_file_load`(否则 FTP 上传的段不生效);
@@ -15,7 +15,7 @@
| `start_test_task`(testTask) | 统一测试入口,按 `TEST_SUITE_*` 分发 | NET 模式下 `osEventFlagsWait(SYS_EVT_NET_READY, osFlagsWaitAny \| osFlagsNoClear, osWaitForever)` 阻塞等待 | | `start_test_task`(testTask) | 统一测试入口,按 `TEST_SUITE_*` 分发 | NET 模式下 `osEventFlagsWait(SYS_EVT_NET_READY, osFlagsWaitAny \| osFlagsNoClear, osWaitForever)` 阻塞等待 |
| `timeSyncTask` | 墙钟时间同步 | `osEventFlagsWait(SYS_EVT_NET_READY, … \| osFlagsNoClear)` 后开始同步 | | `timeSyncTask` | 墙钟时间同步 | `osEventFlagsWait(SYS_EVT_NET_READY, … \| osFlagsNoClear)` 后开始同步 |
| `uiTask` | LVGL UI(`ui_port_init` → `ui_menu_init` → `ui_net_sink` :7003 → 10ms 刷新) | `osEventFlagsWait(SYS_EVT_NET_READY, osFlagsWaitAny \| osFlagsNoClear, osWaitForever)` | | `uiTask` | LVGL UI(`ui_port_init` → `ui_menu_init` → `ui_net_sink` :7003 → 10ms 刷新) | `osEventFlagsWait(SYS_EVT_NET_READY, osFlagsWaitAny \| osFlagsNoClear, osWaitForever)` |
| `iec104Task` | IEC 60870-5-104 上行(:2404 监听 + link 状态机,B4) | `osEventFlagsWait(SYS_EVT_NET_READY, … \| osFlagsNoClear)` | | `iec104Task` | IEC 60870-5-104 上行(工厂默认 :2404 监听 + link 状态机,B4) | `osEventFlagsWait(SYS_EVT_NET_READY, … \| osFlagsNoClear)` |
| `adcTask` | TIM3 1kHz 采样节拍**纯消费者**(`adc_input_poll()`,语义取数与有效性/全周傅氏相量取数,不做保护运算) | **无事件位依赖**:TIM3 ISR 内 `adc_tick_irq_notify()` 直接唤醒(TIM3 比调度器早 ≈100ms 启动,ISR 侧只能走该通知函数) | | `adcTask` | TIM3 1kHz 采样节拍**纯消费者**(`adc_input_poll()`,语义取数与有效性/全周傅氏相量取数,不做保护运算) | **无事件位依赖**:TIM3 ISR 内 `adc_tick_irq_notify()` 直接唤醒(TIM3 比调度器早 ≈100ms 启动,ISR 侧只能走该通知函数) |
| `protectTask` | 保护判据 20ms 节拍(`prot_elm_run()`,保护判据,B5) | 无(节拍自持,不依赖网络) | | `protectTask` | 保护判据 20ms 节拍(`prot_elm_run()`,保护判据,B5) | 无(节拍自持,不依赖网络) |
| `rs485_task` | RS-485 通信(任务体已实现) | **未在 `freertos.c` 创建**(B2 暂缓,见 `docs/任务规划/暂缓-RS485.md`) | | `rs485_task` | RS-485 通信(任务体已实现) | **未在 `freertos.c` 创建**(B2 暂缓,见 `docs/任务规划/暂缓-RS485.md`) |
+3 -3
View File
@@ -66,7 +66,7 @@
| `uiTask` | 16384 | BelowNormal | 等网络 → `ui_port_init`/`ui_menu_init`/`ui_standby_init`(空闲 60s 切待机屏)/`ui_net_sink` → 10ms 刷新:`ui_data_feed_tick()` 三帧装配 + 屏板链路驱动(组帧 B / 出键 / 离线判定 / 状态灯位)+ 录波回放页 | `ui_task_func` | | `uiTask` | 16384 | BelowNormal | 等网络 → `ui_port_init`/`ui_menu_init`/`ui_standby_init`(空闲 60s 切待机屏)/`ui_net_sink` → 10ms 刷新:`ui_data_feed_tick()` 三帧装配 + 屏板链路驱动(组帧 B / 出键 / 离线判定 / 状态灯位)+ 录波回放页 | `ui_task_func` |
| `timeSyncTask` | 2560 | Normal | 等网络 → TCP :8888 收 PC 推送时间 → 写 RTC | `time_sync_task` | | `timeSyncTask` | 2560 | Normal | 等网络 → TCP :8888 收 PC 推送时间 → 写 RTC | `time_sync_task` |
| `adcTask` | 2560 | AboveNormal | 纯消费者 + **唯一发布者**:`osThreadFlagsWait` 等 TIM3 1kHz 唤醒(ISR 内 `adc_tick_irq_notify` 置位)→ `adc_input_poll()`(TPAFE 原子快照 + STM32 ADC1 DMA 双缓冲)→ 标定折算 → 相量 → 测频;录波支路 `wave_ring_push()/tick()`;**每 200ms `meas_tick()` 发布遥测快照**(双区无锁,104 与 UI 共用同一份上游) | `adc_task_func` | | `adcTask` | 2560 | AboveNormal | 纯消费者 + **唯一发布者**:`osThreadFlagsWait` 等 TIM3 1kHz 唤醒(ISR 内 `adc_tick_irq_notify` 置位)→ `adc_input_poll()`(TPAFE 原子快照 + STM32 ADC1 DMA 双缓冲)→ 标定折算 → 相量 → 测频;录波支路 `wave_ring_push()/tick()`;**每 200ms `meas_tick()` 发布遥测快照**(双区无锁,104 与 UI 共用同一份上游) | `adc_task_func` |
| `iec104Task` | 2560 | Normal | 等网络 → IEC 60870-5-104 上行(:2404 监听 + link 状态机;遥测读 meas 快照、遥信读 `prot_elm` 元件态,COV 死区/变位上送;`[comm]`/`[run_par]` 配置;B4/批 2)。任何构建都创建,纳入 IWDG `required_mask` | `iec104_serv_task` | | `iec104Task` | 2560 | Normal | 等网络 → IEC 60870-5-104 上行(工厂默认 :2404 监听 + link 状态机;遥测读 meas 快照、遥信读 `prot_elm` 元件态,COV 死区/变位上送;`[comm]`/`[run_par]` 配置;B4/批 2)。任何构建都创建,纳入 IWDG `required_mask` | `iec104_serv_task` |
| `protectTask` | 2048 | Normal | 保护判据 20ms 节拍:`prot_elm_run()` + 「自检失败闭锁」采样故障闭锁 + 定值校验和巡检 + 动作/复归边沿 SOE 投递(B5);⚠ **当前处于「未标定闭锁」态**——`adc_cal_flags()` 无 VALID 时判据停走,两点标定写入 `[adc_cal]` 后自动解卡(用户裁定 2026-10-25:保持闭锁,不用万用表走捷径);纳入 IWDG `required_mask`(产品 `0x1F7`) | `protect_task` | | `protectTask` | 2048 | Normal | 保护判据 20ms 节拍:`prot_elm_run()` + 「自检失败闭锁」采样故障闭锁 + 定值校验和巡检 + 动作/复归边沿 SOE 投递(B5);⚠ **当前处于「未标定闭锁」态**——`adc_cal_flags()` 无 VALID 时判据停走,两点标定写入 `[adc_cal]` 后自动解卡(用户裁定 2026-10-25:保持闭锁,不用万用表走捷径);纳入 IWDG `required_mask`(产品 `0x1F7`) | `protect_task` |
> `idle`(128 words)/ `timer`(256 words)由 FreeRTOS 内核创建。所有任务栈从 FreeRTOS `heap_4` 堆分配(**已迁 CCM**,2026-10-12 B5 由 48KB 扩容至 56KB,见 `docs/内存管理/RAM使用分析与优化方案.md` §4.1.2/§2.3)。 > `idle`(128 words)/ `timer`(256 words)由 FreeRTOS 内核创建。所有任务栈从 FreeRTOS `heap_4` 堆分配(**已迁 CCM**,2026-10-12 B5 由 48KB 扩容至 56KB,见 `docs/内存管理/RAM使用分析与优化方案.md` §4.1.2/§2.3)。
@@ -148,7 +148,7 @@ sequenceDiagram
F->>F: wait NET_READY|STORAGE_READY(All|NoClear)→ lftpd_start("/", 21)<br/>→ 串口输出:waiting for connection... F->>F: wait NET_READY|STORAGE_READY(All|NoClear)→ lftpd_start("/", 21)<br/>→ 串口输出:waiting for connection...
U->>U: wait NET_READY(Any|NoClear)→ ui_port_init → ui_menu_init → ui_net_sink_start(7003)<br/>→ 10ms 循环:ui_data_feed_tick + 屏板组帧/出键/灯位 U->>U: wait NET_READY(Any|NoClear)→ ui_port_init → ui_menu_init → ui_net_sink_start(7003)<br/>→ 10ms 循环:ui_data_feed_tick + 屏板组帧/出键/灯位
T->>T: wait NET_READY(Any|NoClear)→ TCP listen :8888 T->>T: wait NET_READY(Any|NoClear)→ TCP listen :8888
I->>I: wait NET_READY(Any|NoClear)→ IEC104 listen :2404(遥测读 meas 快照 / 遥信读 prot_elm) I->>I: wait NET_READY(Any|NoClear)→ IEC104 listen 默认 :2404(遥测读 meas 快照 / 遥信读 prot_elm)
P->>P: 20ms 判据节拍 prot_elm_run()(不依赖网络;未标定即闭锁停走)+ SOE 边沿投递 P->>P: 20ms 判据节拍 prot_elm_run()(不依赖网络;未标定即闭锁停走)+ SOE 边沿投递
C->>C: wait TIM3 1kHz 唤醒(ISR adc_tick_irq_notify)→ adc_input_poll() 纯消费<br/>→ 标定→相量→测频 → wave_ring_push/tick → 每 200ms meas_tick() 发布快照 C->>C: wait TIM3 1kHz 唤醒(ISR adc_tick_irq_notify)→ adc_input_poll() 纯消费<br/>→ 标定→相量→测频 → wave_ring_push/tick → 每 200ms meas_tick() 发布快照
Note over D,N,F,U,T,I: 就绪位一律 osFlagsNoClear(状态常驻、可被多任务重复读取);<br/>仅命令位 CFG_SAVE / NET_RECONFIG 用消费型等待 Note over D,N,F,U,T,I: 就绪位一律 osFlagsNoClear(状态常驻、可被多任务重复读取);<br/>仅命令位 CFG_SAVE / NET_RECONFIG 用消费型等待
@@ -211,7 +211,7 @@ flowchart TB
NS --> C1["lftpd<br/>FTP :21"] NS --> C1["lftpd<br/>FTP :21"]
NS --> C2["time_sync<br/>对时 :8888"] NS --> C2["time_sync<br/>对时 :8888"]
NS --> C3["ui_net_sink<br/>RemoDispBus :7003"] NS --> C3["ui_net_sink<br/>RemoDispBus :7003"]
NS --> C4["iec104_serv<br/>104 上行 :2404"] NS --> C4["iec104_serv<br/>104 上行默认 :2404"]
C3 -.->|"回送 1bpp 帧 + 接收远端按键"| CLIENT["DTU-RemoteLCD 客户端"] C3 -.->|"回送 1bpp 帧 + 接收远端按键"| CLIENT["DTU-RemoteLCD 客户端"]
NC["net_cfg<br/>IP/掩码/网关/MAC"] --> NS NC["net_cfg<br/>IP/掩码/网关/MAC"] --> NS
@@ -373,7 +373,7 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
| 层 | 载体 | 抓住什么 | | 层 | 载体 | 抓住什么 |
|---|---|---| |---|---|---|
| 文本层 | `check_content_pages.py` 字形模板匹配(310 条、覆盖当时 37 页,解析字体 cmap / glyph_dsc / bitmap) | 缺字显示空白 / 标签写错等**静默失败**(不依赖 `ref/`,先于像素比对运行、失败即中止防误刷参考) | | 文本层 | `check_content_pages.py` 字形模板匹配(310 条、覆盖当时 37 页,解析字体 cmap / glyph_dsc / bitmap) | 缺字显示空白 / 标签写错等**静默失败**(不依赖 `ref/`,先于像素比对运行、失败即中止防误刷参考) |
| 像素层 | 60 内容页 + 菜单 8 状态,与黄金参考逐字节比对 | 几何 / 样式 / 光标反显 / 整体外观 | | 像素层 | 内容页黄金参考 66 张(64 页)+ 菜单 8 状态,与黄金参考逐字节比对 | 几何 / 样式 / 光标反显 / 整体外观 |
| 池水位层 | `MENU_POOL_BASELINE=5368 B` / `POOL_AFTER_ROUNDTRIP=5448 B` | LVGL 内存池泄漏 / 结构性漂移(量的是 `used`,与 `LV_MEM_SIZE` 总大小无关) | | 池水位层 | `MENU_POOL_BASELINE=5368 B` / `POOL_AFTER_ROUNDTRIP=5448 B` | LVGL 内存池泄漏 / 结构性漂移(量的是 `used`,与 `LV_MEM_SIZE` 总大小无关) |
### 5.3 黄金参考与字体纪律 ### 5.3 黄金参考与字体纪律
@@ -79,7 +79,7 @@
| 项 | 确认结论 | | 项 | 确认结论 |
| --- | --- | | --- | --- |
| 定义基准 | 两份合并(点表为验收口径 + 参考项目 104 点表为实现细节) | | 定义基准 | 两份合并(点表为验收口径 + 参考项目 104 点表为实现细节) |
| 上行规约(转发目标) | **IEC 60870-5-104**(DL/T 634.5104-2009),以太网 TCP **2404**(**非** ModBus RTU 上行) | | 上行规约(转发目标) | **IEC 60870-5-104**(DL/T 634.5104-2009),以太网 TCP **工厂默认 2404**(**非** ModBus RTU 上行) |
| 主站 / 终端地址 | 主站 `192.168.1.199:2404`;终端 `192.168.1.101~106`(可设);链路地址与 ASDU 公共体地址 2 字节、传送原因 2 字节、**IOA 3 字节**(101 为 2 字节) | | 主站 / 终端地址 | 主站 `192.168.1.199:2404`;终端 `192.168.1.101~106`(可设);链路地址与 ASDU 公共体地址 2 字节、传送原因 2 字节、**IOA 3 字节**(101 为 2 字节) |
| 采集持续性 | **持续采集**(中断驱动 + 遥测周期上送 + 死区上送 + SOE) | | 采集持续性 | **持续采集**(中断驱动 + 遥测周期上送 + 死区上送 + SOE) |
| 采样率 | **1000 Hz**(20 点/周波 @50 Hz),1 ms 保护节拍 | | 采样率 | **1000 Hz**(20 点/周波 @50 Hz),1 ms 保护节拍 |
+4 -4
View File
@@ -1,15 +1,15 @@
{ {
"built_at": "2026-10-30T14:26:00+08:00", "built_at": "2026-10-30T15:40:11+08:00",
"fingerprint": "d1418d955270ec42439af3ed9e99e73870c7c1f5923d8500e0465002dd868ccf", "fingerprint": "31cc7ac80c114ad00b01acd2627fe9bfbe86e8c83322e4ffd6d8e10ecafce5b0",
"fingerprint_files": 1466, "fingerprint_files": 1466,
"fingerprint_source": "git-index", "fingerprint_source": "git-index",
"gated_regions": [ "gated_regions": [
"RW_IRAM1", "RW_IRAM1",
"RW_CCM" "RW_CCM"
], ],
"git_head": "1b5b2f6b7e3287eb0c9c9836f4fe23583ffb51f1", "git_head": "b79ae0abfcc889036f9c3b5944a2b9e01c3ab775",
"map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map", "map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map",
"map_mtime": 1793341521, "map_mtime": 1793343427,
"pct": { "pct": {
"ER_IROM1": 26.37, "ER_IROM1": 26.37,
"RW_CCM": 87.89, "RW_CCM": 87.89,
+1 -1
View File
@@ -31,7 +31,7 @@
| `pasv_probe.py` | PASV 数据通道时序探针 | | `pasv_probe.py` | PASV 数据通道时序探针 |
| `ch395f_reuse_host.py` | Socket 复用/中止形态 PC 对端(bench 配套) | | `ch395f_reuse_host.py` | Socket 复用/中止形态 PC 对端(bench 配套) |
| `ftp_auth_bench.py` | FTP 鉴权/锁定台架腿 | | `ftp_auth_bench.py` | FTP 鉴权/锁定台架腿 |
| `iec104_master.py` | **IEC 60870-5-104 主站客户端(B6/B7)**:连设备 :2404 跑 STARTDT → 总召(actcon/四组背景扫描/actterm)→ 经 C_SE 两段写临时压低 OC1 定值确定性触发 YX16 变位(COT=3)→ 恢复 → YK11 两段式 → C_RD 读回;**B7 持久化模式 `--b7-pre/--b7-post/--b7-mark/--b7-check`**(中间 ST-LINK 复位):YK12 两段投退→保护退出/联动、定值与压板态跨复位保持(含非默认 7.5 往返);纯标准库,输出纯 ASCII 可直接重定向归档为台架证据(判据 exit 0/1/2) | | `iec104_master.py` | **IEC 60870-5-104 主站客户端(B6/B7)**:连设备 :2404(工厂默认,`--port` 可指别的)跑 STARTDT → 总召(actcon/四组背景扫描/actterm)→ 经 C_SE 两段写临时压低 OC1 定值确定性触发 YX16 变位(COT=3)→ 恢复 → YK11 两段式 → C_RD 读回;**B7 持久化模式 `--b7-pre/--b7-post/--b7-mark/--b7-check`**(中间 ST-LINK 复位):YK12 两段投退→保护退出/联动、定值与压板态跨复位保持(含非默认 7.5 往返);纯标准库,输出纯 ASCII 可直接重定向归档为台架证据(判据 exit 0/1/2) |
### 时间 / 时延 ### 时间 / 时延
+2 -1
View File
@@ -7,7 +7,8 @@ docs/子系统设计/IEC104上行设计说明.md §3/§4. Constants mirror
App/protocol/iec104/iec104_asdu.h / iec104_link.h. App/protocol/iec104/iec104_asdu.h / iec104_link.h.
Flow: Flow:
1. TCP connect device :2404, STARTDT act/con (enter RUN). 1. TCP connect device :2404 (factory default; --port overrides),
STARTDT act/con (enter RUN).
2. General interrogation C_IC_NA_1 (QOI=20): expect actcon, background 2. General interrogation C_IC_NA_1 (QOI=20): expect actcon, background
scan (YX double-point group SQ=1 -> YX single-point group SQ=1 -> scan (YX double-point group SQ=1 -> YX single-point group SQ=1 ->
YC group SQ=1 -> frequency single point), actterm. YC group SQ=1 -> frequency single point), actterm.
+1 -1
View File
@@ -56,7 +56,7 @@ L_SVC = dict(
title="③ 基础服务层", sub="应用侧服务 / 编排", color="#0d9488", bg="#f0fdfa", title="③ 基础服务层", sub="应用侧服务 / 编排", color="#0d9488", bg="#f0fdfa",
chips=["app_main(启动编排)", "sys_events(就绪屏障)", "task/(9 任务)", chips=["app_main(启动编排)", "sys_events(就绪屏障)", "task/(9 任务)",
"algo/(语义取数与有效性~保护判据 · 遥测快照 · 录波数据面)", "algo/(语义取数与有效性~保护判据 · 遥测快照 · 录波数据面)",
"protocol/iec104(104 上行 :2404)", "ui_data_feed(App→UI 装配)", "protocol/iec104(104 上行默认 :2404)", "ui_data_feed(App→UI 装配)",
"sys_log · soe(记录引擎)", "console_log(UART5 控制台单写者)", "sys_log · soe(记录引擎)", "console_log(UART5 控制台单写者)",
"cfg_file · prot_set_store(配置引擎)", "cfg_file · prot_set_store(配置引擎)",
"lftpd(FTP :21)", "time_sync(TCP 对时 :8888)"], "lftpd(FTP :21)", "time_sync(TCP 对时 :8888)"],
+1 -1
View File
@@ -88,7 +88,7 @@ TASK_STACKS = [
("testTask", 8192, "BelowNormal", 736, 736, 7456, 91, "PASS", "测试套件(产品构建不创建,取静态最坏链)"), ("testTask", 8192, "BelowNormal", 736, 736, 7456, 91, "PASS", "测试套件(产品构建不创建,取静态最坏链)"),
("timeSyncTask", 2560, "Normal", 1264, 648, 1296, 50, "PASS", "TCP 时间同步(8888)"), ("timeSyncTask", 2560, "Normal", 1264, 648, 1296, 50, "PASS", "TCP 时间同步(8888)"),
("adcTask", 2560, "AboveNormal", 1320, 952, 1240, 48, "PASS", "1 kHz 节拍消费者(语义取数与有效性采集,纯取数)"), ("adcTask", 2560, "AboveNormal", 1320, 952, 1240, 48, "PASS", "1 kHz 节拍消费者(语义取数与有效性采集,纯取数)"),
("iec104Task", 2560, "Normal", 1456, 540, 1104, 43, "PASS", "IEC 60870-5-104 上行(2404)"), ("iec104Task", 2560, "Normal", 1456, 540, 1104, 43, "PASS", "IEC 60870-5-104 上行(默认 2404)"),
("protectTask", 2048, "Normal", 872, 828, 1176, 57, "PASS", "20 ms 保护判据 + 闭锁 + 定值校验和巡检"), ("protectTask", 2048, "Normal", 872, 828, 1176, 57, "PASS", "20 ms 保护判据 + 闭锁 + 定值校验和巡检"),
] ]
KERNEL_STACKS = [("idle", 512), ("timer", 1024)] # 128/256 words(未实测) KERNEL_STACKS = [("idle", 512), ("timer", 1024)] # 128/256 words(未实测)