11 KiB
11 KiB
时序控制专用 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 示例
.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 |
编码示例:
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 |
启动轴队列 |
编码示例:
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(设备状态)- ...(可扩展)
编码示例:
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 |
编码示例:
REPORT end ; 编码:0x30 0x01 [end_slot] 0x00
META 域(0xF0)
| op | 助记符 | 参数 | 说明 |
|---|---|---|---|
| 0x00 | END |
无 | 指令流结束 |
| 0x01 | NOP |
无 | 空操作 |
编码示例:
END ; 编码:0xF0 0x00 0x00 0x00
5. 完整示例
5.1 汇编源码
; 等待到指定 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汇编文本 - 输出:
.binbundle 二进制 - 功能:
- 符号表管理(slotIndex 分配)
- CRC 自动计算
- 对齐与 padding 插入
7.2 Disassembler(二进制 → 文本)
- 输入:
.binbundle 或抓包数据 - 输出:可读汇编文本
- 功能:
- 指令解码
- 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 结构(示例)
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
维护者:[你的团队名称]