在Zynq SoC上實(shí)現(xiàn)雙核非對(duì)稱(chēng)的多進(jìn)程處理模式
在我的上一篇博客中我介紹了利用Zynq SoC上的兩個(gè)ARM Cortex-A9 MPCore處理器執(zhí)行不同的任務(wù)程序,實(shí)現(xiàn)非對(duì)稱(chēng)的多進(jìn)程處理模式的概念。我期望你能坐得住因?yàn)檫@篇博客有點(diǎn)長(zhǎng),但是我們會(huì)有收獲,到最后我們會(huì)讓我們的AMP系統(tǒng)啟動(dòng)并運(yùn)行,在我們實(shí)現(xiàn)AMP系統(tǒng)啟動(dòng)并運(yùn)行之前會(huì)進(jìn)行很多步的準(zhǔn)備工作,但是這些都非常的簡(jiǎn)單所以不用擔(dān)心。
本文引用地址:http://2s4d.com/article/201710/365674.htm在Zynq SoC上搭建AMP系統(tǒng)的關(guān)鍵是配置好一個(gè)啟動(dòng)引導(dǎo)加載程序,第一階段的加載程序執(zhí)行完畢后處理器會(huì)尋找這個(gè)執(zhí)行文件并加載到內(nèi)存中。不幸的是我使用的Vivado工具是2014.1版本(因?yàn)槲易罱诎峒覜](méi)有網(wǎng)絡(luò)所以不能下載最新的版本),當(dāng)我們生成FSBL(第一階段啟動(dòng)加載文件)時(shí)這個(gè)版本不支持AMP,因此為了能夠完成這個(gè)例程我將使用賽靈思應(yīng)用筆記XAPP1079中提供的修改過(guò)的FSBL文件和standalone OS文件。(源文件下載鏈接 )
下載好壓縮包文件后第一部是將文件解壓到你期望的工作目錄下,并給文件夾重命名為SRC。這些文件包含了修改過(guò)的FSBL和standalone OS文件。我們需要讓SDK軟件能夠找到這些文件,因此下一步是要設(shè)置更新一下SDK存儲(chǔ)庫(kù)目錄讓SDK能夠找到這些文件。在SDK軟件菜單來(lái)點(diǎn)擊Xilinx tools,在下拉菜單中選擇repositories,創(chuàng)建一個(gè)新的存儲(chǔ)庫(kù)文件目錄,路徑為你的工作目錄>app1079designworksdk_repo,具體如下圖所示:
添加好存儲(chǔ)庫(kù)后下一步就是要生成以下文件:
AMP第一階段啟動(dòng)引導(dǎo)加載程序
Core 0 的應(yīng)用程序
Core 1 的應(yīng)用程序
我們要為每個(gè)處理器內(nèi)核生成BSP(板級(jí)支持包)文件:
第一步是創(chuàng)建FSBL,選擇file -> new applicaTIon -> project,這樣才能夠讓我們創(chuàng)建一個(gè)FSBL工程,實(shí)現(xiàn)AMP處理模式,這些步驟和以前沒(méi)什么區(qū)別,但是我們選擇Zynq FSBL for AMP 模板,代替以前選擇的Zynq FSBL模板.
接下來(lái)我們要為第一個(gè)處理器內(nèi)核創(chuàng)建應(yīng)用程序,這步同樣很簡(jiǎn)單。以前我們已經(jīng)做過(guò)很多次了,這里要確保選擇的是Core 0 和standalone OS并且創(chuàng)建自己的BSP文件。
一旦我們?yōu)閮?nèi)核創(chuàng)建了應(yīng)用程序,我們需要正確的定義DDR內(nèi)存的映射地址,因?yàn)槌绦驅(qū)倪@些地址開(kāi)始執(zhí)行。我們需要編輯鏈接腳本,如下圖所示顯示除了DDR內(nèi)存的基地址和大小。這一步很重要,如果我們不能正確的為Core 0和 Core 1定義內(nèi)存地址和大小,在程序執(zhí)行的過(guò)程中就會(huì)產(chǎn)生內(nèi)核間的沖突,出現(xiàn)段地址錯(cuò)誤。
現(xiàn)在我們就可以編寫(xiě)Core 0執(zhí)行程序的代碼了。這部分是AMP 系統(tǒng)的核心,它將從Core 1開(kāi)始執(zhí)行程序代碼。我們要在應(yīng)用程序代碼中包含以下部分代碼。這部分代碼禁止了Zynq SoC片上存儲(chǔ)的緩存功能,定義了Core 1的起始地址,這個(gè)地址是Core 1的內(nèi)存映射地址范圍之內(nèi)的,具體可以查看先前定義的鏈接腳本。一旦Core 0 執(zhí)行Set Event(SEV)命令,就會(huì)讓Core 1開(kāi)始執(zhí)行它負(fù)責(zé)的程序代碼。
下一步是要為Core 1創(chuàng)建BSP文件,我們將使用修改過(guò)的standalone OS模板(standalone_amp),這個(gè)模板禁止了PS部分的監(jiān)聽(tīng)控制單元(SCU)的重復(fù)初始化。因此,我們不能允許自動(dòng)生成BSP文件,這與Core 0的操作是有區(qū)別的。還有就是確認(rèn)在CPU的選擇項(xiàng)中選擇的是Core 1。
既然我們已經(jīng)為Core 1創(chuàng)建了BSP文件,但是在我們編寫(xiě)Core 1執(zhí)行的應(yīng)用程序代碼之前,我們要修改BSP的一些設(shè)置,這一步非常簡(jiǎn)單,需要在驅(qū)動(dòng)配置對(duì)話(huà)框中增加一個(gè)額外的編譯標(biāo)志---–DUSE_AMP=1,具體操作參照下圖:
完成以上這些操作后,我們就可以為Core 1創(chuàng)建應(yīng)用程序。按照下圖所示,確保處理器選擇的是Core 1,BSP選擇的是前面步驟中剛剛建立的amp_core1_bsp。
同樣我們還需要定義正確的DDR內(nèi)存映射地址,這個(gè)地址是Core 1程序執(zhí)行的映射地址,這些映射地址可以通過(guò)編輯Core 1的鏈接腳本文件獲得。
在這個(gè)應(yīng)用程序的代碼中,我們也要禁止片上存儲(chǔ)的緩存功能,因?yàn)樵诤竺娴牟┛椭?,我將介紹使用這部分內(nèi)存實(shí)現(xiàn)兩個(gè)處理器內(nèi)核之間的通信。
當(dāng)我們完成了應(yīng)用程序,并且編譯了整個(gè)工程,我們應(yīng)該擁有以下幾個(gè)文件:
AMP FSBL ELF
Core 0 ELF
Core 1 ELF
配置PL硬件部分的比特流(bit)文件
最后我們需要生成.bin格式的文件,可以讓Zynq SoC從我們所配置的內(nèi)存地址啟動(dòng)。我們同樣需要一個(gè).bif格式的文件,這個(gè)文件中定義了我們生成.bin格式文件的源文件和路徑信息,同時(shí)也規(guī)定了源文件的調(diào)用順序。
在這里我們將不使用SDK軟件中創(chuàng)建Zynq 啟動(dòng)鏡像的功能,我們將使用ISE命令和.bat批處理文件,這在XAPP 1079的designworkbootgen目錄下已經(jīng)為我們提供了。這個(gè)目錄下包含了bif格式的文件和cpu1_bootvec.bin文件,這些文件用來(lái)修改控制FSBL文件,防止它尋找并加載更多的應(yīng)用程序。
在生成bin格式文件之前,我們要將下圖中所示的三個(gè)ELF格式的文件拷貝到bootgen目錄下,編輯BIF格式的文件確保我們使用的elf格式的文件的名字是正確的。
現(xiàn)在我們可以打開(kāi)ISE Command Prompt,參照下圖輸入命令進(jìn)入到bootgen目錄,運(yùn)行createboot.bat批處理腳本,在bootgen目錄下就會(huì)生成我們所需要的boot.bin文件:
這個(gè)文件要被下載到Zynq SoC片上非易失性的存儲(chǔ)器件中,啟動(dòng)這個(gè)器件將會(huì)激活Zynq SoC片上的兩個(gè)處理器內(nèi)核,并且執(zhí)行它們各自的應(yīng)用程序。
評(píng)論