Zynqmp 裸机核间通信

关键字:Xilinx  FPGA  、Zynq UltraScale+ MPSoC、核间通讯、裸机、AMP、zcu106开发板

目录

1.APU和APU中断通信

2.APU和RPU中断通信

3.数据交换


1.APU和APU中断通信

        无所谓CPU0 是裸机还是uco还是Linux,核间通讯的本质是软中断。什么是软中断?由软件触发的中断就叫软中断。由于我在实际项目中使用的CPU0、CPU1都是裸机,因此就以裸机为例子来说明核间通讯测试。

        Xilinx vivado SDK的各种例子是我的第一手资料。手上有FPGA工程师提供的HDF(您应该知道我说的是哪个文件)文件的,用这个HDF建一个SDK;手上没有HDF文件的,也不是什么难事,打开vivado2018.3,这是我用的版本,其他版本类似,以106开发板为模板创建一个工程,怎么选?看图:

        以上步骤完成后,new一个block design,新加一个zynq的IP核。

Zynq UltraScale+ MPSoC(ZynqMP)平台上,运行 Linux 系统的同时运行 Cortex™-R5 裸机程序,主要依赖于 `remoteproc` 框架。该框架允许 Linux 内核加载并管理远程处理器(如 R5)上的裸机程序,并与之通信。 以下是实现该功能的主要步骤: ### 1. 配置 R5 裸机程序的内存地址 在开发 R5 裸机程序时,需要确保其使用的内存地址不与 Linux 系统的内存区域冲突。通常,Linux 内核会使用 DDR 的高端地址(例如 `0x820000000`),而 R5 裸机程序应使用较低的地址段,例如 `0x0` 或其他预留区域。修改链接脚本(`.ld` 文件)以指定 R5 程序的起始地址和大小,例如: ```ld MEMORY { DDR_0_MEM (rwx) : ORIGIN = 0x0, LENGTH = 0x800000 } ``` 这样可以确保 R5 程序加载到正确的内存区域,并避免与 Linux 内核及用户空程序的内存冲突[^3]。 ### 2. 构建裸机程序并生成可加载镜像 使用 Xilinx SDK 或 Vitis 工具链构建 R5 裸机程序,并生成 `.elf` 文件。随后,使用 SDK 的 `create boot image` 工具将 R5 程序打包进 `BOOT.bin` 文件中。打包顺序通常为: ``` fsbl -> pmu -> bitstream -> bl31 -> R5 elf -> u-boot ``` 生成的 `BOOT.bin` 和 `image.ub` 可以放入 SD 卡或 QSPI Flash 中用于启动[^4]。 ### 3. 配置设备树以启用 remoteproc 在 Linux 启动时,需要通过设备树配置 `remoteproc` 子系统。在设备树中添加如下节点以定义 R5 的内存区域和加载方式: ```dts reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges; rproc_0_dma: rproc@0x0 { reg = <0x0 0x800000>; no-map; }; }; rproc0: remoteproc@0 { compatible = "xlnx,zynqmp-r5-remoteproc"; memory-region = <&rproc_0_dma>; firmware-name = "test_r5.elf"; interrupt-parent = <&gic>; interrupts = <117 IRQ_TYPE_LEVEL_HIGH>; }; ``` 该配置告诉内核 R5 程序的内存位置和固件名称,并启用中断支持[^1]。 ### 4. 在 Linux 系统中加载并运行 R5 程序 启动 Linux 后,内核会自动加载 `remoteproc` 驱动并尝试加载 R5 固件。可以通过以下命令检查加载状态: ```bash cat /sys/class/remoteproc/remoteproc0/state ``` 如果状态为 `running`,则表示 R5 程序已成功加载并运行。若需手动加载或卸载,可使用以下命令: ```bash echo test_r5.elf > /sys/class/remoteproc/remoteproc0/firmware echo start > /sys/class/remoteproc/remoteproc0/state ``` ### 5. 调试与通信 R5 程序可以通过串口输出调试信息,也可以通过 `rpmsg`(Remote Processor Messaging)与 Linux 应用程序进行通信。确保串口资源在 Linux 和裸机程序之正确分配[^3]。 ### 示例代码:R5 裸机程序 以下是一个简单的 R5 裸机程序示例,仅点亮 LED 并通过串口输出信息: ```c #include "xil_printf.h" #include "sleep.h" int main() { xil_printf("R5 baremetal application is running!\r\n"); while (1) { // 模拟操作 usleep(1000000); xil_printf("R5 is alive!\r\n"); } return 0; } ``` 编译并生成 `.elf` 文件后,将其打包进 `BOOT.bin` 并加载到目标系统中。 ---
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值