李鑫志 戈志華 劉向明
1(武漢工程大學(xué)機(jī)電工程學(xué)院 湖北 武漢 430073)2(深圳市深視智能科技有限公司 廣東 深圳 518102)
基于ARM平臺AMP架構(gòu)下從核重復(fù)加載設(shè)計(jì)與實(shí)現(xiàn)
李鑫志1,2戈志華2劉向明1
1(武漢工程大學(xué)機(jī)電工程學(xué)院 湖北 武漢 430073)2(深圳市深視智能科技有限公司 廣東 深圳 518102)
針對工業(yè)智能相機(jī)在不同工作場景的需求以及在二次開發(fā)方面的諸多不便,通過重點(diǎn)研究和分析基于多核ARM平臺的AMP架構(gòu)下主從核的啟動(dòng)機(jī)制,提出一種用戶態(tài)從核重復(fù)加載方案,豐富了開發(fā)者解決實(shí)際工程問題的手段。以Zynq-7000為硬件平臺,在雙核Cortex-A9處理器上分別配置嵌入式Linux系統(tǒng)和Bare-Metal環(huán)境,實(shí)現(xiàn)了主核對從核的復(fù)位和重新喚醒控制和不同從核任務(wù)程序的自由切換,對工程應(yīng)用有積極的參考價(jià)值。
ARM AMP架構(gòu) 從核重復(fù)加載 嵌入式Linux系統(tǒng) Bare-Metal環(huán)境
隨著嵌入式技術(shù)應(yīng)用領(lǐng)域的日益廣泛和復(fù)雜,其對處理器性能、功耗等提出了更高的要求,越來越多的嵌入式應(yīng)用采用多核處理器作為其硬件開發(fā)平臺。多核并行計(jì)算技術(shù)[1]作為當(dāng)前計(jì)算機(jī)系統(tǒng)提高處理能力、減小體積、降低功耗的主要方式,是未來嵌入式計(jì)算技術(shù)發(fā)展的主要方向。在多核并行計(jì)算環(huán)境中,主要有 SMP、AMP和BMP 三種架構(gòu)[2-4]。對稱多處理SMP(Symmetric Multi-Processing)架構(gòu)所有的資源由多核操作系統(tǒng)負(fù)責(zé),所有的資源都是共享的,可由操作系統(tǒng)統(tǒng)一管理,在編程的時(shí)候要考慮到并行編程的技術(shù),不利于應(yīng)用程序的移植?;旌隙嗵幚鞡MP(Bound multiprocessing)架構(gòu),資源由操作系統(tǒng)統(tǒng)一管理,但是上層應(yīng)用可以指定運(yùn)行在某一個(gè)特定的核上。非對稱多處理AMP(Asymmetric Multi-Processing)架構(gòu)的特點(diǎn)是每個(gè)核都可以擁有自己專有的操作系統(tǒng),通過共享內(nèi)存和中斷實(shí)現(xiàn)核間通信。其中有一個(gè)主核,其余為從核,核間有序啟動(dòng)且互不干擾。主從核之間的關(guān)系如圖1所示。這樣可根據(jù)不同系統(tǒng)的性能分配不同任務(wù),具有更優(yōu)秀的能量效率。
圖1 主從核關(guān)系
Zynq-7000系列是Xilinx公司攜手ARM公司,于2012年推出的全可編程片上系統(tǒng)AP SoC(All Programmable System on Chip)[5]可擴(kuò)展的處理平臺,采用微處理器加可編程邏輯(ARM+FPGA)的結(jié)構(gòu),并搭載雙核Cortex-A9處理器。本文采用Zynq-7000系列可擴(kuò)展的處理平臺EPP(Extensible Processing Platform)[6]為硬件平臺,在主核中搭建Linux操作系統(tǒng)(CPU0),從核(CPU1)設(shè)計(jì)為以Bare-Metal方式運(yùn)行。CPU1的作用是高速計(jì)算,計(jì)算數(shù)據(jù)和結(jié)果通過共享內(nèi)存與CPU0交流。CPU0的主要作用是提供人機(jī)交互界面,并控制CPU1的運(yùn)行。
1.1 主核(CPU0)啟動(dòng)
Zynq支持兩種啟動(dòng)模式[7]:安全模式和非安全模式。在安全模式模式下,可以根據(jù)PS端配置不同選擇從Quad-SPI Flash、Nand Flash、NOR Flash或SD卡啟動(dòng);在非安全模式模式下,可以使用JTAG啟動(dòng)作為主要啟動(dòng)方式。CPU0的啟動(dòng)可以概要地描述為三個(gè)階段,分別是:
階段0:BootROM
階段1:First Stage Boot Loader (FSBL)
階段2:Second Stage Boot Loader (SSBL)
BootROM階段控制著Zynq 7000芯片的整個(gè)初始化過程。BootROM中的代碼主要對片上系統(tǒng)SoC(System on Chip)中的NOR, Quad-SPI, NAND, SD與基本外設(shè)控制器進(jìn)行初始化,使得ARM核可以訪問并使用這些外圍設(shè)備,它還負(fù)責(zé)加載階段1中的FSBL程序,將系統(tǒng)的控制權(quán)移交給FSBL繼續(xù)執(zhí)行。本文設(shè)計(jì)是從主頻200 MHz 32 MB Quad-SPI Flash中啟動(dòng)。
第一階段的初始啟動(dòng)引導(dǎo)程序FSBL(First Stage Boot Loader),是在BootROM之后啟動(dòng)引導(dǎo)過程,由Boot ROM將其加載到片上存儲(chǔ)器OCM(On-Chip Memory)或直接在NOR Flash上運(yùn)行。FSBL主要完成以下幾項(xiàng)工作:1) 根據(jù)XPS中的配置,完成PS端的初始化;2) 使用比特流文件對PL進(jìn)行配置;3) 加載CPU1程序;4) 加載階段2段引導(dǎo)程序到內(nèi)存中,并跳轉(zhuǎn)到SSBL上進(jìn)行執(zhí)行程序。
第二階段是SSBL階段。對于運(yùn)行在Zynq平臺的Linux 系統(tǒng)而言,SSBL階段就是U-Boot過程。它的作用是完成Linux內(nèi)核啟動(dòng)之前所需的全部初始化工作,例如DDR控制器、NAND Flash控制器、SPI控制器等,并且支持從本地或網(wǎng)絡(luò)中加載Linux內(nèi)核、Device Tree文件以及根文件系統(tǒng)到內(nèi)存中。
啟動(dòng)流程如圖2所示。
圖2 啟動(dòng)流程圖
1.2 從核(CPU1)啟動(dòng)
在主核啟動(dòng)的FSBL階段,會(huì)完成CPU1程序的加載。加載過程中拷貝cpu1_bootvec.bin文件到boot.bif文件中所指向([load = 0xFFFFFFF0]D:lxz ftpcpu1_bootvec.bin)的地址。cpu1_bootvec.bin文件中的內(nèi)容是一段循環(huán)執(zhí)行代碼的入口地址(0xFFFFFF2C)??梢栽赬MD中通過命令①:
① XMD% connect arm hw -debugdevice cpunr 2
② XMD% mrd 0xffffff2c 0x10
③ XMD% rrd
連接到CPU1,通過命令②查看從0xFFFFFF2C位置開始的循環(huán)執(zhí)行代碼的內(nèi)容,如下:
FFFFFF2C: F57FF04F
FFFFFF30: E320F002
FFFFFF34: E3E0000F
FFFFFF38: E590E000
FFFFFF3C: E37E00D4
FFFFFF40: 0AFFFFF9
FFFFFF44: EE070F15
FFFFFF48: EE070FD5
FFFFFF4C: EE080F17
FFFFFF50: E3A04000
FFFFFF54: EE014F18
FFFFFF58: E12FFF1E
循環(huán)執(zhí)行的匯編代碼在這里已經(jīng)被編譯成16個(gè)4字節(jié)的十六進(jìn)制指令。當(dāng)CPU1上電后會(huì)運(yùn)行這段循環(huán)代碼,代碼的功能是自動(dòng)檢查地址0xFFFFFFF0處的值。也可以通過命令③查看此時(shí)PC的值為0x00000000。
在AMP架構(gòu)的情況下,Linux可以通過remotproc模塊動(dòng)態(tài)加載從核CPU1。這種方案需要先將remotproc模塊安裝到Linux內(nèi)核,或者動(dòng)態(tài)加載到內(nèi)核,這樣不利于開發(fā)者對CPU1的控制。而且remotproc模塊本身也存在著諸多不穩(wěn)定的因素。對比該方案,本文提出一種用戶態(tài)從核加載方案。
該方案的原理是,當(dāng)CPU0中Linux系統(tǒng)運(yùn)行時(shí),向系統(tǒng)級控制寄存器SLCR(System Level Control Registers)中的復(fù)位控制寄存器CPU_RCC(CPU Reset and Clock Control)發(fā)送命令復(fù)位CPU1,然后CPU0將CPU1要運(yùn)行的新程序加載到DDR中相應(yīng)位置,這一步在CPU0的代碼中實(shí)現(xiàn)。然后重新喚醒CPU1。
由于CPU1在復(fù)位后會(huì)對CPU1復(fù)位時(shí)所有通用寄存器都將被清零,所以此時(shí)PC是指向0地址的。提前將CPU1的循環(huán)執(zhí)行代碼拷貝到0地址處,當(dāng)CPU1重新運(yùn)行起來后就開始執(zhí)行循環(huán)代碼,并檢查地址0xFFFFFFF0的值是否為0,不為0即說明該處被寫入了一個(gè)地址,此時(shí)CPU1就會(huì)跳轉(zhuǎn)到被寫入的地址處執(zhí)行。基于這種CPU0喚醒CPU1的機(jī)制,可以實(shí)現(xiàn)在用戶態(tài)下從核的加載。方案的具體步驟如下:
1) 在CPU1運(yùn)行時(shí),CPU0對其復(fù)位;
2) CPU0將CPU1要運(yùn)行的新程序加載到DDR中;
3) CPU0重新啟動(dòng)CPU1。
重復(fù)以上三個(gè)步驟就可以完成在用戶態(tài)從核重復(fù)加載的目的。方案的流程如圖3所示。
圖3 從核重復(fù)加載
從圖3中不難看出,在CPU0與CPU1間完成幾次簡單的通信可以就實(shí)現(xiàn)從核重復(fù)加載,這使得開發(fā)者可以更加簡便、靈活地解決實(shí)際工程中的相關(guān)問題。
實(shí)驗(yàn)的目的是通過主核(CPU0)控制從核(CPU1)完成重復(fù)加載,并先后執(zhí)行Binarization.elf和RotatingCalipersal.elf兩個(gè)圖像處理的CPU1程序。Binarization.elf的功能是對圖像進(jìn)行二值化處理,RotatingCalipersal.elf的功能是利用旋轉(zhuǎn)卡殼算法提取圖像中的圓。
3.1 CPU1復(fù)位
首先,在CPU1運(yùn)行時(shí),CPU0是通過調(diào)用CPU1控制函數(shù)對其進(jìn)行復(fù)位??刂坪瘮?shù)實(shí)現(xiàn)如下:
#include
#define SYSTEM _REG_SIZE 0x1000
#define SYSTEM _REG_BASSADRESS 0xF8000000
#define SYSTEM _RELATIVE_OFFSET 0x00000244
/*CPU1控制函數(shù)實(shí)現(xiàn)*/
void Function_Ctrl_Cpu1 (unsigned int reg_value){
int rwmem_fd = -1;
unsigned int *gp_CPU_reset_vaddr = NULL;
rwmem_fd = open("/dev/rwmem", O_RDWR | O_SYNC);
gp_CPU_reset_vaddr = (unsigned int *)mmap(0, SYSTEM
_REG_SIZE,
//映射虛擬地址
PROT_READ|PROT_WRITE, MAP_SHARED,
rwmem_fd, SYSTEM _REG_BASSADRESS);
unsigned int base_addr = (unsigned nt)(gp_CPU_reset_vaddr);
(*(volatile unsigned int*)(base_addr+SYSTEM_RELATIVE
_OFFSET)) = reg_value;
}
參考Zynq-7000 All Programmable SoC Technical Reference Manual中系統(tǒng)級控制寄存器的CPU1復(fù)位控制寄存器,如表1所示。向寄存器A9_CPU_RST_CTRL(絕對地址:0xF8000244)寫入值0x22。
表1 Register A9_CPU_RST_CTRL(部分)[7]
于是調(diào)用CPU1控制函數(shù)如下:
Function_Ctrl_Cpu1 (0x22);
//關(guān)閉CPU1時(shí)鐘,復(fù)位CPU1
3.2 加載bin文件
方案是先將elf文件轉(zhuǎn)編譯成一個(gè)bin文件然后再加載到DDR中。在bin文件中沒有任何段表信息,只需在編譯bin文件時(shí)配置文件入口地址。這樣就將原本只能在內(nèi)核中完成的從核加載轉(zhuǎn)化成bin可執(zhí)行文件的用戶態(tài)從核加載。
通過編譯工具鏈中的objcopy工具將Binarization.elf文件和RotatingCalipersal.elf文件編譯成bin文件,執(zhí)行如下命令:
④ [root@localhost]#arm-none-linux-gnueabi-objcopy -O
binary Binarization.elf Binarization .bin
⑤ [root@localhost]#arm-none-linux-gnueabi-objcopy-O
binary RotatingCalipersal.elf RotatingCalipersal.bin
在Xilinx SDK[8]里面通過修改lscript.ld中text段的內(nèi)存區(qū)域?qū)傩孕薷某绦蛉肟诘刂?,此處配置Binarization.bin文件的入口地址為0x10200000。
3.3 重新啟動(dòng)CPU1
加載Binarization.bin文件成功后,通過兩次調(diào)用上述CPU1控制函數(shù),分別將CPU1的時(shí)鐘開啟以及重新喚醒CPU1:
Function_Ctrl_Cpu1 (0x20);
//時(shí)鐘恢復(fù)
Function_Ctrl_Cpu1 (0x0);
//重新喚醒CPU1
在CPU1復(fù)位后,所有通用寄存器都被清零,PC指向0地址。將CPU1的循環(huán)執(zhí)行代碼提前拷貝到0地址處, CPU1復(fù)位后就開始執(zhí)行這段代碼,循環(huán)檢查地址0xFFFFFFF0處的值。經(jīng)過上述第二步操作,此時(shí)地址0xFFFFFFF0處值已經(jīng)是0x10200000,即Binarization.bin文件的入口地址。于是CPU1跳轉(zhuǎn)到Binarization.bin文件入口地址開始運(yùn)行該可執(zhí)行文件。同理,重復(fù)步驟1)-步驟3),并將可執(zhí)行文件RotatingCalipersal.bin的入口地址寫到地址0xFFFFFFF0。如此便實(shí)現(xiàn)了在用戶態(tài)下對從核的重復(fù)加載。實(shí)驗(yàn)結(jié)果如圖4所示。其中圖4(a)為處理前圖像,圖4(b)為二值化處理后圖像,圖4(c)為原提取圖像。
圖4 實(shí)驗(yàn)結(jié)果
本文在Zynq-7000為平臺上,詳細(xì)分析了CPU0和CPU1的啟動(dòng)過程,并利用這種啟動(dòng)機(jī)制,提出了一種在用戶態(tài)下從核重復(fù)加載方案。方案的特點(diǎn)是開發(fā)者可以靈活地在用戶態(tài)下復(fù)位和喚醒CPU1。將CPU1的任務(wù)程序以bin文件的形式提前加載到DDR中,當(dāng)需要切換時(shí)只需加載相應(yīng)bin文件的入口地址到指定地址即可。通過實(shí)驗(yàn)證明此方案是行之有效且穩(wěn)定可靠的。
[1] 張林波, 遲學(xué)斌, 莫?jiǎng)t堯, 等. 并行計(jì)算導(dǎo)論[M]. 北京:清華大學(xué)出版社, 2006.
[2] Freescale Semiconductor Inc. Running AMP, SMP or BMP Mode for Multicore Embedded Systems[M].USA: Freescale Semiconductor Inc, 2014.
[3] 蔣建軍, 劉彤. 一種AMP架構(gòu)下的處理器負(fù)載均衡改進(jìn)方法[J]. 山東農(nóng)業(yè)大學(xué)學(xué)報(bào)(自然科學(xué)版), 2015 ,46(1):96-100.
[4] 肖學(xué)甲. 基于AMP架構(gòu)的多核間任務(wù)同步與通信的設(shè)計(jì)與實(shí)現(xiàn)[D]. 西安:西安電子科技大學(xué), 2011.
[5] 何賓. Xilinx All Programmable Zynq-7000 SoC設(shè)計(jì)指南[M]. 北京:清華大學(xué)出版社, 2013.
[6] Xilinx Inc. Zynq-7000 Extensible Processing Platform Summary[OL]. http://www.xilinx.com/support.html.
[7] Xilinx Inc. Zynq-7000 All Programmable SoC Technical Reference Manual[OL]. https://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf.
[8] Xilinx Inc. Xilinx Design Tools: Installation and Licensing Guide[OL]. http://www.xilinx.com/support.html.
DESIGN AND IMPLEMENTATION OF SALVE PROCESSOR RELOAD UNDER AMP ARCHITECTURE BASED ON ARM PLATFORM
Li Xinzhi1,2Ge Zhihua2Liu Xiangming1
1(SchoolofMechanicalandElectricalEngineering,WuhanInstituteofTechnology,Wuhan430073,Hubei,China)2(ShenzhenSincevisionTechnologyCo.,Ltd.,Shenzhen518102,Guangdong,China)
Aiming at the need of industrial smart cameras under different working scenes and the inconvenience during secondary development, a user-mode scheme of slave processor reload is proposed through studying and analyzing the booting mechanism of host-slave processor under AMP architecture based on multi-core ARM platform, enriching the approaches for developers to solve practical engineering problems. Choosing Zynq-7000 as hardware platform, then the embedded Linux system and Bare-Metal environment are deployed separately on the part of dual-core processor Cortex-A9. The host processor is able to control the slave processor to reset and re-wakeup, and switch different bare-metal program freely, which has high reference value in engineering applications.
ARM AMP architecture Slave processor reload Embedded Linux system Bare-Metal environment
2015-12-03。李鑫志,碩士生,主研領(lǐng)域:機(jī)器視覺在工程中的應(yīng)用。戈志華,碩士。劉向明,教授。
TP3
A
10.3969/j.issn.1000-386x.2017.01.040