處理器間的通信
為AMP 設(shè)計(jì)創(chuàng)建應(yīng)用之前,您需要考慮應(yīng)用如何進(jìn)行通信(如有需要)。最簡(jiǎn)單的方法是使用片上存儲(chǔ)器。Zynq SoC 配備256KB 的片上SRAM,可從以下四個(gè)源地址進(jìn)行訪問:
? 利用偵測(cè)控制單元(SCU)從任意內(nèi)核進(jìn)行訪問;
? 利用SCU 通過AXI 加速器一致性端口(ACP)從可編程邏輯進(jìn)行訪問;
? 利用片上存儲(chǔ)器(OCM)互聯(lián)通過高性能AXI 端口從可編程邏輯進(jìn)行訪問;
? 也是利用OCM 從中央互聯(lián)進(jìn)行訪問。
由于這些不同的訪問源都能對(duì)片上存儲(chǔ)器進(jìn)行讀寫,因此尤為重要的一點(diǎn)是,在使用OCM 之前一定要首先詳細(xì)了解其的運(yùn)行方式。
既然OCM 有多個(gè)訪問源,那么顯然應(yīng)該定義一個(gè)仲裁和優(yōu)先級(jí)形式。由于偵測(cè)控制單元需要最低時(shí)延(SCU 既可以是處理器內(nèi)核也可以是AXI ACP 接口),因此SCU 從這些訪問源的讀操作就具有最高優(yōu)先級(jí),緊接著是SCU 寫操作,然后是OCM 互聯(lián)讀/ 寫操作。用戶可通過將片上存儲(chǔ)器控制寄存器中的SCU 寫操作的優(yōu)先級(jí)設(shè)置為低來顛倒SCU 寫操作和OCM 互聯(lián)訪問的優(yōu)先級(jí)。
OCM 本身結(jié)構(gòu)為128 位字,分成四個(gè)64KB 分區(qū),并位于PS 地址空間的不同位置。初始配置下,前三個(gè)64KB 區(qū)塊布置在地址空間的起始位置,最后一個(gè)64KB 區(qū)塊置于地址空間的末尾(見圖5)。
簡(jiǎn)單的片上存儲(chǔ)器實(shí)例
您可使用賽靈思I/O 函數(shù)訪問OCM,以便從所選的存儲(chǔ)器地址讀取和寫入數(shù)據(jù)。這些函數(shù)包含在Xil_IO.h 中,可支持在CPU 地址空間內(nèi)存儲(chǔ)和訪問8 位、16 位或32 位字符型、短整型或整型數(shù)據(jù)。使用這些函數(shù)時(shí),只需知道您希望訪問的地址以及想要在此存儲(chǔ)的值即可。如果是寫操作,方法如下,
使用該技術(shù)時(shí)要確保兩個(gè)地址指向片上存儲(chǔ)器中的相同位置,尤其是當(dāng)不同人編寫不同內(nèi)核程序時(shí)更應(yīng)如此,為此更好的方法是使用共同的頭文件。該文件將包含針對(duì)特定傳輸?shù)南嚓P(guān)操作地址的宏定義,例如:
另一種備選方法是讓兩個(gè)程序都使用指示器來訪問存儲(chǔ)單元。您可以通過使用宏命令定義指向恒定地址的指示器(一般用C 語言)來實(shí)現(xiàn)這一點(diǎn):
此外,您還可以對(duì)地址再次進(jìn)行宏定義,以確保該地址為兩個(gè)應(yīng)用程序的共用地址。這種方法無需使用賽靈思I/O 庫(kù),而是通過指示器實(shí)現(xiàn)簡(jiǎn)單訪問。
處理器間的中斷
Zynq SoC 中的每個(gè)內(nèi)核都有16 個(gè)軟件生成的中斷。如上文所提到的,每個(gè)內(nèi)核都能實(shí)現(xiàn)自身與另一個(gè)內(nèi)核或兩個(gè)內(nèi)核的中斷。使用軟件中斷與使用硬件中斷基本相似,區(qū)別只在于您如何觸發(fā)它們。若使用軟件中斷,正在接收的應(yīng)用就無需針對(duì)更新數(shù)據(jù)而對(duì)目標(biāo)存儲(chǔ)單元進(jìn)行輪詢。
就像使用任何硬件中斷時(shí)一樣,您需要對(duì)兩個(gè)內(nèi)核中的通用中斷控制器進(jìn)行配置。敬請(qǐng)參閱《賽靈思中國(guó)通訊》第52 期的“如何在Zynq SoC上使用中斷”以了解更多相關(guān)信息。
然后,您可以使用xscugic.h 中提供的XScuGic_SoftwareIntr 函數(shù)在正在更新的內(nèi)核中觸發(fā)軟件中斷。該命令將向該指定內(nèi)核發(fā)出一個(gè)軟件中斷,再由該內(nèi)核進(jìn)行適當(dāng)操作:
您必須為內(nèi)核0和內(nèi)核1應(yīng)用對(duì)DDR存儲(chǔ)器進(jìn)行正確分段,否則會(huì)存在其中一個(gè)應(yīng)用破壞另一個(gè)應(yīng)用的風(fēng)險(xiǎn)。
創(chuàng)建應(yīng)用
將文件添加到庫(kù)之后,下個(gè)階段就是生成AMP 解決方案的三個(gè)重要部分:AMP 第一階段引導(dǎo)載入程序、內(nèi)核0應(yīng)用和內(nèi)核1 應(yīng)用。您必須為每個(gè)部分生成一個(gè)不同的板支持包(BSP)。
您需要做的第一件事是用SDK創(chuàng)建一個(gè)新的FSBL。選擇“新建應(yīng)用項(xiàng)目”,創(chuàng)建一個(gè)支持AMP 的FSBL 項(xiàng)目。這與創(chuàng)建一般FSBL 的過程沒有什么不同。不過,這次您需要選擇“Zynq FSBL for AMP”模板,如圖3 所示。
?
圖3 – 為AMP設(shè)計(jì)選擇第一階段引導(dǎo)載入程序
完成AMP FSBL 創(chuàng)建之后,接下來需要為第一個(gè)內(nèi)核創(chuàng)建應(yīng)用。一定要選擇內(nèi)核0 和您的首選操作系統(tǒng),并允許其創(chuàng)建自己的BSP,如圖4 所示。
?
圖4 – 為內(nèi)核0創(chuàng)建應(yīng)用和BSP
創(chuàng)建應(yīng)用之后,您需要正確定義應(yīng)用在DDR 存儲(chǔ)器中的位置(應(yīng)用將從該位置執(zhí)行)。為此,您需要編輯圖5 中的鏈接器腳本,以顯示DDR 的基地址和大小。這一點(diǎn)很重要,因?yàn)槿绻麤]有為內(nèi)核0 和內(nèi)核1應(yīng)用對(duì)DDR 存儲(chǔ)器進(jìn)行正確分段,就會(huì)存在其中一個(gè)應(yīng)用破壞另一個(gè)應(yīng)用的風(fēng)險(xiǎn)。
?
圖5 – 內(nèi)核0的DDR位置和大小
完成分段之后,您現(xiàn)在可以編寫希望在內(nèi)核0 上執(zhí)行的應(yīng)用,因?yàn)樵搩?nèi)核是AMP 系統(tǒng)中的主管。內(nèi)核0 必須啟動(dòng)內(nèi)核1 應(yīng)用的執(zhí)行。您需要將圖6 中的代碼段包含在應(yīng)用中。這段代碼禁用片上存儲(chǔ)器上的高速緩存,并將內(nèi)核1 程序的起始地址寫到一個(gè)內(nèi)核1 將會(huì)訪問的地址。一旦內(nèi)核0 執(zhí)行Set Event(SEV)命令,內(nèi)核1 便開始執(zhí)行其程序。
?
圖6 – 通過編碼禁用片上存儲(chǔ)器上的高速緩存
下一步是為內(nèi)核1 創(chuàng)建BSP。一定要使用修改后的獨(dú)立OS(standalone_amp,如圖7 所示),這一點(diǎn)很重要,因?yàn)樗芊乐筆S 偵測(cè)控制單元的重新初始化。就這一點(diǎn)而言,在創(chuàng)建項(xiàng)目時(shí)不要像對(duì)待內(nèi)核0那樣允許其自動(dòng)生成BSP。必須確保在CPU 選項(xiàng)中選擇內(nèi)核1。
?
圖7 – 為內(nèi)核1創(chuàng)建BSP
既然您已經(jīng)為內(nèi)核1 創(chuàng)建了BSP,那么接下來首先需要修改BSP的設(shè)置,才能繼續(xù)創(chuàng)建您想要在內(nèi)核1 上運(yùn)行的應(yīng)用。這非常簡(jiǎn)單,只需要向BSP 驅(qū)動(dòng)器部分的配置中添加一個(gè)額外的編譯器標(biāo)志:–DUSE_AMP=1。
這一步完成后,您就可以任意為內(nèi)核1 創(chuàng)建應(yīng)用了。務(wù)必選擇內(nèi)核1 作為處理器,并使用您剛剛創(chuàng)建的BSP。創(chuàng)建新應(yīng)用之后,您需要再次在DDR 存儲(chǔ)器中定義正確的存儲(chǔ)單元,而內(nèi)核1 程序?qū)拇颂巿?zhí)行。您可按照之前的方法通過編輯內(nèi)核1 應(yīng)用的鏈接器腳本來完成設(shè)定。與第一個(gè)內(nèi)核一樣,在該應(yīng)用中同樣要禁用片上存儲(chǔ)器上的高速緩存—— 該高速緩存可用來在這兩個(gè)處理器之間進(jìn)行通信。
將所有組件完美整合
在創(chuàng)建應(yīng)用和構(gòu)建項(xiàng)目之后,您現(xiàn)在應(yīng)已擁有以下組件:
? AMP FSBL ELF ;
? 內(nèi)核0 ELF ;
? 內(nèi)核1 ELF ;
? BIT 文件,用來為預(yù)期能夠?qū)崿F(xiàn)AMP 的Zynq 器件定義配置。
使用所提供的工具在Zynq SoC上創(chuàng)建非對(duì)稱多處理應(yīng)用可以變得非常簡(jiǎn)單。
為了使Zynq SoC 從所選的配置存儲(chǔ)器中引導(dǎo),您需要一個(gè).bin 文件。要?jiǎng)?chuàng)建該文件,您還需要一個(gè)BIF 文件。BIF 文件規(guī)定了應(yīng)使用哪些文件創(chuàng)建BIN 文件以及它們的順序。不要使用SDK 中的“創(chuàng)建Zynq”引導(dǎo)映像,而應(yīng)使用ISE? 設(shè)計(jì)套件命令提示符和BAT 文件(BAT 文件是XAPP1079 的一部分,位于下載目錄designworkootgen)。該目錄包含一個(gè)BIF 文件和一個(gè)cpu1_bootvec.bin,后者作為修改后的FSBL 的一部分,用于阻止其查找和加載更多應(yīng)用。
要生成BIN 文件,您需要將生成的三個(gè)ELF 文件復(fù)制到bootgen 目錄,并對(duì)BIF 文件進(jìn)行編輯以確保其中的ELF 名稱正確無誤(如圖8 所示)。
?
圖8 – 修改BIF文件
現(xiàn)在您可打開一個(gè)ISE 命令提示符,并導(dǎo)航至bootgen 目錄。在這里運(yùn)行createboot.bat。該步驟將創(chuàng)建boot.bin 文件(如圖9 所示)。
?
圖9 – 創(chuàng)建將在Zynq SoC上運(yùn)行的boot.bin文件
然后,您可將該文件下載到ZynqSoC 上的非易失性存儲(chǔ)器中。該器件的引導(dǎo)將使兩個(gè)內(nèi)核啟動(dòng)并執(zhí)行其各自的程序。
使用所提供的工具在Zynq SoC上創(chuàng)建非對(duì)稱多處理應(yīng)用可以變得非常簡(jiǎn)單。使用片上存儲(chǔ)器或DDR 分區(qū)可以很容易地實(shí)現(xiàn)兩個(gè)內(nèi)核之間的通信。
評(píng)論
查看更多