159 lines
9.0 KiB
Markdown
159 lines
9.0 KiB
Markdown
# 03-AMP/SMP 多核异构开发
|
||
|
||
> 资料源: `TL3568-EVM\6-开发参考资料\Rockchip官方SDK\` + `TL3568-EVM\4-软件资料\Demo\amp-demos\`
|
||
|
||
---
|
||
|
||
## 一、什么是 AMP?为什么你的板子需要它?
|
||
|
||
RK3568 有 **4 个 Cortex-A55 核**,通常都跑 Linux (SMP)。但你可以:
|
||
|
||
```
|
||
┌─────────────────────────────────────────┐
|
||
│ Core 0: Linux (AP核) │
|
||
│ - 网络、文件系统、CAN上层协议、MQTT │
|
||
│ - 跑你的 CAN 协议栈 │
|
||
├─────────────────────────────────────────┤
|
||
│ Core 1: Linux (SMP,与Core0共享) │
|
||
├─────────────────────────────────────────┤
|
||
│ Core 2: RT-Thread / Baremetal (裸核) │
|
||
│ - 实时 CAN 收发、电机控制 │
|
||
│ - 微妙级中断响应 │
|
||
├─────────────────────────────────────────┤
|
||
│ Core 3: RT-Thread / Baremetal (裸核) │
|
||
│ - 或关闭省电 │
|
||
└─────────────────────────────────────────┘
|
||
```
|
||
|
||
- **SMP** (Symmetric Multi-Processing):4个核跑同一个 Linux 内核,你的程序自动调度
|
||
- **AMP** (Asymmetric Multi-Processing):Core0/1跑Linux,Core2跑RT-Thread裸核 ← 这才是"异构"
|
||
- 两个世界通过 **rpmsg** (Remote Processor Messaging) 通信——共享内存 + 中断
|
||
|
||
**你的 CAN 场景为什么适合 AMP?**
|
||
- Linux 侧处理 CANopen/J1939 协议栈(应用层逻辑复杂、需要文件系统/网络)
|
||
- 裸核侧做高速 CAN FD 收发(64字节一帧,微秒级周期)
|
||
|
||
---
|
||
|
||
## 二、资料位置
|
||
|
||
> 基础路径(可点击打开): [TL3568-EVM(Buildroot-2018.02)_V1.8](../TL3568-EVM(Buildroot-2018.02)_V1.8/)
|
||
|
||
### 2.1 SDK
|
||
|
||
| 内容 | 路径 |
|
||
|------|------|
|
||
| **AMP SDK v1.2.3** | [6-开发参考资料\Rockchip官方SDK\rk356x_amp_sdk_release_v1.2.3_20230515\](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9SDK/rk356x_amp_sdk_release_v1.2.3_20230515/) (3 个文件) |
|
||
| **Linux SDK v1.3.1** | [6-开发参考资料\Rockchip官方SDK\rk356x_linux_release_v1.3.1_20221120\](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9SDK/rk356x_linux_release_v1.3.1_20221120/) (4 个文件) |
|
||
|
||
### 2.2 官方文档
|
||
|
||
> 打开文档目录: [6-开发参考资料\Rockchip官方参考文档\Rockchip官方AMP SDK参考文档\](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Rockchip%E5%AE%98%E6%96%B9AMP%20SDK%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/)
|
||
|
||
```
|
||
6-开发参考资料\Rockchip官方参考文档\Rockchip官方AMP SDK参考文档\
|
||
|
||
├── amp/
|
||
│ ├── AMP 架构设计文档
|
||
│ ├── AMP rpmsg 通信协议详解
|
||
│ └── AMP 裸核程序加载流程
|
||
└── common/
|
||
├── AMP 编译环境搭建
|
||
└── AMP 调试方法 (JTAG双核调试)
|
||
```
|
||
|
||
### 2.3 用户手册
|
||
|
||
| 文件名 | 路径 |
|
||
|--------|------|
|
||
| [2-9-1-基于Linux + RT-Thread、Baremetal的AMP开发案例.pdf](../TL3568-EVM(Buildroot-2018.02)_V1.8/3-%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/2-9-1-%E5%9F%BA%E4%BA%8ELinux%20+%20RT-Thread%E3%80%81Baremetal%E7%9A%84AMP%E5%BC%80%E5%8F%91%E6%A1%88%E4%BE%8B.pdf) | `3-用户手册\` |
|
||
| [2-9-2-基于AMP的多通道AD采集开发案例.pdf](../TL3568-EVM(Buildroot-2018.02)_V1.8/3-%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/2-9-2-%E5%9F%BA%E4%BA%8EAMP%E7%9A%84%E5%A4%9A%E9%80%9A%E9%81%93AD%E9%87%87%E9%9B%86%E5%BC%80%E5%8F%91%E6%A1%88%E4%BE%8B.pdf) | `3-用户手册\` |
|
||
|
||
### 2.4 Demo 代码
|
||
|
||
> 打开 Demo 根目录: [4-软件资料\Demo\amp-demos\](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/)
|
||
|
||
```
|
||
4-软件资料\Demo\amp-demos\
|
||
```
|
||
|
||
| Demo 路径 | 说明 |
|
||
|-----------|------|
|
||
| [AMP-SDK/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/AMP-SDK/) | AMP SDK 完整源码包 |
|
||
| [rpmsg_echo/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/rpmsg_echo/) | 核间通信回环 (Linux ↔ RT-Thread) |
|
||
| [led_flash/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/led_flash/) | Linux 控制裸核 LED |
|
||
| [uart_echo/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/uart_echo/) | 裸核 UART 收发 |
|
||
| [can_echo/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/can_echo/) | AMP CAN 收发 ← 你的直接参考! |
|
||
| [ad7606_capture/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/ad7606_capture/) | 裸核 AD7606 多通道采集 |
|
||
| [ad7616_capture/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/ad7616_capture/) | 裸核 AD7616 多通道采集 |
|
||
| [fspi_rw/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/fspi_rw/) | 裸核 FSPI Flash 读写 |
|
||
| [jtag_debug/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/jtag_debug/) | JTAG 双核调试 |
|
||
| [pcie_dma_memcpy/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/pcie_dma_memcpy/) | 裸核 PCIe DMA 传输 |
|
||
| [pcie_dma_memcpy_io_irq/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/pcie_dma_memcpy_io_irq/) | PCIe DMA + 中断 |
|
||
|
||
---
|
||
|
||
## 三、AMP 通信原理(rpmsg)
|
||
|
||
```
|
||
┌───────────────┐ 共享内存 ┌──────────────────┐
|
||
│ Linux (CA55) │ ◄══════════════► │ RT-Thread (CA55) │
|
||
│ /dev/rpmsg0 │ +中断 │ rpmsg 驱动 │
|
||
├───────────────┤ ├──────────────────┤
|
||
│ 用户程序 │ │ 裸核应用程序 │
|
||
│ open/write/ │ │ rpmsg_send/recv │
|
||
│ read/ioctl │ │ │
|
||
└───────────────┘ └──────────────────┘
|
||
```
|
||
|
||
**通信流程**:
|
||
```
|
||
1. Linux侧: 加载 rpmsg 驱动 → /dev/rpmsg0 出现
|
||
2. 裸核侧: RT-Thread 初始化 rpmsg → 注册 endpoint
|
||
3. 双方: 通过名称匹配建立连接 (如 "echo")
|
||
4. 数据流:
|
||
写 /dev/rpmsg0 → 共享内存 → 中断通知裸核 → rpmsg callback → 裸核处理
|
||
裸核 rpmsg_send → 共享内存 → 中断通知 Linux → read /dev/rpmsg0
|
||
```
|
||
|
||
**典型数据流(CAN 场景)**:
|
||
```
|
||
你写的CAN应用 → send CAN帧 → rpmsg → 裸核 → CAN控制器 → 总线
|
||
→ recv CAN帧 ← rpmsg ← 裸核 ← CAN控制器 ← 总线
|
||
```
|
||
|
||
---
|
||
|
||
## 四、用户手册 2-9-1 文档要点
|
||
|
||
这是最关键的 AMP 入门文档,覆盖了:
|
||
|
||
1. **AMP 系统架构设计** — Core 分配策略、内存划分
|
||
2. **裸核固件编译** — 用 ARM GCC 编译 RT-Thread / Baremetal 代码
|
||
3. **固件加载方式** — Linux 启动后通过 remoteproc 框架加载裸核 ELF 到指定 Core
|
||
4. **核间通信 API** — rpmsg endpoint 创建、数据收发
|
||
5. **完整案例** — LED 闪烁、UART 回环、CAN 回环
|
||
|
||
**AMP 启动流程**:
|
||
```bash
|
||
# Linux 启动后
|
||
echo amp_fw.elf > /sys/class/remoteproc/remoteproc0/firmware
|
||
echo start > /sys/class/remoteproc/remoteproc0/state
|
||
# 裸核开始运行
|
||
cat /sys/class/remoteproc/remoteproc0/state # running
|
||
```
|
||
|
||
---
|
||
|
||
## 五、学习建议
|
||
|
||
| 顺序 | 内容 | 预计时间 |
|
||
|:---:|------|:---:|
|
||
| 1 | 先理解 SMP(Linux `htop` 看 4 核)→ 跑 `taskset -c 3 ./myprog` 绑核 | 1天 |
|
||
| 2 | 读 [2-9-1 手册](../TL3568-EVM(Buildroot-2018.02)_V1.8/3-%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/2-9-1-%E5%9F%BA%E4%BA%8ELinux%20+%20RT-Thread%E3%80%81Baremetal%E7%9A%84AMP%E5%BC%80%E5%8F%91%E6%A1%88%E4%BE%8B.pdf),理解 AMP 架构图 | 2天 |
|
||
| 3 | 跑通 [rpmsg_echo](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/rpmsg_echo/) 示例(最简单的核间通信) | 3天 |
|
||
| 4 | 跑通 [can_echo](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/amp-demos/can_echo/) AMP 示例(CAN 帧跨核收发) | 2天 |
|
||
| 5 | 把 Linux 侧 CAN 应用改为通过 rpmsg 收发裸核 | 5天 |
|
||
|
||
> **注意**:AMP 开发需要两个编译链(Linux 侧 aarch64-linux-gnu-gcc + RT-Thread 侧 arm-none-eabi-gcc),调试时需要 JTAG。如果没有 JTAG 调试器,先专注于 Linux SMP 下的 CAN 协议栈开发。
|