ZYNQ 是賽靈思公司(Xilinx)推出的新一代全可編程片上系統(tǒng)(APSoC),它將處理器的軟件可編程性與 FPGA 的硬件可編程性進(jìn)行完美整合,以提供無與倫比的系統(tǒng)性能、靈活性與可擴(kuò)展性。
前言:
本文主要介紹基于OpenAMP框架的雙核ARM通信案例的使用說明,CPU0(Master)運行Linux系統(tǒng),CPU1(Remote)運行裸機(jī)或FreeRTOS程序。CPU0使用remoteproc加載CPU1程序,并對CPU1進(jìn)行配置。
圖 1
OpenAMP詳細(xì)開發(fā)說明可查閱官方文檔:
https://china.xilinx.com/content/dam/xilinx/support/documentation/sw_manuals/xilinx2021_2/ug1186-zynq-openamp-gsg.pdf。
本文基于創(chuàng)龍科技 Xilinx Zynq-7010/7020平臺進(jìn)行案例測試。
圖 2
echo_test案例
1.1?案例功能
案例功能:CPU0使用RPMsg向CPU1發(fā)送數(shù)據(jù),CPU1接收到數(shù)據(jù)后再使用RPMsg向CPU0回傳數(shù)據(jù)。CPU0對回傳的數(shù)據(jù)進(jìn)行驗證,并輸出驗證結(jié)果。
1.2?操作說明
將CPU1裸機(jī)或FreeRTOS可執(zhí)行文件復(fù)制到評估板文件系統(tǒng)“/lib/firmware/”目錄下,并執(zhí)行如下命令加載CPU1程序。
Target#? echo echo_test.elf > /sys/class/remoteproc/remoteproc0/firmware
Target#??echo start > /sys/class/remoteproc/remoteproc0/state
圖 3
執(zhí)行如下命令加載RPMsg驅(qū)動,并在“/dev/”目錄下生成RPMsg設(shè)備節(jié)點。
Target#??modprobe rpmsg_user_dev_driver
圖 4
將CPU0應(yīng)用程序可執(zhí)行文件復(fù)制到評估板文件系統(tǒng),并執(zhí)行如下命令通過RPMsg與CPU1進(jìn)行通信。
Target#? ./echo_test
圖 5
輸入1,并按回車鍵進(jìn)行測試。
圖 6
圖 7
輸入2,并按回車鍵退出測試。
圖 8
執(zhí)行如下命令,停止CPU1程序。
Target#? echo stop > /sys/class/remoteproc/remoteproc0/state
圖 9
2? ? ? ? ? ? ?1
matrix_multiply案例
2.1?案例功能
案例功能:CPU0隨機(jī)生成兩個矩陣并使用RPMsg向CPU1發(fā)送數(shù)據(jù),CPU1接收到數(shù)據(jù)后進(jìn)行矩陣乘法運算,再使用RPMsg向CPU0回傳運算結(jié)果,然后CPU0通過串口終端輸出運算結(jié)果。
2.2?操作說明
將CPU1裸機(jī)或FreeRTOS可執(zhí)行文件復(fù)制到評估板文件系統(tǒng)“/lib/firmware/”目錄下,并執(zhí)行如下命令加載CPU1程序。
Target#? echo matrix_multiply.elf?> /sys/class/remoteproc/remoteproc0/firmware
Target#? echo start > /sys/class/remoteproc/remoteproc0/state
圖 10
執(zhí)行如下命令加載RPMsg驅(qū)動,并在“/dev/”目錄下生成RPMsg設(shè)備節(jié)點。
Target#? modprobe rpmsg_user_dev_driver
圖 11
將CPU0應(yīng)用程序可執(zhí)行文件復(fù)制到評估板文件系統(tǒng),并執(zhí)行如下命令通過RPMsg與CPU1進(jìn)行通信。
Target#??./mat_mul_demo
圖 12
輸入1,并按回車鍵進(jìn)行測試。
圖 13
輸入2,并按回車鍵退出測試。?
圖 14
執(zhí)行如下命令,停止CPU1程序。
Target#? echo stop > /sys/class/remoteproc/remoteproc0/state
圖 15
?3? ? ? ? ? ? 01
內(nèi)存分配說明
512MByte DDR容量版本核心板的內(nèi)存地址分配如下:
表 1
?
名稱 | 地址范圍 | 范圍大小 |
PS?Linux | 0~0x17FF FFFF | 384MByte |
PL?MicroBlaze | 0x1800 0000~0x18FF FFFF | 16MByte |
OpenAMP-remote?app | 0x1900 0000~0x19FF FFFF | 16MByte |
PL | 0x1A00 0000~0x1FFF FFFF | 96MByte |
?
1GByte DDR容量版本核心板的內(nèi)存地址分配如下:
表 2
?
名稱 | 地址范圍 | 范圍大小 |
PS?Linux | 0~0x17FF FFFF | 384MByte |
PL?MicroBlaze | 0x1800 0000~0x18FF FFFF | 16MByte |
OpenAMP-remote?app | 0x1900 0000~0x19FF FFFF | 16MByte |
PL | 0x1A00 0000~0x1FFF FFFF | 96MByte |
PS?Linux | 0x2000 0000~0x3FFF FFFF | 512MByte |
?
如需修改CPU1程序(OpenAMP-remote app)內(nèi)存地址空間范圍,可通過更改設(shè)備樹文件tlz7x-easyevm-s.dts、資源表rsc_table.c及鏈接文件lscript.ld對內(nèi)存地址空間進(jìn)行重新分配。三者需同步修改并保持一致,以確保固件程序鏈接地址與設(shè)備樹配置的elf_ddr_0對應(yīng)。所使用的資源(內(nèi)存和virtio設(shè)備資源)不能超出設(shè)備樹文件配置的內(nèi)存范圍。
圖 16設(shè)備樹文件tlz7x-easyevm-s.dts配置
圖 17設(shè)備樹文件tlz7x-easyevm-s.dts配置
圖 18?CPU1程序資源表rsc_table.c配置
圖 19?CPU1程序鏈接文件lscript.ld配置
編輯:黃飛
?
評論