邢艷芳,朱金付,周曉梅
(1.中國(guó)傳媒大學(xué)南廣學(xué)院,江蘇 南京 211172;2.東南大學(xué),江蘇 南京 210000)
多核處理器主要包括兩種,即對(duì)稱多核處理器(symmetrical multi-core processors,SMP)和非對(duì)稱多核處理器(asymmetrical multi-core processors,AMP)。目前大部分通用多核處理器是SMP,各個(gè)CPU是平等的,共享操作系統(tǒng)、內(nèi)存和外設(shè)等資源,Windows和Linux都有比較成熟穩(wěn)定的任務(wù)調(diào)度算法。AMP大多是嵌入式多核處理器采用的架構(gòu),由一個(gè)主CPU控制系統(tǒng)運(yùn)行和資源分配,從CPU執(zhí)行主CPU的命令或者預(yù)定義任務(wù),其實(shí)時(shí)性比較強(qiáng),適合于一個(gè)CPU做任務(wù)調(diào)度,其他CPU各自獨(dú)立處理實(shí)時(shí)任務(wù),并通過(guò)共享內(nèi)存實(shí)現(xiàn)各個(gè)CPU之間的通信。AMP目前還沒(méi)有成熟的任務(wù)調(diào)度算法。
Zynq是Xilinx推出新的全可編程芯片[1-2],是以ARM為核心,以FPGA為可編程外設(shè)的一種全新架構(gòu)處理器,其ARM是由2個(gè)Cortex-A9 CPU組成的非對(duì)稱多核處理器系統(tǒng),目前對(duì)Zynq的應(yīng)用研究大都是基于單核處理器。文中提出在Zynq的CPU0上運(yùn)行一個(gè)裸機(jī)程序,由CPU0控制系統(tǒng)的初始化、共享資源和啟動(dòng)CPU1。CPU1啟動(dòng)后,同時(shí)也運(yùn)行一個(gè)裸機(jī)程序,通過(guò)共享OCM和CPU0通信,分時(shí)共享OLED,實(shí)時(shí)顯示CPU運(yùn)行的相關(guān)信息。
Zynq是一個(gè)FPGA做外設(shè)的A9雙核處理器,是一個(gè)可擴(kuò)展處理平臺(tái)。因此,它的啟動(dòng)流程與傳統(tǒng)的ARM處理器類似,和FPGA完全不同。Zynq的啟動(dòng)配置需要多個(gè)處理步驟,通常情況,需要包含以下三個(gè)階段[3-6]。
(1)階段0:在器件上電運(yùn)行后,處理器就自動(dòng)開(kāi)始Stage-0 Boot,即片內(nèi)BootROM中的代碼被執(zhí)行,上電復(fù)位或者熱復(fù)位后,處理器執(zhí)行的不可修改的代碼。
(2)階段1:在BootROM初始化CPU和一些外設(shè)后,讀取下一個(gè)階段所需的程序代碼FSBL,即first stage boot loader。它可以由用戶修改控制的代碼。
(3)階段2:這是用戶基于BSP的裸機(jī)程序,也可以是第二階段操作系統(tǒng)的啟動(dòng)引導(dǎo)程序。這個(gè)階段代碼完全是在用戶的控制下實(shí)現(xiàn)的。
CPU0作為主處理控制共享資源,如果CPU1需要控制一個(gè)共享資源,必須請(qǐng)求CPU0并讓CPU0控制資源。OCM被作為兩個(gè)CPU通信共享資源,相比DDR內(nèi)存,OCM具有非常高的性能和低延遲訪問(wèn)的特點(diǎn)。
CPU0和CPU1共享OLED外設(shè),并顯示相關(guān)運(yùn)行信息。CPU0和CPU1分時(shí)占用OLED資源,各占用5 s,相互之間通過(guò)OCM的0xFFFF0000地址作為共享內(nèi)存,進(jìn)行通信協(xié)調(diào)。當(dāng)0xFFFF0000中的內(nèi)容為0時(shí),OLED由CPU0占有,當(dāng)0xFFFF0000中的內(nèi)容為1時(shí),OLED由CPU1使用。OCM是片上內(nèi)存,訪問(wèn)速度比片外DDR快,因此,兩個(gè)CPU通信的實(shí)時(shí)性比較好。
Zynq是非對(duì)稱多核處理器系統(tǒng),CPU0和CPU1各自占用獨(dú)立的DDR空間,其中CPU0使用的地址空間為0x00100000到0x001FFFFF,而CPU1使用的地址空間為0x00200000到0x002FFFFF。
Zynq由PS+PL構(gòu)成,其中PS部分和普通的ARM芯片一樣,可以獨(dú)立使用;PL部分就是傳統(tǒng)意義的FPGA,可以方便定制外設(shè)電路IP,也可以進(jìn)行相關(guān)的算法設(shè)計(jì)。普通的ARM,外設(shè)是固定的;而Zynq硬件外設(shè)是不固定的,可以利用PL部分靈活地定制外設(shè)掛在PS上,這是Zynq最大的特點(diǎn),也是Zynq靈活性的一個(gè)重要表現(xiàn)。兩個(gè)應(yīng)用程序運(yùn)行在PS部分的Cortex-A9雙核處理器,因此,PS部分自帶的相關(guān)硬件使用Xilinx默認(rèn)配置即可,但雙核CPU運(yùn)行的相關(guān)信息需要在OLED上顯示[7-9],因此需要在PL部分定制一個(gè)OLED的IP核,通過(guò)AXI總線和PS進(jìn)行通信。在PS部分對(duì)OLED進(jìn)行驅(qū)動(dòng)設(shè)計(jì)和顯示設(shè)計(jì)。
Zynq的測(cè)試板ZedBoard上使用Inteltronic/Wisechip公司的OLED顯示模組UG-2832HSWEG04。這是一款單色被動(dòng)式顯示屏,分辨率為128*32,驅(qū)動(dòng)電路采用所羅門科技的SSD1306芯片。ZedBoard測(cè)試板使用的OLED采用SPI模式控制,使用的信號(hào)線和電源線有如下幾條:
RST(RES):硬復(fù)位OLED;
DC:命令/數(shù)據(jù)標(biāo)志(0,讀寫命令;1,讀寫數(shù)據(jù));
SCLK:串行時(shí)鐘線;
SDIN:串行數(shù)據(jù)線;
VDD:邏輯電路電源;
VBAT:DC/DC轉(zhuǎn)換電路電源。
在SPI模式下,每個(gè)數(shù)據(jù)長(zhǎng)度均為8位,在SCLK的上升沿,數(shù)據(jù)從SDIN移入到SSD1306,并且是高位在前的。
其硬件建構(gòu)框圖如圖1所示。
圖1 硬件設(shè)計(jì)圖
軟件設(shè)計(jì)部分包括CPU0應(yīng)用程序和CPU1應(yīng)用程序。CPU0上運(yùn)行裸機(jī)程序是主系統(tǒng),主要負(fù)責(zé)系統(tǒng)初始化、控制CPU1的啟動(dòng)、與CPU1的通信和在OLED上顯示信息。CPU1上運(yùn)行的裸機(jī)應(yīng)用程序主要負(fù)責(zé)與CPU0上運(yùn)行的程序通信、與CPU0共享OLED[10-13]。
FSBL總是運(yùn)行在CPU0上,這是上電復(fù)位后PS運(yùn)行的第一個(gè)軟件應(yīng)用程序。負(fù)責(zé)配置PL和將應(yīng)用程序ELF文件復(fù)制到DDR內(nèi)存。加載應(yīng)用程序到DDR內(nèi)存后,F(xiàn)SBL開(kāi)始執(zhí)行第一個(gè)被加載的應(yīng)用程序。FSBL加載完應(yīng)用程序后,跳轉(zhuǎn)到0x00100000處執(zhí)行CPU0程序。
CPU0里需配置MMU,關(guān)閉Cache,使OCM的物理地址為0xFFFF0000到0xFFFFFFFF和0x00000000到0x0002FFFF。
關(guān)閉Cache后,CPU0執(zhí)行SEV匯編指令,激活CPU1,CPU1到OCM的0xFFFFFFF0地址讀取其數(shù)值,即CPU1應(yīng)用程序的地址,CPU1應(yīng)用程序?qū)脑摰刂穲?zhí)行。
判斷共享內(nèi)存COM_VAL是否為0,如果不為0,將繼續(xù)等待判斷。如果為0,將在OLED上顯示相關(guān)信息,延時(shí)5 s,將COM_VAL設(shè)置為1,把OLED資源讓給CPU1使用。然后繼續(xù)判斷共享內(nèi)存COM_VAL是否為0,等待CPU1把OLED使用權(quán)讓給CPU0。
CPU0在DDR執(zhí)行的物理地址由鏈接腳本設(shè)置,將其運(yùn)行地址設(shè)置為0x00100000,鏈接腳本文件相關(guān)內(nèi)存地址設(shè)置見(jiàn)表1。
表1 CPU0內(nèi)存地址
CPU0程序流程如圖2所示。
圖2 CPU0程序流程
在AMP系統(tǒng)中,因?yàn)楦鰿PU獨(dú)立使用資源,所以CPU1里仍需要配置MMU,關(guān)閉Cache。激活CPU1后,將從DDR的0x00200000地址開(kāi)始執(zhí)行應(yīng)用程序。
在關(guān)閉Cache后,CPU1需等待CPU0將共享內(nèi)存設(shè)置為1,然后在OLED上顯示相關(guān)信息。延時(shí)等待后,清除共享內(nèi)存,將OLED讓給CPU0使用。
CPU1在DDR執(zhí)行的物理地址由鏈接腳本設(shè)置,將其運(yùn)行地址設(shè)置為0x00200000,鏈接腳本文件相關(guān)內(nèi)存地址設(shè)置見(jiàn)表2。
表2 CPU1內(nèi)存地址
CPU1程序流程如圖3所示。
圖3 CPU1程序流程
在完成軟硬件設(shè)計(jì)后,需要把軟件部分下載到DDR中運(yùn)行,把硬件比特流配置到Zynq的PL部分。通過(guò)Xilinx的BootGen工具,生成Zynq能識(shí)別的合法鏡像文件BOOT.BIN,其中包含F(xiàn)SBL文件、system.bit文件、CPU0文件和CPU1文件。將BOOT.BIN復(fù)制到SD卡,將測(cè)試板ZedBoard設(shè)置為SD卡啟動(dòng),啟動(dòng)ZedBoard后會(huì)看到OLED被CPU0和CPU1分時(shí)占用信息,如圖4所示。
圖4 實(shí)驗(yàn)結(jié)果
Zynq器件包括一個(gè)ARM雙核AMP處理器,通過(guò)
CPU0控制系統(tǒng)和啟動(dòng)CPU1,實(shí)現(xiàn)了兩個(gè)CPU同時(shí)運(yùn)行裸機(jī)程序,并通過(guò)OCM實(shí)現(xiàn)了兩個(gè)CPU的通信,經(jīng)過(guò)24小時(shí)不間斷測(cè)試,雙核運(yùn)行穩(wěn)定,解決了該處理器雙核同時(shí)運(yùn)行的問(wèn)題。
[1] 何 賓.Xilinx all programmable Zynq-7000SoC設(shè)計(jì)指南[M].北京:清華大學(xué)出版社,2013:384-391.
[2] 陸佳華,江 舟,馬 岷.嵌入式系統(tǒng)軟硬件協(xié)同設(shè)計(jì)實(shí)戰(zhàn)指南:基于Xilinx Zynq[M].北京:機(jī)械工業(yè)出版社,2013:17-18.
[3] 陸啟帥,陸彥婷,王 地.Xilinx Zynq SoC與嵌入式Linux設(shè)計(jì)實(shí)戰(zhàn)指南[M].北京:清華大學(xué)出版社,2014:138-152.
[4] 葉 棽,謝捷如.基于SoC和嵌入式Linux的數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2015,25(8):203-207.
[5] 肖靈芝,蒲 林,韓俊剛,等.異構(gòu)多核圖形處理器存儲(chǔ)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2013,39(5):38-40.
[6] 李金泉,王 東,胡文振,等.基于ZYNQ異構(gòu)多核處理器的人體動(dòng)作識(shí)別系統(tǒng)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2016,16(8):27-29.
[7] 邢艷芳,張延冬.基于Zynq的OLED驅(qū)動(dòng)設(shè)計(jì)[J].液晶與顯示,2014,29(2):224-228.
[8] 張 龍,馮 帥.基于ZYNQ的視頻圖像處理平臺(tái)的設(shè)計(jì)[J].計(jì)算機(jī)與數(shù)字工程,2016,44(12):2519-2523.
[9] WANG Jiannong,WANG Wei.The common data acquisition system based on Arm9[C]//Proceedings of international conference on electronic measurement &instruments.[s.l.]:IEEE,2011:324-327.
[10] STEVENS W R,RAGO S A.Advanced programming in the UNIX environment[M].[s.l.]:Addison-Wesley,2014.
[11] JONES M T.GNU/LINUX application programming[M].[s.l.]:Charles River Media,2008.
[12] 孟繁星.基于ZYNQ-7000的視頻圖像處理系統(tǒng)設(shè)計(jì)[J].信息通信,2015(8):60-62.
[13] Solomon-Systech Instruments.The datasheet of the SSD1322Solo-mon-Systech Instrument[R].Hong Kong:Solomon Systech Limit-ed,2008.