ethercat-linux/docs/d2000-dev-plan.md
Tony Cao 3c4b6e6d54 D2000 (aarch64) migration: cross-build works with zero code changes
- .cargo/config.toml: rust-lld linker pinned for x86_64 + aarch64 musl
  targets (RUSTFLAGS no longer needed)
- scripts/d2000-deploy.ps1: build -> AArch64 ELF check -> scp deploy
- docs/d2000-dev-plan.md: M2 done; rustup mirror gotcha documented
  (cached channel manifest pins absolute mirror URLs; patch it to
  static.rust-lang.org when a component 404s)
- verified: target/aarch64-unknown-linux-musl/release/el6695-rt is a
  static AArch64 ELF (e_machine=0xB7), ~1MB
2026-08-06 02:05:05 +08:00

130 lines
6.5 KiB
Markdown
Raw Permalink 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.

# 飞腾 D2000 ↔ EL6695 ↔ TwinCAT 通讯链路 — 开发计划
> **版本**: 1.0
> **日期**: 2026-07-28
> **状态**: 待启动
> **前置成果**: J1900 链路全部方法论(8B/800B 设计、验证体系、脚本集、Rust 代码库)
---
## 1. 目标与拓扑
在现有 J1900 链路之外,新增一条**并列**通讯链路:飞腾 D2000(ARM64)经 EL6695#2 与 TwinCAT PC 实时数据交换,复用已验证的配置方法与验证体系。
```
TwinCAT PC (169.254.176.217)
├─ [现有链路] EK1100 → ... → EL6695#1 → J1900 (x86_64, Debian13+RT) ✅ 已验收
└─ [新增链路] E-bus 扩展或独立网口 → EL6695#2 → 飞腾 D2000 (aarch64) 🆕
跳板机#2 网口 (SSH 管理通道)
```
### 待确认事项(启动前)
| # | 问题 | 影响 |
|---|---|---|
| Q1 | EL6695#2 挂在哪里?(现有 E-bus 末端 EL9011 前扩展,还是 TwinCAT 第二网口独立段?) | TwinCAT 工程拓扑/网卡规划 |
| Q2 | D2000 的 OS 与内核(麒麟 V10? UOS? Ubuntu? 内核版本? 是否有 PREEMPT_RT?) | RT 性能预期、移植工作量 |
| Q3 | D2000 管理通道:跳板机#2 的地址、SSH 凭据、能否免密 | 自动化部署方式 |
| Q4 | D2000 接 EL6695 的网口(板载 GbE? 独立网卡? 驱动?) | ethercrab 裸 socket 可用性 |
---
## 2. 阶段计划
### 阶段 1:环境与可达性(0.5 天)
| # | 任务 | 产出 |
|---|---|---|
| 1.1 | 经跳板机#2 SSH 到 D2000,采集:`uname -a`、`/etc/os-release`、`/proc/version`、CPU/核数、网口列表(`ip link`)、中断分布(`/proc/interrupts`) | 环境档案 |
| 1.2 | 确认 PREEMPT_RT(`uname -v` 含 rt?)、`chrt`/`mlockall` 可用性 | RT 基线判定 |
| 1.3 | 网络打通:D2000 → EL6695#2 网线;D2000 → 跳板机 管理网 | 拓扑照片/记录 |
| 1.4 | 空口探测:tcpdump/裸 socket 读 ethX,确认能收发二层帧 | 网卡可用性 |
### 阶段 2:Rust 交叉编译 aarch64(0.5 天)
| # | 任务 | 备注 |
|---|---|---|
| 2.1 | `rustup target add aarch64-unknown-linux-musl`;`cargo build --target aarch64-unknown-linux-musl --release` | ethercrab 为纯 Rust,理论上零改动;libc 裸 socket(AF_PACKET)在 aarch64 内核同样支持 |
| 2.2 | 链接器:沿用 `RUSTFLAGS="-C linker=rust-lld"`(musl 静态,免去 D2000 上 glibc 版本问题) | musl 静态二进制通吃 Kylin/UOS/Debian |
| 2.3 | 部署 scp → D2000,跑 `--mode probe`(只读扫描) | 首次上机验证 |
| 2.4 | 若 AF_PACKET 在目标内核异常,备选 `aarch64-unknown-linux-gnu` + 检查目标 glibc | 风险预案 |
### 阶段 3:EL6695 链路开通(0.51 天,方法全部现成)
| # | 任务 | 复用资产 |
|---|---|---|
| 3.1 | TwinCAT 侧:复制 8B 工程为 `TwinCAT_EL6695_Primary_D2000`(或在 EL6695#2 所在段新建拓扑),激活确认 SM2/SM3 | `tc-deploy-retry.ps1` 模式 |
| 3.2 | D2000 侧:`el6695_rt ethX --mode verify` CoE 审计 → ConfigOwner 到 OP | 与 J1900 完全相同的流程 |
| 3.3 | **严格遵守顺序:TwinCAT 激活时 D2000 侧空闲;先激活,后启 ticker**(800B 踩坑 F1) | 教训文档化 |
| 3.4 | ticker 8B XOR 模式联通,PLC bSync=True | `GVL_Sync` 验证体系 |
### 阶段 4:数据验证与实时性测量(0.5 天)
| # | 任务 | 判据 |
|---|---|---|
| 4.1 | 8B 逐字节验证(图案+XOR+历史环) | bSync=True,lag 稳定 |
| 4.2 | 10 分钟稳定性 | 60 万周期零错误,nMismatch 零增长 |
| 4.3 | D2000 实时性基线:周期抖动/exec/FPRD/FPWR 统计 | 与 J1900 对照(7µs 抖动基准) |
| 4.4 | 如需 800B:换 `el6695_rt_800b` 对应构建(同源码,常量切换) | 800B 工程现成 |
### 阶段 5:D2000 RT 调优(按需,0.51 天)
| # | 措施 | 场景 |
|---|---|---|
| 5.1 | IRQ 亲和:管理网口 IRQ 钉到非 RT 核 | 必做 |
| 5.2 | 核隔离 `isolcpus` + ticker 绑核(程序已支持 `--core`) | 推荐 |
| 5.3 | 若无 RT 补丁且抖动不可接受:评估编译 aarch64 PREEMPT_RT 内核(源码 kernel.org + rt patch,交叉编译) | 兜底 |
| 5.4 | 抖动向因分析:hwlatdetect/cyclictest 对照 | 诊断工具 |
### 阶段 6:文档与归档(0.5 天)
- 新增 `docs/d2000-bringup.md`(环境档案、移植记录、与 J1900 的性能对照)
- 更新三份主文档的适用范围章节;git 提交
---
## 3. 复用率评估
| 资产 | 复用程度 |
|---|---|
| el6695_rt 源码(main.rs/bridge.rs) | ~100%(唯一改动:默认网口名/可能的字节序检查——ARM 与 x86 同小端,无影响) |
| TwinCAT 工程与 PLC 验证程序 | 100%(复制副本改拓扑) |
| 部署/诊断/监视脚本(20+ 个) | ~90%(J1900 地址替换为 D2000 地址) |
| 配置方法论(SM/PDO/blob/链接/激活顺序) | 100% |
## 4. 风险登记
| # | 风险 | 概率 | 缓解 |
|---|---|---|---|
| R1 | D2000 OS 无 PREEMPT_RT,抖动大(几十~几百 µs) | 高 | 阶段 5.3 自编译 RT 内核;或先测后判,1kHz 场景通常可接受 |
| R2 | 麒麟/UOS 老内核(4.19)与 ethercrab 兼容性 | 低 | musl 静态;AF_PACKET 自 2.2 内核即有 |
| R3 | D2000 网口驱动不支持混杂/裸包或性能差 | 低 | 阶段 1.4 提前探测;备 USB 网卡 |
| R4 | 跳板机#2 到 D2000 的 SSH 不稳定 | 中 | 串口兜底;长会话用 nohup+日志(既有模式) |
| R5 | 双链路并存时 TwinCAT 两张网卡/两段总线资源冲突 | 低 | Q1 拓扑确认后评审 |
## 5. 里程碑
| 里程碑 | 判据 | 状态 |
|---|---|---|
| M1 | D2000 SSH 通,环境档案完成(Q1Q4 全部答案) | ⬜ 待硬件接入 |
| M2 | aarch64 二进制构建成功 | ✅ 2026-08-06(见下) |
| M3 | 链路 OP,8B bSync=True | ⬜ |
| M4 | 10 分钟零错误 + 抖动基线报告 | ⬜ |
| M5 | 文档归档 + git 提交 | ⬜ |
### M2 完成记录(2026-08-06)
- `rustup target add aarch64-unknown-linux-musl` 曾因清华镜像缺该日期组件 404 且 `RUSTUP_DIST_SERVER` 环境变量被缓存清单吞掉;**根因:`~/.rustup/toolchains/<tc>/lib/rustlib/multirust-channel-manifest.toml` 缓存清单内含 tuna 绝对 URL**,替换为 `https://static.rust-lang.org/dist/` 后安装成功。
- `cargo build --release --target aarch64-unknown-linux-musl` **零代码改动通过**(el6695-rt + xfc_probe),产物 ELF `e_machine=0xB7 (AArch64)`,musl 静态,约 1MB。
- 构建配置固化:`.cargo/config.toml` 已为两个 musl target 指定 `rust-lld`,不再需要 `RUSTFLAGS` 环境变量。
- 部署脚本:`scripts/d2000-deploy.ps1`(构建→架构校验→scp→chmod),JumpHost/TargetHost 待 D2000 接入后填实际值。
## 6. 修订历史
| 日期 | 内容 |
|---|---|
| 2026-07-28 | 初版计划 |