feat(遥测快照): 卡8 meas 双区快照模块 + adc_task 200ms 唯一发布点(道D M5)
卡 8(App/algo/meas.*,新增;布局权威 docs/任务规划/数据可信.md §4.5): - meas_snap_t = §4.5 布局(sizeof 72 B;字段偏移由 TC-MEAS-002 钉死——卡 9/ UI 按整体拷贝消费,破布局=破协议;谐波 k-bin 扩展(docs/算法/继电保护功能 复现规划.md L2-8)只许尾部追加,留口注释已写进 meas.h) - 并发 = phasor 双区 + 单字节索引翻转(L2-7 同型,无锁);seq 只增供判"换帧"; meas_get 失败路径清零填充(-2 未就绪时调用方可安全读) - 值口径 = A-lite 裁决(lead 2026-10-25 快裁,推翻票面全链):基波有效值瞬时 透传,复用 phasor_calc 纯核 → 与 phasor 使用区同拍同值(TC-MEAS-005 逐位 相等钉死);不做 4 点平均/方和根(§4.5"200 ms 是上送节拍不是平均窗") - 品质注入:CLIPPED 位图唯一源 = adc_cal_flags()(「数据可信」§4.2 三态表, 编排方注入、本层不链 adc_cal);取窗不足路 = IV|NT 且整帧 valid=0 但照常 发布(品质节拍性刷新);TEMP = 最新一点透传 + NT(「数据可信」决策 5); MEAS_QDS_* 低字节 = 104 QDS 线上值(本层不 include 协议层头——分层方向, 卡 9 直接截低字节映射);OV 留位不填(判据待运行参数化,卡 10 域) - adc_task.c 编排:新帧拍 freq_run() 后按 **tick 经过**分频(非拍计数,idle/ skip 拍会拉长名义节拍)调 meas_tick()——全仓调用点数 = 1(「数据可信」§8 风险表"快照双写"行评审判据);meas_init 挂 adc_task_init(不动 app_main.c); 心跳新增 meas: 行(seq/v/ua·un·ia_mv/f/fv)作 M5 台架观测面 - 死区 2 点确认状态机本卡不建(卡 9 迁移 104 语义时随建,lead 裁③);104 层 现有 deadband 常量未动;频率点绑定归卡 11 - 实测采样类判据(读数 vs 注入源)= 待台架实测,本卡零台架动作 测试与注册:新套件 test/host/meas(226/226,链真源 meas+phasor+sample_ring 免桩;覆盖 seq/双区无撕裂/布局/品质汇总/回绕/守卫);id_registry 建族 TC-HOST-MEAS(游标 011);meas-unit-test 钩子 + SIM_EXEMPT 一条 + uvprojx 仅增 meas.c 单条挂载(diff 已核零 UV4 抖动);App/algo/README.md §1/§2/ §3.9/§4 同步(设计说明大节与 AGENTS 口径留 lead 收口,同批 1 先例) gate:@build 0 错 0 警(Code=216352 RO=21476 RW=1232 ZI=132128);RAM 增量 RW+ZI = +152 B(快照双区恰 +144 B = 卡面 DoD;余 s_meas_ms 等编排状态), IRAM1 57.8%→约 57.9%;Flash(Code+RO+RW)+696 B;adcTask 静态最坏链 1408 B / margin 1152 B(45%)PASS(stack_report 实测,无抬栈);BOM/CR/U+FFFD/ 字面量 ASCII 逐文件自查通过(未触碰带 BOM 文件)。pre-commit run --all-files 实跑:其余钩子全绿(含 doc-links/id-check/ 覆盖率总闸/双端注册/ui-golden/全部主机单测套),仅 mem-budget + mem-numbers 两条红 = 台账受管区 vs .map 漂移(Flash/RAM 台账回填属 lead 单写者区,批 1 同口径): gate: only mem-budget/mem-numbers pending lead ledger backfill
This commit is contained in:
@@ -92,6 +92,12 @@
|
||||
* 门限 adc_cal_rail_ths,码值域与标定正交),锁存边沿 →
|
||||
* DBG_ERROR + 每开机一次 SYSLOG;心跳增 cal: 行(mV 定点
|
||||
* + valid/clipped 位图 + rail 锁存),台架注入口径见该行判读
|
||||
* v3.2 2026-10-25 DTU 项目组 L2 遥测快照发布(「数据可信」卡 8,道D,M5):新模块
|
||||
* App/algo/meas.c——本任务为唯一发布者,新帧拍内
|
||||
* freq_run() 之后按 200 ms **tick 经过**分频调
|
||||
* meas_tick()(全仓调用点 = 1,评审判据);品质注入源 =
|
||||
* adc_cal_flags() 削顶位图,频率 = 同拍 freq 读数;心跳新增
|
||||
* meas: 行(seq/v/ua·un·ia_mv/f/fv),读数比对类判据待台架实测
|
||||
*/
|
||||
|
||||
#include "adc_task.h"
|
||||
@@ -103,6 +109,7 @@
|
||||
#include "freq.h" /* L2 派生量:freq_run()/freq_get()(测频,B8) */
|
||||
#include "adc_health.h" /* L1-6:采样有效性校验(静默/丢帧/单调性/错误增量/贴轨) */
|
||||
#include "adc_cal.h" /* L1.5:通道标定折算(「数据可信」卡 2;flags 供 cal 心跳行) */
|
||||
#include "meas.h" /* L2 发布侧:遥测快照 meas_tick()(「数据可信」卡 8,道D) */
|
||||
#include "tpafe5160.h"
|
||||
#include "task_watchdog.h"
|
||||
#include "console_log.h"
|
||||
@@ -137,6 +144,11 @@ static uint32_t s_health_logged;
|
||||
static uint32_t s_rail_edge_latched;
|
||||
static uint8_t s_rail_syslogged;
|
||||
|
||||
/* 遥测快照发布闸门(「数据可信」卡 8):上次发布拍时基。分频用 **tick 经过**
|
||||
* 对比 MEAS_PERIOD_MS,非拍计数——idle/skip 拍会把拍计数口径拉得超过名义
|
||||
* 200 ms(与 v2.6 修"重复采样污染 DFT 窗"同族误差,勿"优化"成拍计数) */
|
||||
static uint32_t s_meas_ms;
|
||||
|
||||
|
||||
/* 消费者就绪门:由 adcTask 自己在进入等待前置 1;单写者 = 本任务,ISR 只读。
|
||||
* ⚠ 为什么必须有这道门:TIM3 在 app_main_init()(Src/main.c:140)里就
|
||||
@@ -265,7 +277,9 @@ int adc_task_init(void) {
|
||||
s_frames_skip = 0u;
|
||||
s_rail_edge_latched = 0u;
|
||||
s_rail_syslogged = 0u;
|
||||
s_meas_ms = 0u;
|
||||
adc_health_init(); /* 内含 L5-2 贴轨观察器复位(rail_init) */
|
||||
(void)meas_init(); /* 遥测快照双区/序号复位(幂等;发布状态属本任务,init 无日志) */
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -375,6 +389,24 @@ void adc_task_func(void *arg) {
|
||||
/* L2 派生量测频(B8):同拍紧随 phasor_run——本拍使用区已
|
||||
* 切换,freq 读的就是本拍相量(1 ms 同上下文,无竞态) */
|
||||
freq_run();
|
||||
|
||||
/* L2 遥测快照发布(「数据可信」卡 8,道D,M5):200 ms tick 经过分频。
|
||||
* 唯一发布者 = 本任务(全仓 meas_tick 调用点数 = 1 为评审判据,
|
||||
* 「数据可信」§8 风险表"快照双写"行);只在**压环成功的真新帧拍**发布
|
||||
* ——idle/skip 拍压环未推进,发布 = 重复旧窗。品质注入唯一源 =
|
||||
* adc_cal_flags()(§4.2 三态表;纯读,每 200 ms 才跑一遍)。 */
|
||||
if ((uint32_t)(now - s_meas_ms) >= MEAS_PERIOD_MS) {
|
||||
uint32_t cm = 0u;
|
||||
uint8_t m;
|
||||
|
||||
s_meas_ms = now;
|
||||
for (m = 0u; m < (uint8_t)ADC_SEM_COUNT; m++) {
|
||||
if ((adc_cal_flags((adc_semantic_t)m) & ADC_CAL_F_CLIPPED) != 0u) {
|
||||
cm |= (1uL << m);
|
||||
}
|
||||
}
|
||||
meas_tick(now, freq_valid(), freq_last(), cm);
|
||||
}
|
||||
} else {
|
||||
s_frames_skip++;
|
||||
}
|
||||
@@ -525,6 +557,26 @@ void adc_task_func(void *arg) {
|
||||
(unsigned long)adc_health_rail_sticky(),
|
||||
(unsigned long)s_rail_edge_latched);
|
||||
}
|
||||
|
||||
/* M5 遥测快照台架观测面(定点打印,MicroLIB 无 %f):
|
||||
* seq = 发布帧数(10 s 心跳间隔内应 +500±,不涨 = 发布闸门停)
|
||||
* v = 整帧有效;ua/un/ia = 基波有效值毫伏(未标定域 = 引脚电压;
|
||||
* 本行是 200 ms 快照轨,cal: 行是当拍瞬时码折算——同量级不同
|
||||
* 相位,勿互为判据)
|
||||
* f/fv = 频率读数与新鲜度(x0.01)
|
||||
* 读数与注入源比对类判据 = **待台架实测**(实测采样类跳过口径) */
|
||||
{
|
||||
meas_snap_t ms;
|
||||
|
||||
(void)meas_get(&ms); /* 未就绪(-2) = 清零帧,以下打印全 0 */
|
||||
DBG_INFO("meas: seq=%lu v=%u ua_mv=%ld un_mv=%ld ia_mv=%ld f=%ld fv=%u",
|
||||
(unsigned long)ms.seq, (unsigned)ms.valid,
|
||||
(long)(ms.yc[ADC_SEM_UA] * 1000.0f),
|
||||
(long)(ms.yc[ADC_SEM_UN] * 1000.0f),
|
||||
(long)(ms.yc[ADC_SEM_IA] * 1000.0f),
|
||||
(long)(ms.freq_hz * 100.0f),
|
||||
(unsigned)ms.freq_valid);
|
||||
}
|
||||
}
|
||||
report_at = now + ADC_TASK_REPORT_MS;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user