魏方正,施 展
(上海理工大學(xué) 光電信息與計算機(jī)工程學(xué)院,上海 200093)
?
基于ICE仿真器和OpenOCD平臺的UBoot加載實現(xiàn)
魏方正,施 展
(上海理工大學(xué) 光電信息與計算機(jī)工程學(xué)院,上海 200093)
嵌入式開發(fā)在各個階段對系統(tǒng)開發(fā)環(huán)境均有較高的要求,目前在嵌入式開發(fā)過程中趨向于開發(fā)周期短,開發(fā)效率高的模式。針對開發(fā)環(huán)境軟硬件搭建問題,文中在基于Linux操作系統(tǒng)的開發(fā)環(huán)境下,給出了一種加載UBoot的平臺構(gòu)建方案,并對方案中關(guān)鍵部分做了詳細(xì)介紹。通過此平臺實現(xiàn)了對UBoot進(jìn)行快速高效的加載。
嵌入式開發(fā)平臺;UBoot;加載
目前嵌入式系統(tǒng)技術(shù)主要應(yīng)用在包括電子產(chǎn)品、交通管理、工業(yè)控制、機(jī)器人等多個領(lǐng)域。具有多功能、靈活性、安全性、低開發(fā)成本等優(yōu)點。
本文基于Linux操作系統(tǒng)的開發(fā)環(huán)境下進(jìn)行的,全部操作均是在命令行下進(jìn)行,因此需要開發(fā)者對Linux系統(tǒng)的基本操作和工作原理有一定的了解。通過對UBoot的燒錄來了解嵌入式開發(fā)環(huán)境的建立和開發(fā)的過程,從而給出一個高效快速簡單的UBoot的燒錄模式。
UBoot(Universal Bootloade,通用引導(dǎo)加載程序)是遵循GPL條款的開源軟件項目[1]。UBoot源碼基本均是Linux內(nèi)核源程序的簡化,其目錄框架、編譯形式都是從Linux演化而來的,支持NFS掛載,同時支持多種版本的Linux操作系統(tǒng)。UBoot本身就是在操作系統(tǒng)內(nèi)核運行之前運行的一段程序,其是開發(fā)板上電后運行的第一段代碼,功能和PC機(jī)中的BIOS程序類似。通過這段程序可完成硬件設(shè)備的初始化,并建立內(nèi)存空間的映射關(guān)系,從而將系統(tǒng)的軟硬件環(huán)境設(shè)置成一個合適的工作狀態(tài),為加載操作系統(tǒng)內(nèi)核做好準(zhǔn)備[2]。嵌入式系統(tǒng)中UBoot所有的運行方式主要有兩種:分別對應(yīng)于嵌入式系統(tǒng)產(chǎn)品階段和開發(fā)階段的運行,也是嵌入式系統(tǒng)開發(fā)階段必要的輔助手段[1]。UBoot經(jīng)過編譯后會生成u-boot.bin、u-boot.ldr、u-boot.srec等格式的文件。在此要用到的是u-boot.ldr格式文件以及編譯產(chǎn)生的UBoot可執(zhí)行代碼。
由于目標(biāo)板的內(nèi)存資源有限,通常在開發(fā)過程中,首先在一臺計算機(jī)上進(jìn)行開發(fā)環(huán)境的搭建包括建立交叉編譯工具鏈,編譯和調(diào)試程序[3]。在主機(jī)上編譯生成所要求的可執(zhí)行程序和其他所需文件。調(diào)試時將主機(jī)通過并串口和網(wǎng)絡(luò)連接,借助通信協(xié)議將可執(zhí)行代碼下載到目標(biāo)板Flash的指定地址處。
開發(fā)板是硬件環(huán)境中最主要的設(shè)備,這里采用SC58X系列開發(fā)板,其是一款基于ARM cortex處理器的開發(fā)板,具有超高集成度、低功耗的特點,接口包括常用的以太網(wǎng)接口、高速USB接口包括USB OTG, USB HS, UART,此外還有移動存儲SD卡槽、CAN和音頻選項接口。此開發(fā)板支持高速JTAG仿真器(ICE-1000/2000),便于開發(fā)、測試和調(diào)試高級應(yīng)用程序,這些硬件配置可幫助打造出靈活而精簡的系統(tǒng)設(shè)計。
圖1 開發(fā)系統(tǒng)框圖
OpenOCD是一種開源的調(diào)試源碼,支持當(dāng)前主流的處理器,尤其是對ARM的支持較多。OpenOCD能支持各種商用的JTAG硬件接口,支持并口JTAG調(diào)試和USB高速JTAG調(diào)試,其與GDB一起對源碼級遠(yuǎn)程調(diào)試,支持Telent命令行界面調(diào)試[4]。在調(diào)試過程中OpenOCD充當(dāng)調(diào)試的守護(hù)進(jìn)程始終保持運行,起到監(jiān)測的作用。
軟硬件結(jié)合的實現(xiàn)方式雖一定程度上增加硬件復(fù)雜度,但其功能強大分析結(jié)果也更為精確[5]。OpenOCD與ICE硬件調(diào)試器二者結(jié)合使用即能遠(yuǎn)程調(diào)試又能實現(xiàn)對處理器的仿真調(diào)試。將仿真器功能作用范圍擴(kuò)大。由此在保證實現(xiàn)調(diào)試功能正常的同時還最大程度地保護(hù)了處理器數(shù)據(jù)通路的獨立性,將對目標(biāo)板處理器芯片的損害幾率降到最低水平[6]。主機(jī)OpenOCD的安裝配置流程:
(1)運行源碼目錄下的bootstrap,命令如下:
$ cd openocd ,$ ./bootstrap
此目錄下將生成一些autotool文件和配置文件,以及jimtcl模塊;
(2)配置并指定安裝路徑 :
$./configure-prefix=/install/path-enable-ft2232_libftdi-enable-ice-1000-enable-maintainer-mode;
(3)編譯安裝:$ make,$ make install;
(4)啟動 OpenOCD。
OpenOCD 需要針對不同的JTAG 工具和不同的目標(biāo)芯片配置一個配置文檔,在運行 OpenOCD 時可用-參數(shù)來指定一個或多個配置文檔[7]。確保執(zhí)行路徑的準(zhǔn)確性。其啟動操作命令如下:
$sudo ./openocd -f ../tcl/interface
-f ../tcl/target/adspsc58x.cfg
此時終端命令行將打印出如下信息:
Open On-Chip Debugger
0.7.0-dev-00202-ge3fefb0-dirty(2013-02-27-14:33)
............
Info:griffin.cpu:hardware has 3 breakpoints, 2 watchpoints
OpenOCD作為守護(hù)進(jìn)程不斷接收來自調(diào)試器的實時狀態(tài)信息,并利用自身的錯誤反饋機(jī)制,給出調(diào)試故障信息,方便快速定位錯誤及時修改。
系統(tǒng)調(diào)試方法有很多種大致分為兩類:硬件調(diào)試和軟件調(diào)試[8]。例如:基于主機(jī)調(diào)試、代理調(diào)試、在線仿真器調(diào)試(ICE)等。本文采用最直接的硬件在線調(diào)試方式,其具有實時監(jiān)控能力,在應(yīng)用程序中加載、運行、步進(jìn)、停止和設(shè)置斷點,讀寫數(shù)據(jù)和程序內(nèi)存,讀寫內(nèi)核和外設(shè)寄存器。所有的調(diào)試方法本質(zhì)上均是利用主機(jī)來控制目標(biāo)板的芯片,在調(diào)試時主機(jī)和目標(biāo)板經(jīng)過特定的接口進(jìn)行通信,JTAG是最常使用的調(diào)試接口,通過JTAG接口可直接訪問處理器內(nèi)部結(jié)構(gòu)以及執(zhí)行相應(yīng)命令操作。
通過ICE仿真器進(jìn)行在線實時仿真,不占用系統(tǒng)資源和CPU時間,仿真和實際運行同步進(jìn)行。用戶可輕松修改寄存器、存儲器、設(shè)置觀察窗口、程序下載及實時調(diào)試。是進(jìn)行硬件開發(fā)、驅(qū)動程序調(diào)試、應(yīng)用軟件開發(fā)的必備工具[9]。
仿真器實際上起到了協(xié)議轉(zhuǎn)換的作用:調(diào)試器發(fā)出的調(diào)試命令和數(shù)據(jù)經(jīng)仿真器轉(zhuǎn)換為JTAG協(xié)議規(guī)定的格式后發(fā)送到目標(biāo)機(jī)上,以監(jiān)控目標(biāo)機(jī)的工作狀態(tài),并控制其運行,而后從目標(biāo)機(jī)讀出的數(shù)據(jù)和狀態(tài)信息經(jīng)過仿真器轉(zhuǎn)換為調(diào)試器可識別的格式。仿真器上級通過串口或USB接口與開發(fā)主機(jī)連接,仿真器下級通過專用連接線與目標(biāo)板的JTAG口相接。
通過對UBoot的加載實現(xiàn)再次證明了此平臺的穩(wěn)定性和可行性。圖2為平臺環(huán)境下的實物連接圖。在保證OpenOCD正常工作的環(huán)境下,以下為具體的UBoot加載過程:
(1)啟動gdb
$arm-none-eabi-gdb u-boot(確保路徑準(zhǔn)確性)
(gdb) target remote :3333
Remote debugging using :3333 0x200bfff0 in ?? ()
(2)下載初始文件
(gdb)load
arch/arm/cpu/armv7/sc58x/init.elf
(gdb) c
Ctrl + C (這句命令的含義是暫停,中止)
(gdb) load u-boot
Loading section .text, size 0x2e59c lma 0x89200000
......
(gdb) c
以上操作成功后可打開串口終端minicom或者kermit來查看,此時看到minicom中出現(xiàn)打印信息。這些信息主要包括處理器,串并聯(lián)端口和網(wǎng)絡(luò)端口的狀態(tài)信息。此時UBoot并未加載到指定的Flash地址內(nèi),而是借助守護(hù)進(jìn)程和仿真器在開發(fā)板的內(nèi)存中成功啟動了UBoot。
在此使用網(wǎng)絡(luò)加載模式需將UBoot.ldr文件復(fù)制到/tftpboot/目錄中備用,以方便下載到目標(biāo)板上[10]。/tftpboot充當(dāng)服務(wù)器,在加載時通信協(xié)議向/tftpboot索要加載文件。
在已啟動的UBoot下使用UBoot命令設(shè)置文件下載地址,同時也可設(shè)置開發(fā)板IP地址和主機(jī)網(wǎng)卡IP地址,如下:
#dhcp(動態(tài)分配IP地址)
#run update(此處將UBoot文件更新到Flash內(nèi))
圖2 平臺實物圖
圖3 UBoot加載成功信息圖
此時UBoot的文件被成功加載到指定的Flash地址處如圖3所示。加載成功后能通過UBoot下的命令來設(shè)置開發(fā)板,并做一些物理資源分配。為后續(xù)系統(tǒng)的進(jìn)一步開發(fā)提供軟件環(huán)境。
通過對UBoot的加載實現(xiàn),給出了一種嵌入式平臺開發(fā)環(huán)境的整體框架。從嵌入式開發(fā)硬件和軟件兩個方面進(jìn)行了詳細(xì)介紹,為后續(xù)系統(tǒng)內(nèi)核級別開發(fā),包括網(wǎng)絡(luò)開發(fā)、驅(qū)動開發(fā)以及上層應(yīng)用程序的開發(fā)提供了平臺。此開發(fā)環(huán)境穩(wěn)定可靠且周期短,適合企業(yè)級應(yīng)用。
[1] 張晨曦,韓超,沈立,等.嵌入式系統(tǒng)教程[M].北京:清華大學(xué)出版社,2013.
[2] 司浩樂.基于Windows CE的顯示控制手柄設(shè)計[D].西安:西安電子科技大學(xué),2008.
[3] 張磊,溫陽東.基于ARM和Linux交叉開發(fā)環(huán)境的搭建[J].儀器儀表用戶,2009,16(3):65-67.
[4] 段富剛,施展.基于Openocd的嵌入式軟件開發(fā)平臺的研究和設(shè)計[J].計算機(jī)測量與控制,2010,18(2):470-472,478.
[5] 高瑛珂,王琪,李泉泉,等.一種基于JTAG接口的片上調(diào)試與性能分析方法[J].微電子學(xué)與計算機(jī),2012,29(7):68-71.
[6] 肖鐵軍,史順波,沈建.基于JTAG的計算機(jī)硬件實驗系統(tǒng)的設(shè)計與實現(xiàn)[J].數(shù)據(jù)通信,2013(2):24-28.
[7] 黃子晨,李德華.基于Openocd和JTAG的嵌入式交叉開發(fā)環(huán)境[J].儀器儀表用戶,2012,19(1):73-75.
[8] 李善平,劉文峰,王煥龍.Linux與嵌入式系統(tǒng)[M].2版.北京:清華大學(xué)出版社,2006.
[9] 雷旭.嵌入式Linux操作系統(tǒng)的研究與開發(fā)[D].西安:長安大學(xué),2005.
[10] 蘇艷蘋,姜凌.基于ARM9_2410EP的嵌入式Linux的研究和移植[J].數(shù)字技術(shù)與應(yīng)用,2010(2):24-25.
Implementation of UBoot Loading Based on ICE Debugger and Openocd Platform
WEI Fangzheng,SHI Zhan
(School of Optical-Electrical and Computer Engineering,University of Shanghai for Science and Technology,Shanghai 200093, China)
Embedded development has very high requirements at each stage of the system development environment. At present ,embedded development process tends to the mode of the short cycle and high efficiency. For the question of software and hardware building , this paper presents a platform construction scheme of loading UBoot,which is based on the development environment of Linux operating system.It gives a detailed introduction to the key part of the program .And it realizes the UBoot loading with a fast way and high efficiency under the platform.
embedded development platform; UBoot; loading
2016- 01- 16
魏方正(1993-),男,研究研究生。研究方向:傳感器和精密測試技術(shù)。施展(1963-) ,女,博士,副教授。研究方向:傳感器和精密測試技術(shù)。
10.16180/j.cnki.issn1007-7820.2016.11.027
TP
A