可最大程度地發(fā)揮Zynq SoC優(yōu)勢的雙重方法
賽靈思Zynq-7000全可編程 SoC的眾多優(yōu)勢之一就是擁有兩個(gè)ARM Cortex-A9板載處理器。不過(guò),很多裸機應用和更為簡(jiǎn)單的操作系統只使用Zynq SoC處理系統(PS)中兩個(gè)ARM內核中的一個(gè),這種設計方案可能會(huì )限制系統性能。
本文引用地址:http://dyxdggzs.com/article/201610/308335.htm根據所開(kāi)發(fā)的應用類(lèi)型不同,可能需要這兩個(gè)處理器都運行裸機應用,或者需要在每個(gè)處理器上運行不同的操作系統。例如,其中一個(gè)處理器執行關(guān)鍵計算任務(wù),從而運行裸機/RTOS應用,同時(shí)第二個(gè)處理器通過(guò)Linux提供HMI和通信功能。
什么是多處理?
這兩種方案都屬于多處理。簡(jiǎn)單定義:多處理就是在一個(gè)系統中使用一個(gè)以上的處理器。多處理架構可允許一次執行多個(gè)指令,但并非必須如此。
多核處理包括兩種類(lèi)型:對稱(chēng)和非對稱(chēng)。
對稱(chēng)多處理是通過(guò)將負載分配給多個(gè)內核,從而能夠同時(shí)運行多個(gè)軟件任務(wù)。而非對稱(chēng)多處理(AMP)則是使用專(zhuān)用處理器,或者針對特定應用或任務(wù)在相同處理器上執行應用。
根據定義,使用Zynq SoC上的兩個(gè)內核執行裸機應用或不同操作系統都屬于非對稱(chēng)多處理。Zynq SoC上的AMP可能涉及如下幾種組合:
• 在內核0和內核1上運行不同操作系統;
• 在內核0上運行操作系統,在內核1上運行裸機應用(反之亦然);
• 在兩個(gè)內核上均運行裸機應用,執行不同程序。
當您決定在Zynq SoC上創(chuàng )建AMP系統時(shí)必須考慮一個(gè)實(shí)際問(wèn)題,即ARM處理器內核同時(shí)包含必須進(jìn)行正確尋址的私有資源和共享資源。這兩個(gè)處理器都有私有的L1指令和數據高速緩存、定時(shí)器、監視時(shí)鐘以及中斷控制器(針對共享和私有中斷)。另外還存在一些共享資源,常見(jiàn)的有I/O外設、片上存儲器、中斷控制器分配器、L2高速緩存和位于DDR存儲器中的系統內存(見(jiàn)圖1)。這些私有和共享資源均需要精心管理。
每個(gè)PS核都有自己的中斷控制器,能夠利用軟件中斷實(shí)現自身與一個(gè)或兩個(gè)內核的中斷。這些中斷通過(guò)ARM的分布式中斷控制器技術(shù)完成分配。
由于針對每個(gè)內核執行的程序都位于DDR存儲器內,因此您必須特別注意以確保對這些應用進(jìn)行正確分割。
建立AMP
建立AMP并使其運行在Zynq SoC上所需的關(guān)鍵因素是引導載入程序,該程序會(huì )在第一個(gè)應用載入到存儲器后尋找第二個(gè)可執行文件。賽靈思在XAPP1079中提供了有用的應用指南和源代碼。該文檔包含修改后的第一階段引導載入程序(FSBL)和獨立OS,可用來(lái)創(chuàng )建AMP系統。
首先要做的是下載與應用說(shuō)明配套提供的ZIP文件,再將FSBL和OS這兩個(gè)要素解壓到期望的工作目錄。然后,必須給名為SRC“design”的文件夾重新命名?,F在,非常重要的一點(diǎn)是一定要確保軟件開(kāi)發(fā)套件(SDK)知道這些新文件(修改后的FSBL和獨立OS,兩者兼備)的存在。因此,下一步需要更新您的SDK庫,以便使其知道這些新文件的存在。
使用軟件中斷與硬件中斷基本相似,區別只在于您如何觸發(fā)它們。
這很容易實(shí)現。在SDK中賽靈思工具菜單下選擇“庫”,然后選擇“新建”,隨之導航到目錄位置您的工作目錄> app1079designworksdk_repo,如圖2所示。
處理器間的通信
為AMP設計創(chuàng )建應用之前,您需要考慮應用如何進(jìn)行通信(如有需要)。最簡(jiǎn)單的方法是使用片上存儲器。Zynq SoC配備256KB的片上SRAM,可從以下四個(gè)源地址進(jìn)行訪(fǎng)問(wèn):
• 利用偵測控制單元(SCU)從任意內核進(jìn)行訪(fǎng)問(wèn);
• 利用SCU通過(guò)AXI加速器一致性端口(ACP)從可編程邏輯進(jìn)行訪(fǎng)問(wèn);
• 利用片上存儲器(OCM)互聯(lián)通過(guò)高性能AXI端口從可編程邏輯進(jìn)行訪(fǎng)問(wèn);
• 也是利用OCM從中央互聯(lián)進(jìn)行訪(fǎng)問(wèn)。

圖1 – Zynq SoC處理系統,顯示私有和共享資源

圖2 — 將您的新文件添加到庫
由于這些不同的訪(fǎng)問(wèn)源都能對片上存儲器進(jìn)行讀寫(xiě),因此尤為重要的一點(diǎn)是,在使用OCM之前一定要首先詳細了解其的運行方式。
既然OCM有多個(gè)訪(fǎng)問(wèn)源,那么顯然應該定義一個(gè)仲裁和優(yōu)先級形式。由于偵測控制單元需要最低時(shí)延(SCU既可以是處理器內核也可以是AXI ACP接口),因此SCU從這些訪(fǎng)問(wèn)源的讀操作就具有最高優(yōu)先級,緊接著(zhù)是SCU寫(xiě)操作,然后是OCM互聯(lián)讀/寫(xiě)操作。用戶(hù)可通過(guò)將片上存儲器控制寄存器中的SCU寫(xiě)操作的優(yōu)先級設置為低來(lái)顛倒SCU寫(xiě)操作和OCM互聯(lián)訪(fǎng)問(wèn)的優(yōu)先級。
OCM本身結構為128位字,分成四個(gè)64KB分區,并位于PS地址空間的不同位置。初始配置下,前三個(gè)64KB區塊布置在地址空間的起始位置,最后一個(gè)64KB區塊置于地址空間的末尾(見(jiàn)圖5)。
簡(jiǎn)單的片上存儲器實(shí)例
您可使用賽靈思I/O函數訪(fǎng)問(wèn)OCM,以便從所選的存儲器地址讀取和寫(xiě)入數據。這些函數包含在Xil_IO.h中,可支持在CPU地址空間內存儲和訪(fǎng)問(wèn)8位、16位或32位字符型、短整型或整型數據。使用這些函數時(shí),只需知道您希望訪(fǎng)問(wèn)的地址以及想要在此存儲的值即可。如果是寫(xiě)操作,方法如下,

使用該技術(shù)時(shí)要確保兩個(gè)地址指向片上存儲器中的相同位置,尤其是當不同人編寫(xiě)不同內核程序時(shí)更應如此,為此更好的方法是使用共同的頭文件。該文件將包含針對特定傳輸的相關(guān)操作地址的宏定義,例如:

另一種備選方法是讓兩個(gè)程序都使用指示器來(lái)訪(fǎng)問(wèn)存儲單元。您可以通過(guò)使用宏命令定義指向恒定地址的指示器(一般用C語(yǔ)言)來(lái)實(shí)現這一點(diǎn):

此外,您還可以對地址再次進(jìn)行宏定義,以確保該地址為兩個(gè)應用程序的共用地址。這種方法無(wú)需使用賽靈思I/O庫,而是通過(guò)指示器實(shí)現簡(jiǎn)單訪(fǎng)問(wèn)。
處理器間的中斷
Zynq SoC中的每個(gè)內核都有16個(gè)軟件生成的中斷。如上文所提到的,每個(gè)內核都能實(shí)現自身與另一個(gè)內核或兩個(gè)內核的中斷。使用軟件中斷與使用硬件中斷基本相似,區別只在于您如何觸發(fā)它們。若使用軟件中斷,正在接收的應用就無(wú)需針對更新數據而對目標存儲單元進(jìn)行輪詢(xún)。
就像使用任何硬件中斷時(shí)一樣,您需要對兩個(gè)內核中的通用中斷控制器進(jìn)行配置。敬請參閱《賽靈思中國通訊》第87期的“如何在Zynq SoC上使用中斷”以了解更多相關(guān)信息。
然后,您可以使用xscugic.h中提供的XScuGic_SoftwareIntr函數在正在更新的內核中觸發(fā)軟件中斷。該命令將向該指定內核發(fā)出一個(gè)軟件中斷,再由該內核進(jìn)行適當操作:

您必須為內核0和內核1應用對DDR存儲器進(jìn)行正確分段,否則會(huì )存在其中一個(gè)應用破壞另一個(gè)應用的風(fēng)險。
創(chuàng )建應用
將文件添加到庫之后,下個(gè)階段就是生成AMP解決方案的三個(gè)重要部分:AMP第一階段引導載入程序、內核0應用和內核1應用。您必須為每個(gè)部分生成一個(gè)不同的板支持包(BSP)。
您需要做的第一件事是用SDK創(chuàng )建一個(gè)新的FSBL。選擇“新建應用項目”,創(chuàng )建一個(gè)支持AMP的FSBL項目。這與創(chuàng )建一般FSBL的過(guò)程沒(méi)有什么不同。不過(guò),這次您需要選擇“Zynq FSBL for AMP”模板,如圖3所示。
完成AMP FSBL創(chuàng )建之后,接下來(lái)需要為第一個(gè)內核創(chuàng )建應用。一定要選擇內核0和您的首選操作系統,并允許其創(chuàng )建自己的BSP,如圖4所示。
創(chuàng )建應用之后,您需要正確定義應用在DDR存儲器中的位置(應用將從該位置執行)。為此,您需要編輯圖5中的鏈接器腳本,以顯示DDR的基地址和大小。這一點(diǎn)很重要,因為如果沒(méi)有為內核0和內核1應用對DDR存儲器進(jìn)行正確分段,就會(huì )存在其中一個(gè)應用破壞另一個(gè)應用的風(fēng)險。
完成分段之后,您現在可以編寫(xiě)希望在內核0上執行的應用,因為該內核是AMP系統中的主管。內核0必須啟動(dòng)內核1應用的執行。您需要將圖6中的代碼段包含在應用中。這段代碼禁用片上存儲器上的高速緩存,并將內核1程序的起始地址寫(xiě)到一個(gè)內核1將會(huì )訪(fǎng)問(wèn)的地址。一旦內核0執行Set Event(SEV)命令,內核1便開(kāi)始執行其程序。

圖3 – 為AMP設計選擇第一階段引導載入程序

圖4 – 為內核0創(chuàng )建應用和BSP
下一步是為內核1創(chuàng )建BSP。一定要使用修改后的獨立OS(standalone_amp,如圖7所示),這一點(diǎn)很重要,因為它能防止PS偵測控制單元的重新初始化。就這一點(diǎn)而言,在創(chuàng )建項目時(shí)不要像對待內核0那樣允許其自動(dòng)生成BSP。必須確保在CPU選項中選擇內核1。
既然您已經(jīng)為內核1創(chuàng )建了BSP,那么接下來(lái)首先需要修改BSP的設置,才能繼續創(chuàng )建您想要在內核1上運行的應用。這非常簡(jiǎn)單,只需要向BSP驅動(dòng)器部分的配置中添加一個(gè)額外的編譯器標志:–DUSE_AMP=1。
這一步完成后,您就可以任意為內核1創(chuàng )建應用了。務(wù)必選擇內核1作為處理器,并使用您剛剛創(chuàng )建的BSP。創(chuàng )建新應用之后,您需要再次在DDR存儲器中定義正確的存儲單元,而內核1程序將從此處執行。您可按照之前的方法通過(guò)編輯內核1應用的鏈接器腳本來(lái)完成設定。與第一個(gè)內核一樣,在該應用中同樣要禁用片上存儲器上的高速緩存——該高速緩存可用來(lái)在這兩個(gè)處理器之間進(jìn)行通信。
將所有組件完美整合
在創(chuàng )建應用和構建項目之后,您現在應已擁有以下組件:
• AMP FSBL ELF;
• 內核0 ELF;
• 內核1 ELF;
• BIT文件,用來(lái)為預期能夠實(shí)現AMP的Zynq器件定義配置。

圖5 – 內核0的DDR位置和大小
使用所提供的工具在Zynq SoC上創(chuàng )建非對稱(chēng)多處理應用可以變得非常簡(jiǎn)單。

圖6 – 通過(guò)編碼禁用片上存儲器上的高速緩存

圖7 – 為內核1創(chuàng )建BSP
為了使Zynq SoC從所選的配置存儲器中引導,您需要一個(gè).bin文件。要創(chuàng )建該文件,您還需要一個(gè)BIF文件。BIF文件規定了應使用哪些文件創(chuàng )建BIN文件以及它們的順序。不要使用SDK中的“創(chuàng )建Zynq”引導映像,而應使用ISE®設計套件命令提示符和BAT文件(BAT文件是XAPP1079的一部分,位于下載目錄designworkbootgen)。該目錄包含一個(gè)BIF文件和一個(gè)cpu1_bootvec.bin,后者作為修改后的FSBL的一部分,用于阻止其查找和加載更多應用。
要生成BIN文件,您需要將生成的三個(gè)ELF文件復制到bootgen目錄,并對BIF文件進(jìn)行編輯以確保其中的ELF名稱(chēng)正確無(wú)誤(如圖8所示)。
現在您可打開(kāi)一個(gè)ISE命令提示符,并導航至bootgen目錄。在這里運行createboot.bat。該步驟將創(chuàng )建boot.bin文件(如圖9所示)。

圖8 – 修改BIF文件

圖9 – 創(chuàng )建將在Zynq SoC上運行的boot.bin文件
然后,您可將該文件下載到Zynq SoC上的非易失性存儲器中。該器件的引導將使兩個(gè)內核啟動(dòng)并執行其各自的程序。
使用所提供的工具在Zynq SoC上創(chuàng )建非對稱(chēng)多處理應用可以變得非常簡(jiǎn)單。使用片上存儲器或DDR分區可以很容易地實(shí)現兩個(gè)內核之間的通信。
評論