48bc50e794
卡 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
50 lines
2.1 KiB
Python
50 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""遥测快照层(L2 发布侧,meas)主机侧单元测试运行器(L0.5,纯标准库)。
|
|
|
|
做什么:
|
|
用本机 MSVC 编译 test/host/meas/meas_test.c(它以 #include 纳入
|
|
**生产源文件** App/algo/meas.c + phasor.c + sample_ring.c),在 PC 上离线
|
|
跑 200 ms 遥测快照的:§4.5 布局钉死 / seq 只增 / 双区切换无撕裂 /
|
|
基波有效值与 phasor 使用区同拍同值 / 品质汇总(CLIPPED 位图)/ TEMP 透传 /
|
|
采样环回绕连续性,失败即非 0 退出。零硬件、零烧录、毫秒级。
|
|
工具链探测 / 编译运行全部委托 test/host/common/unit_test_harness.py。
|
|
|
|
为什么要主机侧单测(而不是只等台架):
|
|
卡 8(docs/任务规划/数据可信.md)判据一半是并发与结构类——双区撕裂窗在
|
|
台架上不可观测,削顶品质要等卡 12 标定才真实出现;读数与注入源比对类
|
|
判据仍归台架(实测采样类,本套件不覆盖)。
|
|
|
|
本层为纯算法:无寄存器、无 RTOS、无文件/外设依赖,**不需要任何桩目录**。
|
|
|
|
用法(仓库根目录):
|
|
python test/host/meas/run_unit_test.py
|
|
|
|
退出码:0=PASS / 1=测试失败 / 2=环境错误。
|
|
设计依据:docs/任务规划/数据可信.md 卡 8(道D,§4.5 快照布局);
|
|
创建日期:2026-10-25
|
|
"""
|
|
import os
|
|
import sys
|
|
|
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(HERE)))
|
|
sys.path.insert(0, os.path.join(ROOT, "test", "host", "common"))
|
|
|
|
from unit_test_harness import TestBuild, run_host_unit_test # noqa: E402
|
|
|
|
# 无桩目录:meas.c / phasor.c / sample_ring.c 仅依赖 stdint/stddef/math 与
|
|
# App/algo 内的头(adc_input.h 为纯枚举 + 声明,可主机编译)。
|
|
BUILD = TestBuild(
|
|
name="Meas Layer Tests",
|
|
src=os.path.join(HERE, "meas_test.c"),
|
|
include_dirs=[
|
|
os.path.join(ROOT, "App", "algo"),
|
|
HERE,
|
|
],
|
|
summary_marker="=== Meas Layer Tests:",
|
|
)
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(run_host_unit_test(BUILD))
|