Files
stgsharp/future/nc_il.md
T

11 KiB
Raw Blame History

时序控制专用 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 汇编文本
  • 输出:.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 结构(示例)

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
维护者:[你的团队名称]