1. 程式人生 > >zynq雙核通訊

zynq雙核通訊

雙核通訊的基礎是已經建立好了雙核工程,且配置完成。

兩個CPU之間傳遞資料,採用了共享記憶體,共享記憶體設定在OCM(On Chip Memory)內

在沒有做其他設定的情況下ZYNQ上電後地址空間分別如上圖所示。OCM共256KB按照64KB分為4塊,其中前三塊在SDK中表述為RAM0佔192KB處於地址空間的最開頭和DDR共用地址空間,最後一塊64KB處於地址空間的最後。ZYNQ的DDR固定佔地址空間的最開頭1GB位元組因而ZYNQ的DDR最大容量就只有1GB。為了避開OCM從上圖可知實際使用的DDR只有1023MB(最開頭的1MB被保留避開OCM的前三塊)。從0x40000000到0xDFFFFFFF的2GB空間留給了自定義IP或者其他IP的暫存器,從BSP的xparameters.h可以看出在PL部分新增的IP其基址都是從0x40000000開始的,而ZYNQ自己的暫存器則從0xE0000000開始編制,具體暫存器內容請查閱UG585的附錄B Register Details。其實Standalone作為基礎的BSP所作的工作都是在通過指標訪問各個暫存器而已,在不考慮安全性的前提下可以完全不用BSP直接操作暫存器對ZYNQ進行操作。

需要在SDK中進行雙核通訊的設定,主要是程式的設定

  1. CPU1需要被CPU0啟動

CPU0的配置

設定共享記憶體區域

#define Send_CPU1_Status (*(volatile unsigned int *)(0xFFFF0000))

在主函式中新增:

Xil_SetTlbAttributes(0xFFFF0000,0x14de2);// CPU0中禁止OCM的Cache屬性

2,  CPU1通訊配置

CPU1的配置

設定共享記憶體區域

#define Send_CPU1_Status (*(volatile unsigned int *)(0xFFFF0000))

在主函式中新增:

Xil_SetTlbAttributes

(0xFFFF0000,0x14de2);// CPU0中禁止OCM的Cache屬性

3,設定完成,雙核之間通過對該記憶體區域進行讀寫操作完成通訊功能