# 时序控制专用 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 **维护者**:[你的团队名称]