Files
cnc_wams/完善wasm/working/27-04-HAL-Component-Precompile-Runtime-Gate实施记录.md
2026-07-10 21:26:42 -04:00

5.8 KiB
Raw Blame History

27-04 HAL Component Precompile Runtime Gate 实施记录

定位

本文件落实 ACC-039/INT-026,承接 24 的阶段 B-D 和 26 的 P1 源码同步结果,把 and2or2notmux2scale 从“源码已同步”推进到 LinuxCNC halcompile 派生、预编译 manifest、WASM 实例化、线程回调、net 传播和代表 Web 配置消费均有机器 gate 的状态。

严格边界:本轮只晋级 Web/WASM 虚拟 HAL 仿真运行时。dynamicLoadrtSupported=false,未知组件必须 blocked宿主 RTAPI 实时内核、共享内存、内核模块、硬件驱动和任意动态模块加载没有晋级。

LinuxCNC 派生链

生成入口:

wasm-port/tools/generate_hal_component_sources.sh
wasm-port/tools/generate_hal_component_sources.mjs

生成器固定为锁定源码树中的 ../linuxcnc/bin/halcompile --preprocess。脚本校验 LinuxCNC HEAD 与 tools/upstream-baseline.txt,从五个 vendored .comp 生成 build/generated/hal-components/*.c,仅规范化生成时间行并附加最窄的 start/reset C ABI。generation-report.json 逐组件记录 source、generator、command fingerprint 和 generated SHA-256。

生成 C 不进入上游 vendor manifest也不冒充 LinuxCNC 原始源码;其上游语义仍由 26 的 P0/P1 字节和固定哈希 gate 约束。

预编译 Manifest

新增 wasm-port/runtime/manifests/hal_component_precompile_manifest.json,固定:

  • upstreamCommit=60597ee0718873d2449058c824262a275e5e4bad
  • allowlist 恰好为 and2/or2/not/mux2/scale
  • 每个组件的 .comp 路径、source SHA-256、generated path、factory/step symbol、pin 和 count/names 参数;
  • dynamicLoadrtSupported=false
  • unknownComponentPolicy=blocked

verify_hal_component_precompile_manifest.mjs 同时复算 source/generated hash并将 manifest、generation report 和实际文件闭合。

真实执行链

linuxcnc_hal_runtime.cpp 现按以下路径执行 allowlist 组件:

loadrt + names/count
  -> allowlist/factory
  -> halcompile 生成的 pin 与 hal_export_funct
  -> addf 绑定 callback/instance
  -> lchal_step_threads 调用生成公式
  -> HAL_OUT 更新 signal
  -> net 传播到下游 pin

运行时同时补齐:

  • names=count= 互斥和非法参数 blocked
  • 未知 loadrt 返回 blocked不再只记成功事件
  • LinuxCNC HAL net 行的 =><=<=> 方向标记解析;
  • 同一 WASM 模块重新初始化 HAL session 时清空生成组件实例链;
  • 保留 trivkins 既有 legacy boundary避免回退既有 Task/Motion gate。

专项证据

cd wasm-port
./tools/build_task_hal_wasm.sh
node tests/wasm/node/verify_hal_component_precompile_manifest.mjs
node tests/wasm/node/verify_hal_component_truth_tables.mjs
node tests/wasm/node/verify_hal_component_thread_net_execution.mjs

实际输出:

hal_component_generation=ok
linuxcnc_task_hal_wasm_build=ok
hal_component_precompile_manifest=ok
hal_component_truth_tables=ok
hal_component_thread_net_execution=ok
unknown_loadrt_component_blocked=ok
hal_component_session_reset=ok

truth-table gate 覆盖 and2/or2 各 4 组、not 2 组、mux2 两路选择和 scale 三组正负 gain/offset 浮点公式,输出 build/evidence/hal-component-truth-table-evidence.json。thread/net gate 证明生成函数真实执行、输出 signal 传播、非法参数阻断和第二 HAL session 重建。

Web 代表配置消费

目标 Web 项目新增 tests/node/verify_hal_component_runtime_evidence.mjs 并挂入 smoke:node。gate 读取 vendored xyzac-trt_cmds.hal 中:

loadrt mux2 names=J0_mux,J1_mux,J2_mux,J3_mux,J4_mux
loadrt scale names=rpm_rps
addf J0_mux servo-thread
addf rpm_rps servo-thread

随后用同一 task-HAL WASM 实例化并执行 J0_muxrpm_rps,验证 J0_mux.out=37.25rpm_rps.out=20,同时阻断 web-local-formula 未知组件。Web 项目没有复制五个组件公式。

回归结果

以下既有 gate 全部通过:

  • verify_hal_component_source_sync.shverify_vendor_sync.sh
  • verify_hal_runtime.shverify_task_hal_wasm.sh
  • 目标 Web smoke:node
  • verify_linuxcnc_task_hal_runtime.mjs

补充执行的 build_native_probes.sh 已通过。全量 verify_native_probes.sh 后续在组件范围外的 xyzac_switchkins_test_3.ngc 出现 Bus error该 INI 引用锁定源码树中不存在的 xyzac.var,汇总产生 1 个 unexpected fail。本轮没有将其伪装为 expected-fail因此不把全量 native 包列入上述通过清单。

后续状态:该历史失败已在 ACC-045/INT-032 中由当前 source/vendor 资产和串行全量复验解除。最终结果为 sim-config 159 total / 151 pass / 8 expected_fail / 0 unexpected_fail、nc_files 107 total / 101 pass / 6 expected_fail / 0 unexpected_fail,详见 33-Native全量回归最终收口.md

系统 /usr/bin/emccwasm-opt 版本不匹配,因此 wasm_incremental_build_lib.sh 现优先加载仓库机器已有 EMSDK最终构建使用 EMSDK 6.0.2 并通过。

04 状态

04 项 本轮后状态
4.7-4.11 L3 条件通过LinuxCNC 派生预编译 Web/WASM 仿真运行时、truth-table/formula、thread/net 和 Web 代表配置 gate 通过
4.16 条件通过/Blockedallowlist loadrt 可实例化执行;未知组件和任意运行时动态模块加载仍 blocked

下一步

优先落实 23 的 HAL Meter/Scope JSON evidence25 的 host runtime evidence/release-promotion 分离 gate。不得从本轮组件仿真证据继承宿主 realtime 或 hardware promotion。

结论

ACC-039/INT-026 已闭合五个基础 HAL component 的 LinuxCNC 派生预编译运行时证据。04 的 4.7-4.11 可在 Web/WASM simulation 边界内晋级,4.16 仅对固定 allowlist 条件通过;动态模块加载仍不支持。