新聞中心

EEPW首頁 > EDA/PCB > 設(shè)計應(yīng)用 > 可最大程度地發(fā)揮Zynq SoC優(yōu)勢的雙重方法

可最大程度地發(fā)揮Zynq SoC優(yōu)勢的雙重方法

作者: 時間:2016-10-16 來源:網(wǎng)絡(luò) 收藏

Zynq-7000全可編程 SoC的眾多優(yōu)勢之一就是擁有兩個ARM Cortex-A9板載處理器。不過,很多裸機(jī)應(yīng)用和更為簡單的操作系統(tǒng)只使用Zynq SoC處理系統(tǒng)(PS)中兩個ARM內(nèi)核中的一個,這種設(shè)計方案可能會限制系統(tǒng)性能。

本文引用地址:http://butianyuan.cn/article/201610/308335.htm

根據(jù)所開發(fā)的應(yīng)用類型不同,可能需要這兩個處理器都運(yùn)行裸機(jī)應(yīng)用,或者需要在每個處理器上運(yùn)行不同的操作系統(tǒng)。例如,其中一個處理器執(zhí)行關(guān)鍵計算任務(wù),從而運(yùn)行裸機(jī)/RTOS應(yīng)用,同時第二個處理器通過Linux提供HMI和通信功能。

什么是多處理?

這兩種方案都屬于多處理。簡單定義:多處理就是在一個系統(tǒng)中使用一個以上的處理器。多處理架構(gòu)可允許一次執(zhí)行多個指令,但并非必須如此。

多核處理包括兩種類型:對稱和非對稱。

對稱多處理是通過將負(fù)載分配給多個內(nèi)核,從而能夠同時運(yùn)行多個軟件任務(wù)。而非對稱多處理(AMP)則是使用專用處理器,或者針對特定應(yīng)用或任務(wù)在相同處理器上執(zhí)行應(yīng)用。

根據(jù)定義,使用上的兩個內(nèi)核執(zhí)行裸機(jī)應(yīng)用或不同操作系統(tǒng)都屬于非對稱多處理。上的AMP可能涉及如下幾種組合:

• 在內(nèi)核0和內(nèi)核1上運(yùn)行不同操作系統(tǒng);

• 在內(nèi)核0上運(yùn)行操作系統(tǒng),在內(nèi)核1上運(yùn)行裸機(jī)應(yīng)用(反之亦然);

• 在兩個內(nèi)核上均運(yùn)行裸機(jī)應(yīng)用,執(zhí)行不同程序。

當(dāng)您決定在Zynq SoC上創(chuàng)建AMP系統(tǒng)時必須考慮一個實際問題,即ARM處理器內(nèi)核同時包含必須進(jìn)行正確尋址的私有資源和共享資源。這兩個處理器都有私有的L1指令和數(shù)據(jù)高速緩存、定時器、監(jiān)視時鐘以及中斷控制器(針對共享和私有中斷)。另外還存在一些共享資源,常見的有I/O外設(shè)、片上存儲器、中斷控制器分配器、L2高速緩存和位于DDR存儲器中的系統(tǒng)內(nèi)存(見圖1)。這些私有和共享資源均需要精心管理。

每個PS核都有自己的中斷控制器,能夠利用軟件中斷實現(xiàn)自身與一個或兩個內(nèi)核的中斷。這些中斷通過ARM的分布式中斷控制器技術(shù)完成分配。

由于針對每個內(nèi)核執(zhí)行的程序都位于DDR存儲器內(nèi),因此您必須特別注意以確保對這些應(yīng)用進(jìn)行正確分割。

建立AMP

建立AMP并使其運(yùn)行在Zynq SoC上所需的關(guān)鍵因素是引導(dǎo)載入程序,該程序會在第一個應(yīng)用載入到存儲器后尋找第二個可執(zhí)行文件。在XAPP1079中提供了有用的應(yīng)用指南和源代碼。該文檔包含修改后的第一階段引導(dǎo)載入程序(FSBL)和獨立OS,可用來創(chuàng)建AMP系統(tǒng)。

首先要做的是下載與應(yīng)用說明配套提供的ZIP文件,再將FSBL和OS這兩個要素解壓到期望的工作目錄。然后,必須給名為SRC“design”的文件夾重新命名。現(xiàn)在,非常重要的一點是一定要確保軟件開發(fā)套件(SDK)知道這些新文件(修改后的FSBL和獨立OS,兩者兼?zhèn)?的存在。因此,下一步需要更新您的SDK庫,以便使其知道這些新文件的存在。

使用軟件中斷與硬件中斷基本相似,區(qū)別只在于您如何觸發(fā)它們。

這很容易實現(xiàn)。在SDK中工具菜單下選擇“庫”,然后選擇“新建”,隨之導(dǎo)航到目錄位置您的工作目錄> app1079designworksdk_repo,如圖2所示。

處理器間的通信

為AMP設(shè)計創(chuàng)建應(yīng)用之前,您需要考慮應(yīng)用如何進(jìn)行通信(如有需要)。最簡單的方法是使用片上存儲器。Zynq SoC配備256KB的片上SRAM,可從以下四個源地址進(jìn)行訪問:

• 利用偵測控制單元(SCU)從任意內(nèi)核進(jìn)行訪問;

• 利用SCU通過AXI加速器一致性端口(ACP)從可編程邏輯進(jìn)行訪問;

• 利用片上存儲器(OCM)互聯(lián)通過高性能AXI端口從可編程邏輯進(jìn)行訪問;

• 也是利用OCM從中央互聯(lián)進(jìn)行訪問。

image002.gif

圖1 – 處理系統(tǒng),顯示私有和共享資源

image004.gif

圖2 — 將您的新文件添加到庫

由于這些不同的訪問源都能對片上存儲器進(jìn)行讀寫,因此尤為重要的一點是,在使用OCM之前一定要首先詳細(xì)了解其的運(yùn)行方式。

既然OCM有多個訪問源,那么顯然應(yīng)該定義一個仲裁和優(yōu)先級形式。由于偵測控制單元需要最低時延(SCU既可以是處理器內(nèi)核也可以是AXI ACP接口),因此SCU從這些訪問源的讀操作就具有最高優(yōu)先級,緊接著是SCU寫操作,然后是OCM互聯(lián)讀/寫操作。用戶可通過將片上存儲器控制寄存器中的SCU寫操作的優(yōu)先級設(shè)置為低來顛倒SCU寫操作和OCM互聯(lián)訪問的優(yōu)先級。

OCM本身結(jié)構(gòu)為128位字,分成四個64KB分區(qū),并位于PS地址空間的不同位置。初始配置下,前三個64KB區(qū)塊布置在地址空間的起始位置,最后一個64KB區(qū)塊置于地址空間的末尾(見圖5)。

簡單的片上存儲器實例

您可使用賽靈思I/O函數(shù)訪問OCM,以便從所選的存儲器地址讀取和寫入數(shù)據(jù)。這些函數(shù)包含在Xil_IO.h中,可支持在CPU地址空間內(nèi)存儲和訪問8位、16位或32位字符型、短整型或整型數(shù)據(jù)。使用這些函數(shù)時,只需知道您希望訪問的地址以及想要在此存儲的值即可。如果是寫操作,方法如下,

image006.gif

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

image008.gif

另一種備選方法是讓兩個程序都使用指示器來訪問存儲單元。您可以通過使用宏命令定義指向恒定地址的指示器(一般用C語言)來實現(xiàn)這一點:

image010.gif

此外,您還可以對地址再次進(jìn)行宏定義,以確保該地址為兩個應(yīng)用程序的共用地址。這種方法無需使用賽靈思I/O庫,而是通過指示器實現(xiàn)簡單訪問。

處理器間的中斷

Zynq SoC中的每個內(nèi)核都有16個軟件生成的中斷。如上文所提到的,每個內(nèi)核都能實現(xiàn)自身與另一個內(nèi)核或兩個內(nèi)核的中斷。使用軟件中斷與使用硬件中斷基本相似,區(qū)別只在于您如何觸發(fā)它們。若使用軟件中斷,正在接收的應(yīng)用就無需針對更新數(shù)據(jù)而對目標(biāo)存儲單元進(jìn)行輪詢。

就像使用任何硬件中斷時一樣,您需要對兩個內(nèi)核中的通用中斷控制器進(jìn)行配置。敬請參閱《賽靈思中國通訊》第87期的“如何在Zynq SoC上使用中斷”以了解更多相關(guān)信息。

然后,您可以使用xscugic.h中提供的XScuGic_SoftwareIntr函數(shù)在正在更新的內(nèi)核中觸發(fā)軟件中斷。該命令將向該指定內(nèi)核發(fā)出一個軟件中斷,再由該內(nèi)核進(jìn)行適當(dāng)操作:

image012.gif

您必須為內(nèi)核0和內(nèi)核1應(yīng)用對DDR存儲器進(jìn)行正確分段,否則會存在其中一個應(yīng)用破壞另一個應(yīng)用的風(fēng)險。

創(chuàng)建應(yīng)用

將文件添加到庫之后,下個階段就是生成AMP解決方案的三個重要部分:AMP第一階段引導(dǎo)載入程序、內(nèi)核0應(yīng)用和內(nèi)核1應(yīng)用。您必須為每個部分生成一個不同的板支持包(BSP)。

您需要做的第一件事是用SDK創(chuàng)建一個新的FSBL。選擇“新建應(yīng)用項目”,創(chuàng)建一個支持AMP的FSBL項目。這與創(chuàng)建一般FSBL的過程沒有什么不同。不過,這次您需要選擇“Zynq FSBL for AMP”模板,如圖3所示。

完成AMP FSBL創(chuàng)建之后,接下來需要為第一個內(nèi)核創(chuàng)建應(yīng)用。一定要選擇內(nèi)核0和您的首選操作系統(tǒng),并允許其創(chuàng)建自己的BSP,如圖4所示。

創(chuàng)建應(yīng)用之后,您需要正確定義應(yīng)用在DDR存儲器中的位置(應(yīng)用將從該位置執(zhí)行)。為此,您需要編輯圖5中的鏈接器腳本,以顯示DDR的基地址和大小。這一點很重要,因為如果沒有為內(nèi)核0和內(nèi)核1應(yīng)用對DDR存儲器進(jìn)行正確分段,就會存在其中一個應(yīng)用破壞另一個應(yīng)用的風(fēng)險。

完成分段之后,您現(xiàn)在可以編寫希望在內(nèi)核0上執(zhí)行的應(yīng)用,因為該內(nèi)核是AMP系統(tǒng)中的主管。內(nèi)核0必須啟動內(nèi)核1應(yīng)用的執(zhí)行。您需要將圖6中的代碼段包含在應(yīng)用中。這段代碼禁用片上存儲器上的高速緩存,并將內(nèi)核1程序的起始地址寫到一個內(nèi)核1將會訪問的地址。一旦內(nèi)核0執(zhí)行Set Event(SEV)命令,內(nèi)核1便開始執(zhí)行其程序。

image014.gif

圖3 – 為AMP設(shè)計選擇第一階段引導(dǎo)載入程序

image016.gif

圖4 – 為內(nèi)核0創(chuàng)建應(yīng)用和BSP

下一步是為內(nèi)核1創(chuàng)建BSP。一定要使用修改后的獨立OS(standalone_amp,如圖7所示),這一點很重要,因為它能防止PS偵測控制單元的重新初始化。就這一點而言,在創(chuàng)建項目時不要像對待內(nèi)核0那樣允許其自動生成BSP。必須確保在CPU選項中選擇內(nèi)核1。

既然您已經(jīng)為內(nèi)核1創(chuàng)建了BSP,那么接下來首先需要修改BSP的設(shè)置,才能繼續(xù)創(chuàng)建您想要在內(nèi)核1上運(yùn)行的應(yīng)用。這非常簡單,只需要向BSP驅(qū)動器部分的配置中添加一個額外的編譯器標(biāo)志:–DUSE_AMP=1。

這一步完成后,您就可以任意為內(nèi)核1創(chuàng)建應(yīng)用了。務(wù)必選擇內(nèi)核1作為處理器,并使用您剛剛創(chuàng)建的BSP。創(chuàng)建新應(yīng)用之后,您需要再次在DDR存儲器中定義正確的存儲單元,而內(nèi)核1程序?qū)拇颂巿?zhí)行。您可按照之前的方法通過編輯內(nèi)核1應(yīng)用的鏈接器腳本來完成設(shè)定。與第一個內(nèi)核一樣,在該應(yīng)用中同樣要禁用片上存儲器上的高速緩存——該高速緩存可用來在這兩個處理器之間進(jìn)行通信。

將所有組件完美整合

在創(chuàng)建應(yīng)用和構(gòu)建項目之后,您現(xiàn)在應(yīng)已擁有以下組件:

• AMP FSBL ELF;

• 內(nèi)核0 ELF;

• 內(nèi)核1 ELF;

• BIT文件,用來為預(yù)期能夠?qū)崿F(xiàn)AMP的Zynq器件定義配置。

image018.gif

圖5 – 內(nèi)核0的DDR位置和大小

使用所提供的工具在Zynq SoC上創(chuàng)建非對稱多處理應(yīng)用可以變得非常簡單。

image020.gif

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

image022.gif

圖7 – 為內(nèi)核1創(chuàng)建BSP

為了使Zynq SoC從所選的配置存儲器中引導(dǎo),您需要一個.bin文件。要創(chuàng)建該文件,您還需要一個BIF文件。BIF文件規(guī)定了應(yīng)使用哪些文件創(chuàng)建BIN文件以及它們的順序。不要使用SDK中的“創(chuàng)建Zynq”引導(dǎo)映像,而應(yīng)使用ISE®設(shè)計套件命令提示符和BAT文件(BAT文件是XAPP1079的一部分,位于下載目錄designworkbootgen)。該目錄包含一個BIF文件和一個cpu1_bootvec.bin,后者作為修改后的FSBL的一部分,用于阻止其查找和加載更多應(yīng)用。

要生成BIN文件,您需要將生成的三個ELF文件復(fù)制到bootgen目錄,并對BIF文件進(jìn)行編輯以確保其中的ELF名稱正確無誤(如圖8所示)。

現(xiàn)在您可打開一個ISE命令提示符,并導(dǎo)航至bootgen目錄。在這里運(yùn)行createboot.bat。該步驟將創(chuàng)建boot.bin文件(如圖9所示)。

image024.gif

圖8 – 修改BIF文件

image026.gif

圖9 – 創(chuàng)建將在Zynq SoC上運(yùn)行的boot.bin文件

然后,您可將該文件下載到Zynq SoC上的非易失性存儲器中。該器件的引導(dǎo)將使兩個內(nèi)核啟動并執(zhí)行其各自的程序。

使用所提供的工具在Zynq SoC上創(chuàng)建非對稱多處理應(yīng)用可以變得非常簡單。使用片上存儲器或DDR分區(qū)可以很容易地實現(xiàn)兩個內(nèi)核之間的通信。



關(guān)鍵詞: 賽靈思 Zynq SoC

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉