目錄 前 言 1 echo_test案例 1 案例功能 2 操作說明 3 關鍵代碼 3.1 linux_demo代碼說明 3.2 freertos_demo代碼說明 3.3 baremetal_demo代碼說明
前 言
本文主要介紹ZYNQ基于OpenAMP框架的雙核ARM通信案例的使用說明,CPU0(Master)運行Linux系統,CPU1(Remote)運行裸機或FreeRTOS程序。CPU0使用remoteproc加載CPU1程序,并對CPU1進行配置。 
echo_test案例開發手冊是基于創龍科技 TI TMS320C6678 + Xilinx Zynq-7045的高速多路高清視頻采集處理平臺,采用DSP+FPGA+ARM架構。
SOM-TL6678ZH核心板正面圖
SOM-TL6678ZH核心板背面圖
TL6678ZH-EVM評估板資源圖1
TL6678ZH-EVM評估板資源圖2 表 1
目錄說明 linux_demobinCPU0應用程序可執行文件 srcCPU0應用程序源碼 freertos_demobinCPU1 FreeRTOS可執行文件 projectCPU1 FreeRTOS工程 baremetal_demobinCPU1裸機可執行文件 projectCPU1裸機工程 echo_test案例 案例功能 案例功能:CPU0使用RPMsg向CPU1發送數據,CPU1接收到數據后再使用RPMsg向CPU0回傳數據。CPU0對回傳的數據進行驗證,并輸出驗證結果。 操作說明 將CPU1裸機或FreeRTOS可執行文件復制到評估板文件系統“/lib/firmware/”目錄下,并執行如下命令加載CPU1程序。 Target# echo echo_test.elf > /sys/class/remoteproc/remoteproc0/firmware Target# echo start > /sys/class/remoteproc/remoteproc0/state
圖 2 執行如下命令加載RPMsg驅動,并在“/dev/”目錄下生成RPMsg設備節點。RPMsg驅動源碼為內核“drivers/rpmsg/”目錄下的rpmsg_user_dev_driver.c文件。 Target# modprobe rpmsg_user_dev_driver
圖 3
將CPU0應用程序可執行文件復制到評估板文件系統,并執行如下命令通過RPMsg與CPU1進行通信。 Target# ./echo_test
圖4
輸入1,并按回車鍵進行測試。
圖 5
圖 6
輸入2,并按回車鍵退出測試。
圖 7
執行如下命令,停止CPU1程序。 Target# echo stop > /sys/class/remoteproc/remoteproc0/state
圖 8
關鍵代碼 linux_demo代碼說明 打開RPMsg驅動設備節點。
圖 9
向CPU1發送數據,并對從CPU1回傳的數據進行驗證。
圖 10
freertos_demo代碼說明 創建processing任務。
圖 11
(2)在processing()中進行函數調用。
圖 12
調用init_system()初始化libmetal庫與GIC控制器等。
圖13
綁定中斷號與中斷服務函數,中斷號需與設備樹配置的中斷號一致。
圖 14
圖 15
調用platform_create_proc()創建平臺相關信息。
圖 16
調用get_resource_table()獲取資源表信息,資源表包含內存和virtio設備資源。virtio設備包含vring地址、vring大小和vring對齊方式等信息。
圖 17
(13)以上函數調用成功后,再調用app()。
圖 18
調用remoteproc_resource_init()對之前獲得的平臺信息、資源表信息進行處理。創建Remote Device,并為其設置增加、刪除、讀取RPMsg通道函數。
圖 19
調用hil_poll()以阻塞的方式調用poll函數,并等待數據接收。
圖 20
圖 21
在數據讀取函數rpmsg_read_cb()中,將接收到的數據放入緩沖區后產生數據接收事件,并在app()中進行事件處理。
圖 22
在virtio設備復位函數virtio_rst_cb()中產生復位virtio事件,并在app()中進行事件處理。
圖 23
在RPMsg通道創建函數rpmsg_channel_created()中,創建一個全局RPMsg端點,并設置端點讀取函數。RPMsg通信通過端點完成,與USB類似。
圖 24
在RPMsg通道刪除函數rpmsg_channel_deleted()中,刪除RPMsg端點同時產生通道刪除事件,并在app()中進行事件處理。
圖 25
baremetal_demo代碼說明
由于裸機與FreeRTOS程序相似,因此baremetal_demo代碼說明可參考freertos_demo代碼說明小節,下面對部分代碼進行補充說明。 在main()中調用init_system()初始化libmetal庫與GIC控制器等。調用platform_create_proc()創建平臺相關信息。調用get_resource_table()獲取資源表信息。以上函數調用成功后,再調用app()。
圖 26
調用remoteproc_resource_init()對之前獲得的平臺信息、資源表信息進行處理。創建Remote Device,并為其設置增加、刪除、讀取RPMsg通道函數。
圖 27
在數據讀取函數rpmsg_read_cb()中,對從CPU0接收到的數據進行判斷,并進行不同處理(關機或回傳數據),實現通信和生命周期管理。
圖 28
如需獲取案例源碼、TL6678ZH-EVM評估板或其他產品詳細資料,歡迎留言或者私聊!
|