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