linux_learn/docs/03-AMP_SMP_多核异构开发.md

159 lines
9.0 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.

# 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跑LinuxCore2跑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 | 先理解 SMPLinux `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 协议栈开发。