9.0 KiB
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
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 | 3-用户手册\ |
| 2-9-2-基于AMP的多通道AD采集开发案例.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/ | AMP SDK 完整源码包 |
| rpmsg_echo/ | 核间通信回环 (Linux ↔ RT-Thread) |
| led_flash/ | Linux 控制裸核 LED |
| uart_echo/ | 裸核 UART 收发 |
| can_echo/ | AMP CAN 收发 ← 你的直接参考! |
| ad7606_capture/ | 裸核 AD7606 多通道采集 |
| ad7616_capture/ | 裸核 AD7616 多通道采集 |
| fspi_rw/ | 裸核 FSPI Flash 读写 |
| jtag_debug/ | JTAG 双核调试 |
| pcie_dma_memcpy/ | 裸核 PCIe DMA 传输 |
| 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 入门文档,覆盖了:
- AMP 系统架构设计 — Core 分配策略、内存划分
- 裸核固件编译 — 用 ARM GCC 编译 RT-Thread / Baremetal 代码
- 固件加载方式 — Linux 启动后通过 remoteproc 框架加载裸核 ELF 到指定 Core
- 核间通信 API — rpmsg endpoint 创建、数据收发
- 完整案例 — LED 闪烁、UART 回环、CAN 回环
AMP 启动流程:
# 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 手册,理解 AMP 架构图 | 2天 |
| 3 | 跑通 rpmsg_echo 示例(最简单的核间通信) | 3天 |
| 4 | 跑通 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 协议栈开发。