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

122 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 27-04 HAL Component Precompile Runtime Gate 实施记录
## 定位
本文件落实 `ACC-039/INT-026`,承接 `24` 的阶段 B-D 和 `26` 的 P1 源码同步结果,把 `and2``or2``not``mux2``scale` 从“源码已同步”推进到 LinuxCNC `halcompile` 派生、预编译 manifest、WASM 实例化、线程回调、net 传播和代表 Web 配置消费均有机器 gate 的状态。
严格边界:本轮只晋级 Web/WASM 虚拟 HAL 仿真运行时。`dynamicLoadrtSupported=false`,未知组件必须 blocked宿主 RTAPI 实时内核、共享内存、内核模块、硬件驱动和任意动态模块加载没有晋级。
## LinuxCNC 派生链
生成入口:
```text
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 组件:
```text
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。
## 专项证据
```bash
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
```
实际输出:
```text
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` 中:
```text
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_mux``rpm_rps`,验证 `J0_mux.out=37.25``rpm_rps.out=20`,同时阻断 `web-local-formula` 未知组件。Web 项目没有复制五个组件公式。
## 回归结果
以下既有 gate 全部通过:
- `verify_hal_component_source_sync.sh``verify_vendor_sync.sh`
- `verify_hal_runtime.sh``verify_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/emcc``wasm-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 evidence`25` 的 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 条件通过;动态模块加载仍不支持。