文档维护:§4 表格清理(A1/C2/C4 同步定案)+ version=2 成文 + 帧头/max_stack 细则

- M1~M3:A1(U12)、C2(U7)、C4(U14)行标记已定案
- §2.5 头布局:version=2(V2 格式,V1=1)单列
- §2.2 栈设计补全:帧头 {fn_id:u32, ret_pc:u32, ret_fn_id:u32} 12B;
  max_stack = MAIN + DAG 最坏路径 Σ(12+nregs×8),写入 @116
This commit is contained in:
2026-08-24 16:09:09 +08:00
parent 2cc09903c9
commit 7769b515b0
+11 -6
View File
@@ -63,9 +63,10 @@
#### 调用栈(方案 C:预分配栈区,U10 定案)
- **无递归**:链接层检测调用图环(FUNCTION 自调用/循环调用)→ **编译期报错**`link error: recursive call`);无环 → 最坏调用路径编译期可算
- **max_stack 编译期计算**:最坏调用路径 Σ(帧头 12B + nregs×8),写入映像头(@116
- **帧结构(每帧 12B 帧头 + nregs×8B 寄存器区)**:帧头 = { fn_id:u32, ret_pc:u32, ret_fn_id:u32 };寄存器区 = 本函数 nregs 个 int64
- **max_stack 编译期计算(写入映像头 @116**`max_stack = MAIN 帧需求 + 最坏 FUNCTION 调用路径 Σ(帧需求)`,帧需求 = 12 + nregs×8;调用图为 DAG(无递归),最坏路径 = 按字节权重的最长路径;MAIN 帧计入(常驻栈底)
- **预分配栈区**:Machine 构造时一次性分配 max_stack 字节连续内存,运行期零分配
- **压帧**:从栈顶取 nregs×8 + 帧头(12B)sp += 帧需求;**弹帧**sp -= 帧需求
- **压帧**:从栈顶取 帧需求(12 + nregs×8sp += 帧需求;**弹帧**sp -= 帧需求
- **溢出检查双口径**:剩余栈 < 帧需求 → `StackOverflow`(字节主检查)+ 深度 ≤64(双保险)
- **MAIN 帧常驻栈底**(跨周期保留),周期结束回退 sp 到 MAIN 帧顶
@@ -117,7 +118,9 @@
### 2.5 映像格式(头 128 字节,16 对齐)——U7 已定案
```text
0..71 原 17 字段(72 字节:magic/版本/cycle_limit/dt_ms/project_hash/entry_fn_id/
0..3 magicSTSC,不变)
4..7 version = 2V2 格式;V1 = 1
8..71 原 15 字段(cycle_limit/dt_ms/project_hash/entry_fn_id/
n_globals/n_i/n_q/n_m/n_consts/n_funcs + offset_const/funcs/code/fb/data
64 offset_slots ← 槽表段(原 offset_fb 改义,FB 并入值区)
68 offset_values ← 值段(原 offset_data 改义,起点 16 对齐)
@@ -187,7 +190,7 @@
| # | 项 | 状态 |
|---|---|---|
| A1 | 元数据段格式 | 结构体/字符串的表 schema——v1 预留但格式未定(待定) |
| ~~A1~~ | ~~元数据段格式~~ | **已定案(U12**v1 0 长度占位(offset_meta=0),schema 延后 |
| ~~A2~~ | ~~常量内嵌 vs 常量表~~ | **已定案**:常量表(8B LOADK 查表);LOADK 用 type 位段解释;条目 8B 无 tagIMM64 预留不发射 |
| A3 | 内建 FB 字段类型化 | **已定案**:字段类型化(TON: in/pt/q/et = BOOL/TIME/BOOL/TIMER_TRIG: clk/q = BOOL/BOOL);计数器单/双字(INT/DINT**编码形式 = fb 表拆条**CTU/DCTU/CTD/DCTD/CTUD/DCTUD 6 条,名字即宽度)——U5 已定案 |
| A4 | DATE/TOD/DT 字面量 | **已定案**v1 **不支持**(类型存在,仅声明/存取/比较,无 `D#/TOD#/DT#` 字面量语法) |
@@ -205,9 +208,9 @@
| # | 项 | 说明 |
|---|---|---|
| C1 | 元数据段格式(原 A1) | 结构体/字符串表 schema——v1 预留但格式未定;建议 v1 定「0 长度占位段,schema 延后」 |
| C2 | 头 128B 布局终稿 | §2.5 字段表(64/68 改义、n_slots/n_values)需与 A8 schema 最终核对 |
| ~~C2~~ | ~~头 128B 布局终稿~~ | **已定案(U7 修正版)**:见 §2.5offset_meta/max_stack/values_size 等) |
| C3 | machine.toml `[[fb]]` 表 schema | fb_id/name/字段类型(含单/双字计数 width 列)细则——随 B3 定 |
| C4 | CALL/CAL 的 rd 字段约定成文 | 已定「恒 0」,待写入规范文档 |
| ~~C4~~ | ~~CALL/CAL 的 rd 恒 0 成文~~ | **已定案(U14**:已写入指令编码.md §5 |
| C5 | line1 推演重算 | 实施阶段(阶段 5)才需要 |
| C6 | CTU/CTD/CTUD 字段表终稿 | pv/cv 定 INT/DINT 后,字段宽度/对齐/偏移终稿(随 B3 定) |
@@ -280,6 +283,8 @@ V2 的 op 位段仅 6 位(64 个),FB 占 8 个不划算,且 machine.toml
- U12 定案:元数据段 v1 0 长度占位(offset_meta=0),schema 延后
- U13 定案:DATE/TOD/DT 表示(DT={date:32|tod:32} 拼接,转换取高/低 32 位)
- U14 定案:CALL/CAL rd 字段恒 0(按指令编码/指令集清单文档)——**全部 U 项闭合,V2 规格冻结**
- 版本线确认:当前设计 = **V2**(V1 为已实现简化版);头 version = 2,型号 STATOR2
- 帧头 12B 成文(fn_id/ret_pc/ret_fn_id+ max_stack 计算细则(MAIN 计入、DAG 最长路径)
- A10 定案(B1/B2):1 CAL + fb_id 16 位(查 [[fb]] 表);V1 的 8 个 CAL_* opcode 作废
- B4 定案:领域指令(运动控制/通信)不进指令集,一律 FB 库;无 EXT 服务指令
- B3/B5 说明中待确认:单/双字计数编码(CAL type 位段)、op 位段预算