張朝元,邵高平,汪 洋
(信息工程大學(xué) 信息系統(tǒng)工程學(xué)院,河南 鄭州 450000)
基于Zynq-7000的嵌入式Linux移植
張朝元,邵高平,汪 洋
(信息工程大學(xué) 信息系統(tǒng)工程學(xué)院,河南 鄭州 450000)
針對Zynq-7000平臺在無操作系統(tǒng)情況下,開發(fā)應(yīng)用程序需對處理器硬件結(jié)構(gòu)有一定的了解,存在開發(fā)難度大的問題。從全可編程器件的角度提出了一種Vivado+SDK+Linux的嵌入式系統(tǒng)移植方法。構(gòu)建了基于Zynq-7000的Linux系統(tǒng)移植環(huán)境,生成Linux鏡像并進行系統(tǒng)啟動。結(jié)果表明,該方法提升了系統(tǒng)靈活性,降低了應(yīng)用開發(fā)難度。
Zynq-7000;嵌入式Linux;U-boot;全可編程SoC
隨著全可編程SoC容量和性能的不斷提高,全可編程技術(shù)在通信、汽車電子、機器學(xué)習(xí)等領(lǐng)域得到了廣泛的應(yīng)用[1]。Zynq-7000全可編程SoC以FPGA為基礎(chǔ),將雙核的ARM Cortex-A9處理器(Processing System,PS)和可編程邏輯(Programmable Logic,PL)集成在單個芯片中,使得嵌入式系統(tǒng)的設(shè)計結(jié)構(gòu)更加靈活,體積顯著縮小,系統(tǒng)整體性能明顯提高[2-4]。同時,設(shè)計的復(fù)雜度也不斷提高。
傳統(tǒng)的嵌入式Linux系統(tǒng)移植主要是針對SoC產(chǎn)品[5],已經(jīng)不能夠遷移到全可編程SoC上。本文提出一種基于Zynq-7000的嵌入式Linux系統(tǒng)的移植方法,針對不同的應(yīng)用,進行靈活的硬件配置和Linux內(nèi)核裁剪,定制嵌入式系統(tǒng),提升系統(tǒng)靈活性。降低在PS部分開發(fā)應(yīng)用的難度。
硬件平臺環(huán)境如圖1所示,平臺核心處理器采用Zynq-702全可編程SoC,PS部分的每個Cortex-A9處理器都有一個高性能、低功耗的內(nèi)核,支持虛擬內(nèi)存,Linux系統(tǒng)的移植主要圍繞這部分展開;內(nèi)部總線AXI[6]為PS與PL的數(shù)據(jù)交互提供高速的鏈路接口;PL部分是Xilinx的7系列FPGA,提供硬件加速和靈活的可擴展的能力[7-8];板卡外圍配置DDR3高速緩存、SD卡、Flash存儲及串口、JTAG等接口,提升系統(tǒng)整體性能,同時為系統(tǒng)的啟動和調(diào)試提供硬件接口。
圖1 硬件系統(tǒng)框圖
基于SoC的嵌入式Linux系統(tǒng)移植方法是修改和移植Bootloader引導(dǎo)程序(通常是U-boot[9]),編譯Linux內(nèi)核,生成內(nèi)核鏡像,制作文件系統(tǒng),然后燒寫到板子上進行啟動。在Zynq-7000上移植Linux操作系統(tǒng)要相對復(fù)雜,圖2所示為移植Linux到Zynq-7000的原理框圖。系統(tǒng)硬件設(shè)計作為Linux系統(tǒng)運行的基礎(chǔ),主要完成PS部分的硬件配置和針對特定應(yīng)用的PL邏輯的開發(fā),生成硬件配置bit文件。系統(tǒng)軟件開發(fā)是Linux系統(tǒng)移植的核心,主要完成U-boot、Linux內(nèi)核、設(shè)備樹和文件系統(tǒng)的編譯,第一階段啟動程序(First Stage Boot Loader,F(xiàn)SBL)的生成,創(chuàng)建啟動鏡像文件。
圖2 嵌入式Linux系統(tǒng)移植原理框圖
PS處理器部分集成的控制器和大量的外設(shè)具有硬件可編程特性,移植操作系統(tǒng)或者開發(fā)裸跑程序之前,都需在Vivado中對控制器和外設(shè)進行選擇配置,生成硬件配置bit文件。圖3為PS部分提供的所有IO和存儲控制器。根據(jù)Linux啟動要求,配置SD卡、Flash,這是系統(tǒng)啟動的兩種方式;配置串口控制器[10-11](UART),串口是Linux系統(tǒng)在板卡上啟動后,用戶和平臺進行數(shù)據(jù)交互的通道。配置外部存儲器DDR3,選擇和平臺上DDR3一致的型號,否則系統(tǒng)將無法正常啟動。這是不針對確定應(yīng)用的前提下,確保Linux在平臺上正常啟動的最少配置。此外,PL可編程邏輯可進行自定義接口開發(fā),滿足不同的應(yīng)用需求。
圖3 PS部分可編程外設(shè)結(jié)構(gòu)圖
將生成的硬件bit文件導(dǎo)入到SDK中,在SDK中可根據(jù)bit文件自動生成FSBL。FSBL與Zynq-7000的啟動密切相關(guān),系統(tǒng)上電后自動執(zhí)行片內(nèi)BootROM中的代碼,根據(jù)外部啟動引腳配置從外部存儲器引導(dǎo)FSBL到內(nèi)存。FSBL根據(jù)硬件配置bit文件對PS部分進行初始化,配置PL邏輯部分,加載第二階段引導(dǎo)程序(Second Stage Boot Loader,SSBL)或者裸跑程序到內(nèi)存空間,文中設(shè)計為加載U-boot。因此,F(xiàn)SBL是U-boot的引導(dǎo)程序,U-boot又作為Linux內(nèi)核的引導(dǎo)程序。
(1)編譯U-boot。U-boot是在操作系統(tǒng)運行之前執(zhí)行的一小段程序[12]。其主要任務(wù)是將Linux系統(tǒng)和硬件平臺銜接在一起,通過初始化硬件設(shè)備、建立內(nèi)存空間映射,建立正確的系統(tǒng)運行環(huán)境,引導(dǎo)Linux系統(tǒng)到內(nèi)存。本文使用Ubuntu-14.04-i386桌面系統(tǒng),交叉編譯工具是Xilinx網(wǎng)站上提供的gcc,文件名為xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin,U-boot版本為u-boot-v2016.03。Ubuntu系統(tǒng)下,進入U-boot文件夾,刪除和Zynq-7000無關(guān)的處理器架構(gòu)源碼和其它開發(fā)板源碼,輸入make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_702_defconfig命令,生成Makefile文件。Makefile定義了U-boot和Linux內(nèi)核的編譯規(guī)則,執(zhí)行編譯命令CROSS_COMPILE=arm -xilinx-linux-gnueabi-,生成u-boot.elf文件;
(2)編譯Linux內(nèi)核。Linux內(nèi)核是操作系統(tǒng)的核心,U-boot加載Linux鏡像的部分內(nèi)核到內(nèi)存后,將控制權(quán)交給這部分內(nèi)核,隨后Linux會將剩余的代碼加載到內(nèi)存,并對所有設(shè)備進行初始化,建立數(shù)據(jù)結(jié)構(gòu),最后內(nèi)核會啟動init進程[13],根據(jù)配置文件加載文件系統(tǒng),完成系統(tǒng)啟動。Linux內(nèi)核選用Linux-v4.0版本,進入內(nèi)核目錄,在xilinx_zynq_defconfig文件下修改處理器架構(gòu)ARCH=arm,交叉編譯工具改為本文安裝的gcc,保留平臺上的串口、SD卡、Flash等信息,刪除不用的多余接口,使編譯的內(nèi)核更加精煉。在命令行輸入make ARCH=arm CROSS_COMPILE= arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig,生成Makefile文件。輸入make ARCH=arm CROSS_COMPILE =arm-xilinx-linux-gnueabi-命令進行內(nèi)核編譯,生成 Linux內(nèi)核鏡像zImage;
(3)建立設(shè)備樹文件。設(shè)備樹文件為U-boot和Linux內(nèi)核之間提供了一個動態(tài)的接口,降低了內(nèi)核對系統(tǒng)硬件的嚴重依賴,提高代碼的重用率,使內(nèi)核的設(shè)計和編譯更為簡單。設(shè)備樹文件由zynq-7000.dts文件生成。該文件在SDK中和FSBL一起生成,通過dtc -O dtb -I dts -o devicetree.dtb zynq-7000.dts[14]命令,生成devicetree.dtb;
(4)生成文件系統(tǒng)。文件系統(tǒng)為操作系統(tǒng)提供在儲存設(shè)備上存儲數(shù)據(jù)的方法。文件系統(tǒng)采用Xilinx網(wǎng)站上提供的amdisk.image.gz文件,通過mkimage -A arm -T ramdisk -C gzip damdisk.image.gz uramdisk.image.gz命令生成。
通過以上分析,嵌入式Linux系統(tǒng)在Zynq-7000上的啟動整個過程是:系統(tǒng)上電后,加載FSBL到內(nèi)存,完成PS處理器部分的初始化,根據(jù)bit文件配置PL邏輯,引導(dǎo)U-boot到內(nèi)核,U-boot完成硬件初始化,引導(dǎo)Linux內(nèi)核到內(nèi)存,通過設(shè)備樹文件將硬件設(shè)備樹信息傳遞給內(nèi)核,最后把控制權(quán)交給Linux系統(tǒng)內(nèi)核。Linux系統(tǒng)初始化所有設(shè)備,加載文件系統(tǒng),完成系統(tǒng)啟動。
在SDK中選擇Xilinx Tools下的Greate Zynq Boot Image工具,如圖4所示,依次按順序添加FSBL、硬件配置bit文件和編譯后的U-boot文件u-boot.elf3個文件,完成boot.bin鏡像文件的創(chuàng)建。
圖4 建立SD卡啟動鏡像BOOT.BIN
將生成的BOOT.BIN和編譯后的Linux內(nèi)核zImage、設(shè)備樹文件devicetree.dtb、文件系統(tǒng)uramdisk.image.gz拷貝到FAT格式的SD卡中,插入到Zynq-7000平臺,設(shè)置從SD卡方式啟動,連接好串口線,設(shè)置串口波特率為115 200,上電后在串口終端可以看到Linux系統(tǒng)的啟動信息。
為進一步驗證系統(tǒng)的正確性和靈活性,如圖5所示,在Linux PC機上編譯和鏈接OpenCV庫,開發(fā)基于OpenCV的圖像邊緣檢測代碼,將編譯后的可執(zhí)行代碼、源圖像和OpenCV庫拷貝到SD卡,掛載OpenCV庫到Zynq-702平臺的Linux系統(tǒng)/usr/lib目錄下,執(zhí)行檢測代碼,結(jié)果如圖6所示。實驗表明,在PS上運行Linux后,對于特定的應(yīng)用只需專注于C代碼的實現(xiàn)和相應(yīng)的庫函數(shù)的編譯,省去了在無操作系統(tǒng)情況下對硬件板級支持包的理解和修改,降低了二次開發(fā)的難度。此外,PL部分可通過SD卡的靈活插拔實現(xiàn)動態(tài)可重構(gòu)和部分動態(tài)可重構(gòu),雖然時間較長,但具有較好的靈活性。
圖5 OpenCV邊緣檢測流程
圖6 邊緣檢測效果圖
本文闡述了在Zynq-7000平臺上移植嵌入式Linux系統(tǒng)的方法和實現(xiàn)過程,降低了在PS上開發(fā)應(yīng)用的難度,并以圖像邊緣檢測為例驗證系統(tǒng)的正確性。但所選應(yīng)用沒有用到PL部分,未能體現(xiàn)軟硬件協(xié)同設(shè)計的優(yōu)勢,需進一步驗證。
[1] 陸佳華,江舟,馬岷.嵌入式系統(tǒng)軟硬件協(xié)同設(shè)計實戰(zhàn)指南[M].北京:機械工業(yè)出版社,2015.
[2] Xilinx Company.Zynq-7000 all programmable SoC technical reference manual[M].San Jose:Xilinx Company,2016.
[3] Xilinx Company.Zynq-7000 all programmable SoC overview[M].San Jose:Xilinx Company,2014.
[4] 楊曉安.基于Zynq-7000高速圖像采集與實時處理系統(tǒng)[J].電子科技,2014,27(7):151-154.
[5] 丁鵬仁.基于ZYNQ的軟件無線電平臺設(shè)計與實現(xiàn)[D].北京:北京郵電大學(xué),2015.
[6] Crockett L H,Elliot R A,Enderwitz M A,et al.Embedded processing with the ARM Cortex-A9 on the Xilinx Zynq-7000 all programmable SoC[M].UK:Strathclyde Academic Media,2016.
[7] 何賓,張艷輝.Xilinx Zynq-7000嵌入式系統(tǒng)設(shè)計與實現(xiàn)[M].北京:電子工業(yè)出版社,2016.
[8] 陸啟帥,陸彥婷,王地.Xilinx Zynq SoC與嵌入式Linux設(shè)計實戰(zhàn)指南[M].北京:清華大學(xué)出版社,2014.
[9] 武杰.基于ARM9的嵌入式Linux移植[J].自動化技術(shù)與應(yīng)用,2014,33(3):38-40.
[10] 夏柯.基于ZYNQ-7000 DMA控制器的UART數(shù)據(jù)傳輸?shù)脑O(shè)計與實現(xiàn)[J].信息系統(tǒng)工程,2014,9(20):113-114.
[11] 黨俊博,李哲,李雅俊.基于FPGA的串口通信電路設(shè)計與實現(xiàn)[J].電子科技,2016,29(7): 106-110.
[12] 金剛,吳軍,馬鵬,等.嵌入式Linux系統(tǒng)移植中SMP的實現(xiàn)研究[J].信息技術(shù),2016,10(8):93-96.
[13] 劉慧雙.Linux實時操作系統(tǒng)定制及設(shè)備驅(qū)動開發(fā)[D].武漢:華中科技大學(xué),2013.
[14] William E,Shotts Jr.Linux命令行大全[M].郭光偉,郝記生,譯.北京:人民郵電出版社,2013.
The Transplanting of embedded Linux Based on Zynq-7000
ZHANG Chaoyuan,SHAO Gaoping,WANG Yang
(School of Information System Engineering,Information Engineering University,Zhengzhou 450000,China)
In order to develop the application program under the condition of no operating system, it is necessary to understand the hardware structure of the Zynq-7000 platform. From the point of all programmable devices, the article presents the embedded system portability method named Vivado+SDK+Linux, creates Linux system portability environment based on Zynq-7000, and generate Linux image which can start up system. The result indicates that the method improves the flexibility of the system and reduces the difficulty of application development.
Zynq-7000; embedded Linux; U-boot; all programmable SoC
2017- 03- 05
國家自然科學(xué)基金(61271101)
張朝元(1990-),男,碩士研究生。研究方向:電子系統(tǒng)設(shè)計。邵高平(1964-),男,教授。研究方向:電子系統(tǒng)設(shè)計。汪洋(1979-),男,副教授。研究方向:平臺技術(shù)。
TP316.81
A
1007-7820(2018)01-009-03