Files
stgsharp/future/nc_il.md
T
2026-01-26 09:36:22 +08:00

369 lines
11 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.
# 时序控制专用 IL 规范(草案 v0.1)
## 1. 概述
本 IL(Intermediate Language)设计用于 i 线曝光机的实时运动控制与时序协调系统。它是一个**无分支、无跳转、无堆内存**的直线执行字节码,适用于确定性实时控制场景。
### 1.1 设计原则
- **极简性**:无分支/跳转/循环,所有指令直线执行
- **确定性**:固定长度指令(32-bit),WCET 可精确计算
- **时间驱动**:所有动作通过时间戳对齐,而非依赖/分支控制
- **安全性**:静态验证,无动态内存分配
### 1.2 适用场景
- 多坐标系时序协调
- 运动控制序列生成
- IO 触发与数据采集
- 轻量级数学运算(定点/简单序列生成)
---
## 2. Bundle 结构
一个完整的传输单元称为 **Bundle**,包含三部分:
```
+----------------+
| Header | 固定大小(建议 32 字节)
+----------------+
| .data 段 | 可变长度,4B 对齐
+----------------+
| .instruction 段| 可变长度,每条指令 4B
+----------------+
```
### 2.1 Header(32 字节)
| 偏移 | 大小 | 字段名 | 说明 |
|------|------|---------------------|-------------------------------------------|
| 0 | 4 | `magic` | 魔数,建议 `0x58494C31` ("XIL1") |
| 4 | 2 | `proto_ver` | 协议版本,例如 `0x0001` |
| 6 | 2 | `bundle_type` | 包类型(运动/IO/通用) |
| 8 | 8 | `execute_at_tick` | 绝对执行时刻(64-bit tick) |
| 16 | 2 | `data_slot_count` | `.data` 段 slot 数量 |
| 18 | 2 | `instruction_count` | `.instruction` 段指令条数 |
| 20 | 4 | `flags` | 预留标志位 |
| 24 | 4 | `data_crc` | `.data` 段 CRC32 |
| 28 | 4 | `bundle_crc` | 整个 bundle CRC32(不含此字段本身) |
---
## 3. .data 段
### 3.1 Slot 模型
- **最小粒度**:4 字节(32-bit slot)
- **寻址方式**:所有指令通过 `slotIndex`(u8 或 u16)引用
- **对齐规则**:
- 所有对象起始地址必须是 4B 的倍数(slot 对齐)
- 大对象可跨越多个 slot
- 如需更高对齐(8/16B),由 assembler 插入 padding slot
### 3.2 支持的类型
| 类型名 | 大小(slot) | 对齐(slot) | 说明 |
|------------------|--------------|--------------|-----------------------------------|
| `INT32` / `U32` | 1 | 1 | 有符号/无符号 32 位整数 |
| `INT64` / `U64` | 2 | 2 | 64 位整数(占 2 个 slot) |
| `FLOAT32` | 1 | 1 | IEEE 754 单精度浮点(可选支持) |
| `MOTION_PROFILE` | N | 1 | 运动参数结构体(可扩展) |
| `VEC2` | 2 | 1 | 二维向量(2×i32 或 2×f32) |
| `ARRAY[N]` | N | 1 | 定长数组(每个元素 1 slot) |
### 3.3 示例
```asm
.data
MOTION_PROFILE profile {
steps = 10,
direction = 0,
mode = 0
} ; slot 0 ~ slot N-1
INT32 tick 100 ; slot N
INT32 end 0 ; slot N+1
```
---
## 4. Instruction 段
### 4.1 指令格式(固定 32-bit)
```
+-------+-------+-------+-------+
| set | op | a | b |
| byte0 | byte1 | byte2 | byte3 |
+-------+-------+-------+-------+
```
#### 字段说明
- `set`(byte0):指令集/域(Instruction Set)
- `op`(byte1):域内操作码(Operation)
- `a`(byte2):参数 A(8-bit)
- `b`(byte3):参数 B(8-bit)
#### 参数解释规则
每条指令的 `(a, b)` 解释方式由 `(set, op)` 唯一确定:
- **双参数模式**:`a` 和 `b` 分别作为两个 u8 参数
- **单参数模式**:`imm16 = a | (b << 8)`(小端序)
**禁止同一 opcode 混用两种解释方式。**
---
### 4.2 指令集分类(set 域)
| set 值 | 域名 | 说明 |
|--------|--------|------------------------|
| `0x00` | TIME | 时间控制与同步 |
| `0x10` | MOTION | 运动控制 |
| `0x20` | SYS | 系统参数读写 |
| `0x30` | IO | IO 控制与数据上报 |
| `0xF0` | META | 元指令(END/NOP/FAULT)|
---
### 4.3 指令表(最小集合示例)
#### TIME 域(0x00)
| op | 助记符 | 参数 | 说明 |
|------|--------------|--------------|---------------------------------------|
| 0x00 | `AT_TICK` | `imm16` | 等待直到绝对 tick,`imm16=slotIndex` |
| 0x01 | `WAIT_DT` | `imm16` | 相对等待 dt tick |
**编码示例**:
```asm
AT_TICK tick ; 编码:0x00 0x00 [tick_slot_lo] [tick_slot_hi]
```
---
#### MOTION 域(0x10)
| op | 助记符 | 参数 | 说明 |
|------|----------------|-----------|----------------------------------------|
| 0x00 | `AXIS_MOVE` | `a` | 执行运动,参数 `a=profile_slotIndex` |
| 0x01 | `AXIS_STOP` | `a` | 停止轴,参数 `a=axis_id` |
| 0x02 | `AXIS_START` | `a` | 启动轴队列 |
**编码示例**:
```asm
AXIS_MOVE profile ; 编码:0x10 0x00 [profile_slot] 0x00
```
---
#### SYS 域(0x20)
| op | 助记符 | 参数 | 说明 |
|------|--------------|-----------|----------------------------------------------|
| 0x00 | `READ_SYS` | `a, b` | 读取系统参数,`a=dst_slot`, `b=sys_id` |
| 0x01 | `WRITE_SYS` | `a, b` | 写入系统参数 |
**系统参数 ID(b)**:
- `0x00`:`SYS_TICK`(当前 tick)
- `0x01`:`SYS_STATUS`(设备状态)
- ...(可扩展)
**编码示例**:
```asm
READ_SYS end SYS_TICK ; 编码:0x20 0x00 [end_slot] 0x00
```
---
#### IO 域(0x30)
| op | 助记符 | 参数 | 说明 |
|------|--------------|-----------|-------------------------------------------|
| 0x00 | `IO_SET` | `a, b` | 设置 IO,`a=pin`, `b=value` |
| 0x01 | `REPORT` | `a` | 上报数据,`a=src_slot` |
| 0x02 | `SAMPLE` | `a, b` | 采样,`a=chan`, `b=dst_slot` |
**编码示例**:
```asm
REPORT end ; 编码:0x30 0x01 [end_slot] 0x00
```
---
#### META 域(0xF0)
| op | 助记符 | 参数 | 说明 |
|------|----------|------|------------------|
| 0x00 | `END` | 无 | 指令流结束 |
| 0x01 | `NOP` | 无 | 空操作 |
**编码示例**:
```asm
END ; 编码:0xF0 0x00 0x00 0x00
```
---
## 5. 完整示例
### 5.1 汇编源码
```asm
; 等待到指定 tick,执行一次运动,记录结束时刻并上报
.bundle t=123456 type=MOTION
.data
MOTION_PROFILE profile {
steps = 10,
direction = 0,
mode = OPEN_LOOP
} ; slot 0
INT32 tick 100 ; slot 1
INT32 end 0 ; slot 2
.instruction
AT_TICK tick ; 等待到 tick=100
AXIS_MOVE profile ; 执行运动
READ_SYS end SYS_TICK ; 读取当前 tick 到 end
REPORT end ; 上报 end
END ; 结束
```
---
### 5.2 二进制布局(示意)
#### Header(32 字节)
```
58 49 4C 31 00 01 00 01 00 01 E2 40 00 00 00 00
03 00 05 00 00 00 00 00 XX XX XX XX YY YY YY YY
```
- magic: `XIL1`
- proto_ver: `0x0001`
- bundle_type: `0x0001`(MOTION)
- execute_at_tick: `123456`
- data_slot_count: `3`
- instruction_count: `5`
- CRC 略
#### .data 段(3 slots × 4 bytes = 12 bytes)
```
; slot 0: MOTION_PROFILE(示意,实际结构依实现)
0A 00 00 00 ; steps=10
00 00 00 00 ; direction=0, mode=0
; slot 1: tick=100
64 00 00 00
; slot 2: end=0
00 00 00 00
```
#### .instruction 段(5 条 × 4 bytes = 20 bytes)
```
00 00 01 00 ; AT_TICK slot[1]
10 00 00 00 ; AXIS_MOVE slot[0]
20 00 02 00 ; READ_SYS slot[2], SYS_TICK
30 01 02 00 ; REPORT slot[2]
F0 00 00 00 ; END
```
---
## 6. 校验与安全
### 6.1 静态验证(加载阶段)
- Header CRC 校验
- `data_slot_count` 与实际长度一致性
- `instruction_count` 与实际条数一致性
- 所有 slotIndex 不越界(`< data_slot_count`)
- 所有 `(set, op)` 在白名单内
### 6.2 运行时保护
- 执行时间上限(timeout)
- 状态机约束(例如未 Homed 禁止 MOTION)
- 参数范围校验(速度/加速度/行程边界)
- 看门狗与硬件急停链路
### 6.3 错误处理
- 验证失败:拒绝加载,返回错误码
- 执行超时:触发 FAULT,进入安全态
- 非法 opcode:触发 FAULT
---
## 7. 工具链
### 7.1 Assembler(文本 → 二进制)
- 输入:`.asm` 汇编文本
- 输出:`.bin` bundle 二进制
- 功能:
- 符号表管理(slotIndex 分配)
- CRC 自动计算
- 对齐与 padding 插入
### 7.2 Disassembler(二进制 → 文本)
- 输入:`.bin` bundle 或抓包数据
- 输出:可读汇编文本
- 功能:
- 指令解码
- slotIndex 显示(可选符号名)
- CRC 验证
### 7.3 Debugger / Simulator(可选)
- 离线模拟执行
- 单步调试
- 时间轴可视化
---
## 8. 扩展与版本化
### 8.1 版本控制
- 每个 bundle 携带 `proto_ver`
- 节点启动时上报支持的版本列表
- 主控拒绝不兼容版本的 bundle
### 8.2 向后兼容策略
- 新增 opcode 分配到未使用的 `(set, op)`
- 已有 opcode 语义不变
- 大版本变更时允许不兼容
### 8.3 未来扩展点
- 子过程/宏指令(`CALL_MACRO`)
- 条件执行(predication,非跳转)
- 多轴并行编排(multi-axis bundle)
---
## 9. 附录
### 9.1 字节序
- 所有多字节字段使用**小端序(Little-Endian)**
### 9.2 Tick 分辨率
- 建议:1 tick = 1 µs 或 10 µs
- 由系统配置决定,在文档中明确
### 9.3 MOTION_PROFILE 结构(示例)
```c
struct MotionProfile {
int32_t steps; // 步数
uint8_t direction; // 方向:0=负,1=正
uint8_t mode; // 模式:0=开环,1=闭环
uint16_t reserved; // 预留
int32_t velocity; // 速度(可选)
int32_t acceleration; // 加速度(可选)
};
```
---
## 10. 参考文献与致谢
- VLIW 架构设计原则
- PLC 微编程语言
- 实时系统可验证字节码设计
---
**文档版本**:v0.1
**最后更新**:2026-01-25
**维护者**:[你的团队名称]