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

9.0 KiB
Raw Blame History

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

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 入门文档,覆盖了:

  1. AMP 系统架构设计 — Core 分配策略、内存划分
  2. 裸核固件编译 — 用 ARM GCC 编译 RT-Thread / Baremetal 代码
  3. 固件加载方式 — Linux 启动后通过 remoteproc 框架加载裸核 ELF 到指定 Core
  4. 核间通信 API — rpmsg endpoint 创建、数据收发
  5. 完整案例 — 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 先理解 SMPLinux 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 协议栈开发。