跳转到主要内容

Xilinx ZYNQ双核ARM通信开发实例

本文转载自:<span id="profileBt"><a href="https://mp.weixin.qq.com/s/tFPu09i0uazf3H0_P91PbA"&gt; Tronlong创龙科技</a></span>

<strong>前 言</strong>
本文主要介绍基于OpenAMP框架的双核ARM通信案例的使用说明,CPU0(Master)运行Linux系统,CPU1(Remote)运行裸机或FreeRTOS程序。CPU0使用remoteproc加载CPU1程序,并对CPU1进行配置。
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232038-1.p…; alt=""></center>
<p align="center"><strong>图 1</strong></p>

OpenAMP详细开发说明可查阅官方文档:

https://china.xilinx.com/content/dam/xilinx/support/documentation/sw_ma…

本文基于Xilinx Zynq-7010/7020平台进行案例测试。
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232039-2.p…; alt=""></center>
<p align="center"><strong>图 2</strong></p>

<strong>1. echo_test案例</strong>

<strong>1.1 案例功能</strong>

案例功能:CPU0使用RPMsg向CPU1发送数据,CPU1接收到数据后再使用RPMsg向CPU0回传数据。CPU0对回传的数据进行验证,并输出验证结果。

<strong>1.2 操作说明</strong>

将CPU1裸机或FreeRTOS可执行文件复制到评估板文件系统“/lib/firmware/”目录下,并执行如下命令加载CPU1程序。

Target# echo echo_test.elf > /sys/class/remoteproc/remoteproc0/firmware

Target# echo start > /sys/class/remoteproc/remoteproc0/state
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232040-3.p…; alt=""></center>
<p align="center"><strong>图 3</strong></p>

执行如下命令加载RPMsg驱动,并在“/dev/”目录下生成RPMsg设备节点。

Target# modprobe rpmsg_user_dev_driver
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232041-4.p…; alt=""></center>
<p align="center"><strong>图 4</strong></p>

将CPU0应用程序可执行文件复制到评估板文件系统,并执行如下命令通过RPMsg与CPU1进行通信。

Target# ./echo_test
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232042-5.p…; alt=""></center>
<p align="center"><strong>图 5</strong></p>

输入1,并按回车键进行测试。
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232043-6.p…; alt=""></center>
<p align="center"><strong> 图 6</strong></p>
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232044-7.p…; alt=""></center>
<p align="center"><strong> 图 7</strong></p>

输入2,并按回车键退出测试。
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232045-8.p…; alt=""></center>
<p align="center"><strong>图 8</strong></p>

执行如下命令,停止CPU1程序。

Target# echo stop > /sys/class/remoteproc/remoteproc0/state
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232046-9.p…; alt=""></center>
<p align="center"><strong> 图 9</strong></p>

<strong>2. matrix_multiply案例</strong>

<strong>2.1 案例功能</strong>

案例功能:CPU0随机生成两个矩阵并使用RPMsg向CPU1发送数据,CPU1接收到数据后进行矩阵乘法运算,再使用RPMsg向CPU0回传运算结果,然后CPU0通过串口终端输出运算结果。

<strong>2.2 操作说明</strong>

将CPU1裸机或FreeRTOS可执行文件复制到评估板文件系统“/lib/firmware/”目录下,并执行如下命令加载CPU1程序。

Target# echo matrix_multiply.elf > /sys/class/remoteproc/remoteproc0/firmware

Target# echo start > /sys/class/remoteproc/remoteproc0/state
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232047-10…; alt=""></center>
<p align="center"><strong>图 10</strong></p>

执行如下命令加载RPMsg驱动,并在“/dev/”目录下生成RPMsg设备节点。

Target# modprobe rpmsg_user_dev_driver
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232048-11…; alt=""></center>
<p align="center"><strong>图 11</strong></p>

将CPU0应用程序可执行文件复制到评估板文件系统,并执行如下命令通过RPMsg与CPU1进行通信。

Target# ./mat_mul_demo

<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232049-12…; alt=""></center>
<p align="center"><strong>图 12</strong></p>

输入1,并按回车键进行测试。

<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232050-13…; alt=""></center>
<p align="center"><strong> 图 13</strong></p>

输入2,并按回车键退出测试。

<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232051-14…; alt=""></center>
<p align="center"><strong>图 14</strong></p>

执行如下命令,停止CPU1程序。

Target# echo stop > /sys/class/remoteproc/remoteproc0/state

<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232052-15…; alt=""></center>
<p align="center"><strong>图 15</strong></p>

<strong>3. 内存分配说明</strong>

512MByte DDR容量版本核心板的内存地址分配如下:

<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232053-16…; alt=""></center>

1GByte DDR容量版本核心板的内存地址分配如下:
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232054-17…; alt=""></center>

如需修改CPU1程序(OpenAMP-remote app)内存地址空间范围,可通过更改设备树文件tlz7x-easyevm-s.dts、资源表rsc_table.c及链接文件lscript.ld对内存地址空间进行重新分配。三者需同步修改并保持一致,以确保固件程序链接地址与设备树配置的elf_ddr_0对应。所使用的资源(内存和virtio设备资源)不能超出设备树文件配置的内存范围。
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232055-18…; alt=""></center>
<p align="center"><strong>图 16设备树文件tlz7x-easyevm-s.dts配置</strong></p>
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232056-19…; alt=""></center>
<p align="center"><strong>图 17设备树文件tlz7x-easyevm-s.dts配置</strong></p>

<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232057-20…; alt=""></center>
<p align="center"><strong>图 18 CPU1程序资源表rsc_table.c配置</strong></p>
<center><img src="http://xilinx.eetrend.com/files/2021-12/wen_zhang_/100556436-232058-21…; alt=""></center>
<p align="center"><strong>图 19 CPU1程序链接文件lscript.ld配置</strong></p>

获取案例源码、产品资料下载请点击:http://site.tronlong.com/pfdownload