胡 昊,蔣志翔,張 楊
(中國航天科工集團(tuán)第二研究院706所,北京100854)
一個(gè)良好的集成開發(fā)環(huán)境能夠簡(jiǎn)化開發(fā)過程,減輕開發(fā)人員用于工具上的精力,提高開發(fā)效率。當(dāng)前比較流行的開發(fā)環(huán)境平臺(tái)軟件有Microsoft Visual Studio、Eclipse、Code Blocks等,這些開發(fā)環(huán)境提供了一般軟件開發(fā)所需的一系列功能,然而對(duì)于嵌入式開發(fā)的支持卻相對(duì)薄弱,或缺乏跨平臺(tái)的支持,或缺乏一些開發(fā)功能;而對(duì)嵌入式開發(fā)支持較好的一些開發(fā)環(huán)境如Tornado又不提供源碼,不能根據(jù)需求更改功能[1,2]。嵌入式系統(tǒng)的交叉開發(fā)環(huán)境一般包括交叉編譯器、交叉調(diào)試器和系統(tǒng)仿真器等,并采用宿主機(jī)/目標(biāo)機(jī)模式開發(fā)嵌入式應(yīng)用軟件。國內(nèi)外雖然對(duì)于嵌入式方向的研究和工程較多,但真正掌握核心開發(fā)技術(shù)、尤其是完全掌握交叉開發(fā)流程的公司和個(gè)人卻是少數(shù)。
在對(duì)通用的開發(fā)環(huán)境進(jìn)行研究后,本文針對(duì)上述缺陷,提出對(duì)當(dāng)前嵌入式集成開發(fā)環(huán)境的改進(jìn)方案,并且在Eclipse框架的基礎(chǔ)上進(jìn)行了實(shí)現(xiàn)。本文旨在研究并實(shí)現(xiàn)能夠在x86宿主機(jī)上交叉開發(fā)MIPS架構(gòu)、龍芯3A 處理器的目標(biāo)機(jī)上應(yīng)用程序的集成開發(fā)環(huán)境。在開發(fā)環(huán)境中,不僅實(shí)現(xiàn)了基本的程序構(gòu)建功能,為嵌入式工具鏈提供了健全的支持,同時(shí)還設(shè)計(jì)了一系列開發(fā)和測(cè)試工具,改進(jìn)了編譯方式,提高了開發(fā)效率,能夠在一定程度上縮短開發(fā)周期、降低成本。
本文基于項(xiàng)目是面向MIPS架構(gòu)的龍芯3A 硬件平臺(tái)的嵌入式操作系統(tǒng)及集成開發(fā)環(huán)境的研發(fā)。進(jìn)行交叉開發(fā),必須在開發(fā)環(huán)境中集成目標(biāo)機(jī)操作系統(tǒng)的一系列和編譯鏈接相關(guān)的文件。本項(xiàng)目中目標(biāo)機(jī)上運(yùn)行的特定嵌入式實(shí)時(shí)操作系統(tǒng),也是由項(xiàng)目組開發(fā),如圖1 所示為基于Rtems內(nèi)核的嵌入式實(shí)時(shí)操作系統(tǒng)的架構(gòu)圖,分為4層結(jié)構(gòu):硬件抽象層、核心層、系統(tǒng)服務(wù)層和應(yīng)用服務(wù)層[3]。硬件抽象層主要是和體系架構(gòu)相關(guān)的驅(qū)動(dòng)支持軟件;核心層由一系列核心組件組成,包括實(shí)時(shí)任務(wù)調(diào)度、內(nèi)存管理系統(tǒng)、IO 系統(tǒng)等模塊組成;系統(tǒng)服務(wù)層主要完成給各種應(yīng)用提供操作系統(tǒng)級(jí)的服務(wù)支持,包括VxWorks、Posix、Classic 3種API(application programming interface)的支持;應(yīng)用服務(wù)層主要提供TCP/IP協(xié)議棧、GUI系統(tǒng)、文件系統(tǒng)等組件[4,5]。Rtems內(nèi)核具有支持多任務(wù),支持事件驅(qū)動(dòng)、基于優(yōu)先級(jí)搶占的調(diào)度算法和具有快速響應(yīng)的中斷管理等優(yōu)勢(shì)。
操作系統(tǒng)為上層應(yīng)用程序的編寫提供了一套API,但由于不是在目標(biāo)機(jī)上直接開發(fā)應(yīng)用程序,在宿主機(jī)上就需要提供目標(biāo)機(jī)操作系統(tǒng)的各類鏈接庫文件和頭文件等[6]。將這些系統(tǒng)文件集成于開發(fā)環(huán)境目錄之下,根據(jù)目錄組織結(jié)構(gòu),設(shè)計(jì)開發(fā)環(huán)境的路徑解析和文件查找功能,在構(gòu)建程序時(shí)自動(dòng)或手動(dòng)去查找所需要的文件。
圖1 嵌入式實(shí)時(shí)操作系統(tǒng)基本架構(gòu)
根據(jù)各層的實(shí)現(xiàn)原理及關(guān)系,將操作系統(tǒng)源文件在Cygwin下編譯成一系列的庫文件和可執(zhí)行文件,供開發(fā)環(huán)境在程序構(gòu)建過程中調(diào)用。如圖2所示即為開發(fā)環(huán)境中操作系統(tǒng)相關(guān)的主要文件目錄樹,其中Tyche目錄下為程序構(gòu)建過程中所需要的文件總目錄,三級(jí)子目錄tyche中是操作系統(tǒng)核心文件,里面主要包含了工具鏈的二進(jìn)制文件(bin)、系統(tǒng)頭文件 (include)、C/C++庫、系統(tǒng)庫文件(lib)、makefile模板文件 (make)、說明手冊(cè) (man)等。
圖2 開發(fā)環(huán)境中操作系統(tǒng)相關(guān)文件目錄
CDT (C/C ++development tool)是一套開源的Eclipse的插件,用于對(duì)C/C++程序開發(fā)的支持。由于Eclipse平臺(tái)強(qiáng)大的功能及友好的界面和特性,Java開發(fā)人員也想將這些優(yōu)秀的性能提供給C/C++開發(fā)人員。CDT對(duì)Windows平臺(tái)和Linux 平臺(tái)均提供了支持,并且由于Eclipse的插件結(jié)構(gòu)形式,使得外部插件能夠無縫連接到Eclipse內(nèi)核中。本項(xiàng)目以最新的版本CDT8.2為基礎(chǔ)進(jìn)行研究,開發(fā)特定目標(biāo)機(jī)平臺(tái)的集成開發(fā)環(huán)境,相比較其他平臺(tái)的集成開發(fā)環(huán)境,不僅擁有其已有的功能,同時(shí)還設(shè)計(jì)實(shí)現(xiàn)了一些新的功能,豐富了開發(fā)環(huán)境的輔助功能。
由于其復(fù)雜性,CDT 被分成了許多組件,他們都采用獨(dú)立插件的形式開發(fā),高度包含了面向?qū)ο蟮脑O(shè)計(jì)思想,從底層到高層的實(shí)現(xiàn)都秉承了高內(nèi)聚、低耦合的設(shè)計(jì)原則,使得組件功能的擴(kuò)展和刪除都相當(dāng)清晰。CDT8.2 包含了幾十個(gè)獨(dú)立插件,然而核心插件及功能描述見表1。
表1 CDT 的核心插件與功能描述
CDT8.2 提供了對(duì)GNU、Cygwin、MinGW、Visual Studio等一系列工具鏈的支持,并且集成了工程創(chuàng)建管理、工程構(gòu)建、調(diào)試和目標(biāo)機(jī)狀態(tài)查看等C/C++程序開發(fā)的配套功能。然而由于本項(xiàng)目中目標(biāo)機(jī)平臺(tái)的特殊性,CDT本身沒有提供對(duì)MIPS架構(gòu)目標(biāo)機(jī)的支持,所以不能夠直接使用CDT,需要進(jìn)行2次開發(fā)以實(shí)現(xiàn)開發(fā)環(huán)境對(duì)C/C++的支持。
開發(fā)環(huán)境的核心功能之一就是工程管理,而其中的難點(diǎn)就在于實(shí)現(xiàn)在開發(fā)環(huán)境中指定程序的構(gòu)建方式。因?yàn)樵诰帉懘笮蛻?yīng)用程序的時(shí)候,往往需要面對(duì)復(fù)雜的編譯過程和大量的源代碼文件,該過程中需要處理配置選項(xiàng)、多種格式的輸入輸出文件、確定文件間復(fù)雜的依賴關(guān)系,同時(shí)還需要應(yīng)對(duì)工程的反復(fù)修改編譯[7]。工程上常用Makefile和make工具來實(shí)現(xiàn)程序自動(dòng)構(gòu)建的過程,但在開發(fā)大型程序時(shí),如果程序員手動(dòng)去編寫所有的Makefile文件及組織相應(yīng)的目錄,人工地分析上述的輸入輸出文件及依賴關(guān)系將會(huì)使開發(fā)過程變得更為繁瑣、開發(fā)效率極為低下,而且在后續(xù)的開發(fā)過程中工程文件將難以維護(hù)。特別是在嵌入式系統(tǒng)中,由于環(huán)境變量配置復(fù)雜,所需的庫文件沒有良好支持,極易導(dǎo)致編譯或鏈接錯(cuò)誤,因此在集成開發(fā)環(huán)境中提供工程的自動(dòng)管理和構(gòu)建功能,即自動(dòng)生成Makefile,就顯得十分必要[8]。
所需自動(dòng)生成的Makefile共有4種:SubDir.mk、Objects.mk、Sources.mk 和 Makefile[9]。其中前3 種為子Makefile文件,最后一個(gè)為主Makefile,主Makefile中用include語句包含了前3種子Makefile。CDT8.2中各Makefile文件對(duì)應(yīng)的功能和實(shí)現(xiàn)函數(shù)如下:SubDir.mk用于聲明各級(jí)子目錄模塊的源文件和依賴關(guān)系,生成SubDir.mk的函數(shù)名為populateFragmentMakefile;Objects.mk用于聲明生成的所有目標(biāo)文件名和庫文件名,生成函數(shù)名為populateObjectsMakefile;Sources.mk用于聲明依賴的源文件及子目錄名稱,生成Sources.mk 的函數(shù)為populateSources-Makefile;生成主 Makefile 的函數(shù)為populateTopMakefile[10]。
開發(fā)環(huán)境中Makefile的生成流程,如圖3所示。
圖3 開發(fā)環(huán)境中Makefile的生成流程
項(xiàng)目中為了不破壞源代碼的封裝性和擴(kuò)展性,保留了CDT 中這些接口函數(shù)的名稱,而重構(gòu)了其實(shí)現(xiàn)方式,以生成Rtems操作系統(tǒng)下的Makefile文件。第1步,首先開發(fā)環(huán)境能夠自動(dòng)為用戶工程配置大部分環(huán)境變量和編譯鏈接選項(xiàng),圖形化的配置界面也能讓用戶自行配置一些其他選項(xiàng),在Makefile的生成過程中,會(huì)先獲取這些配置信息并保存在相應(yīng)的數(shù)據(jù)結(jié)構(gòu)中,通過解析這些配置信息并根據(jù)模板編譯規(guī)則生成一條條的編譯命令,在后續(xù)過程中寫入Makefile。第2步,遍歷工程目錄下的所有文件,獲得工程文件的目錄樹,再根據(jù)文件后綴名判定是否為可編譯的源文件,若為可編譯的源文件則寫入Makefile中的對(duì)應(yīng)位置,生成依賴關(guān)系。最后將第1步中自動(dòng)生成的編譯命令寫入Makefile,完成所有Makefile,隨后調(diào)用make 工具,將Makefile中的命令傳遞給編譯器和鏈接器執(zhí)行,生成目標(biāo)文件,完成工程的整個(gè)構(gòu)建過程。
開發(fā)環(huán)境以良好的面向?qū)ο缶幊谭绞椒庋b數(shù)據(jù)和接口,既繼承了Eclipse和CDT 已有的優(yōu)良特性,又包含了新增的功能,從而實(shí)現(xiàn)了開發(fā)環(huán)境中的工程管理功能,無需開發(fā)者自行去分析工程目錄、工程配置信息和文件修改記錄,能夠自動(dòng)編寫Makefile文件并生成相應(yīng)的編譯命令,使得工程管理的難度明顯下降,從開發(fā)方式來說也符合軟件工程的規(guī)范。
3.2.1 編譯鏈接
如圖4所示,為項(xiàng)目中實(shí)現(xiàn)的應(yīng)用程序構(gòu)建流程。程序的構(gòu)建過程從新建模板工程向?qū)ч_始,在編輯器中編輯好源代碼后,開發(fā)環(huán)境會(huì)自行調(diào)用C/C++Parser和Codan工具檢查代碼語法和格式,之后根據(jù)用戶操作執(zhí)行工程的構(gòu)建過程。
圖4 開發(fā)環(huán)境中程序構(gòu)建流程
開始執(zhí)行工程構(gòu)建時(shí),首先根據(jù)用戶設(shè)置自動(dòng)構(gòu)建工程的Makefile 文件,其實(shí)現(xiàn)方法上一部分已有介紹。Makefile文件只是寫入文件間依賴關(guān)系及編譯鏈接規(guī)則,真正完成程序構(gòu)建的是匯編器、編譯器、鏈接器等一系列工具鏈。開發(fā)環(huán)境中提供了對(duì)2種工具鏈的支持,即Cygwin工具鏈和MinGW 工具鏈,絕大多數(shù)情況下使用的是在Cygwin環(huán)境下重新編譯的 MIPS 工具鏈。包括mipstyche3.6-as (匯編器)、mips-tyche3.6-gcc (編譯器)、mips-tyche3.6-g++ (編譯器)、mips-tyche3.6-ld (鏈接器)等,這些工具及相關(guān)文件都被放置到本文第1部分所提到的tyche/bin/目錄下,開發(fā)環(huán)境根據(jù)系統(tǒng)環(huán)境變量進(jìn)行查詢和調(diào)用。對(duì)Makefile中的編譯規(guī)則和文件依賴關(guān)系進(jìn)行解析后,開發(fā)環(huán)境將調(diào)用make工具將對(duì)應(yīng)的命令傳遞給上述編譯工具,編譯工具根據(jù)需要的文件查找Tyche目錄下所需要的相關(guān)操作系統(tǒng)頭文件、庫文件以及工程目錄下的源代碼文件,最終生成目標(biāo)機(jī)上可執(zhí)行程序。
3.2.2 增量編譯
在實(shí)現(xiàn)上,為提高工程的編譯效率,研究并在開發(fā)環(huán)境中實(shí)現(xiàn)了增量編譯功能。遍歷工程目錄下的所有文件,以接口類IResourceDelta保存工程文件目錄樹和配置信息的修改內(nèi)容,再次構(gòu)建工程時(shí),獲取記錄的上一次編譯時(shí)的工程信息,與當(dāng)前工程信息對(duì)比,從而確立了工程的修改內(nèi)容,即增量,根據(jù)增量信息,重新生成Makefile。
程序構(gòu)建時(shí),先判定編譯方式是增量編譯還是完全編譯,如果是完全編譯 (通常為第1次編譯工程或者是用戶選擇完全編譯選項(xiàng)),則會(huì)先執(zhí)行工程清理過程,刪除當(dāng)前工程目錄下所有Makefile和目標(biāo)文件,再重新編譯所有的源文件。如果是增量編譯,就調(diào)用genrerateMakefiles 函數(shù),其中用ResourceDeltaVisitor類的visit函數(shù)得到當(dāng)前工程的IResourceDelta,即得到了工程內(nèi)源文件和配置信息的修改記錄;第2步,判定修改方式是增加、刪除還是其他,并將這些信息告知Makefile的生成器,生成器遍歷已修改的文件,根據(jù)修改過的文件名稱和編譯依賴規(guī)則重寫Makefile,這樣在后續(xù)真正的編譯過程中就只會(huì)重新編譯修改過的源文件及其依賴的文件,而不會(huì)重新編譯未修改過的源文件。這樣就實(shí)現(xiàn)了增量編譯功能,避免了因?yàn)樯倭康脑创a修改而需要重新編譯整個(gè)工程的復(fù)雜過程,提高了編譯效率。
增量編譯過程及增量Delta的存儲(chǔ)結(jié)構(gòu),如圖5所示。
圖5 增量編譯過程及增量Delta的存儲(chǔ)結(jié)構(gòu)
3.2.3 代碼檢查
程序開發(fā)過程中,源代碼自動(dòng)檢查也是集成開發(fā)環(huán)境設(shè)計(jì)中一個(gè)重要的問題,一個(gè)用戶友好的開發(fā)環(huán)境必須提供較為完備的代碼檢查功能。Codan是一個(gè)非常優(yōu)秀的C/C++靜態(tài)代碼審查工具,將其與CDT 集成后,在編寫程序源代碼和工程編譯過程中,開發(fā)環(huán)境會(huì)自行調(diào)用Codan工具檢查代碼語法格式和進(jìn)行邏輯分析,例如緩沖區(qū)溢出問題,就能夠被自動(dòng)檢查出來,并在出錯(cuò)位置以編輯器標(biāo)記的形式輸出,建立控制臺(tái)輸出信息與源代碼位置的映射,實(shí)現(xiàn)錯(cuò)誤代碼定位功能,以便于開發(fā)人員修改程序代碼。
Codan在實(shí)現(xiàn)上使用的是java的非確定型有窮自動(dòng)機(jī)(nondeterministic finite automaton,NFA)引擎,這種正則引擎的特點(diǎn)是以表達(dá)式為主導(dǎo),模式正則表達(dá)式在編譯時(shí)效率較高,需要內(nèi)存小,盡管在匹配過程中使用回溯匹配的算法,但使用者可以直接操控匹配的過程。如圖6所示為NFA 引擎的一個(gè)匹配示例。
圖6 NFA 引擎狀態(tài)圖示例
在程序的編譯期,開發(fā)環(huán)境還需要獲取編譯器的所有輸出信息并以流的方式重定向到控制臺(tái),對(duì)這些輸出的字符串信息進(jìn)行處理,以特定的方式顯示出來。在字符串信息的處理上就采用了Codan的字符串處理函數(shù),以java的NFA 正則表達(dá)式引擎基礎(chǔ),根據(jù)模式正則表達(dá)式匹配編譯器輸出信息,從而準(zhǔn)確高效地分辨出正常輸出、警告信息,錯(cuò)誤信息,并以顏色標(biāo)記的方式在控制臺(tái)輸出,為開發(fā)環(huán)境提供了完善的代碼查錯(cuò)功能。
調(diào)試方式也是嵌入式開發(fā)不同于一般應(yīng)用開發(fā)的一項(xiàng)。本項(xiàng)目在開發(fā)環(huán)境實(shí)現(xiàn)了3種程序調(diào)試下載方式,即ejtag調(diào)試方式、串口調(diào)試、網(wǎng)絡(luò)調(diào)試,為上層開發(fā)者提供了多種調(diào)試方式,可根據(jù)硬件條件的不同使用不同的調(diào)試下載方式。ejtag調(diào)試方式采用的是龍芯公司的ejtag仿真器鏈接目標(biāo)機(jī)和宿主機(jī),經(jīng)開發(fā)環(huán)境下載調(diào)試目標(biāo)機(jī)程序;網(wǎng)絡(luò)調(diào)試實(shí)現(xiàn)經(jīng)網(wǎng)線連接的下載調(diào)試方式,為追求下載速度和實(shí)現(xiàn)的簡(jiǎn)易,采用基于UDP 協(xié)議的TFTP 協(xié)議進(jìn)行通信;串口調(diào)試方式則是使用串口線連接目標(biāo)機(jī)與宿主機(jī),采用RPC協(xié)議進(jìn)行通信。
雖然調(diào)試方式有多種,但原理上大同小異。執(zhí)行調(diào)試指令的過程是,先將GDB debugger的命令轉(zhuǎn)化為機(jī)器更易處理的MI接口命令,MI是開發(fā)環(huán)境和調(diào)試接口交互的接口。之后發(fā)送給通信代理模塊,發(fā)送給目標(biāo)機(jī),經(jīng)解析后傳遞給GDB server執(zhí)行,執(zhí)行的結(jié)果又以特定的通信協(xié)議返回給宿主機(jī)開發(fā)環(huán)境進(jìn)行解析,最后在用戶界面顯示,從而實(shí)現(xiàn)程序的調(diào)試執(zhí)行[2]。
項(xiàng)目中使用的Debugger是在Cygwin環(huán)境下重新編譯生成的mips-tyche3.6-gdb,在編譯時(shí)給編譯器增加參數(shù)-g,就能夠在可執(zhí)行文件中加入調(diào)試信息,包括源代碼中變量描述定義信息,函數(shù)類型及參數(shù)信息等;在底層實(shí)現(xiàn)上實(shí)際上是調(diào)用ptrace系統(tǒng)調(diào)用獲取調(diào)試進(jìn)程的運(yùn)行狀態(tài),比如堆棧的使用情況、各種變量的值等;獲取的這些程序運(yùn)行信息經(jīng)過指定的通信協(xié)議封裝成數(shù)據(jù)包回傳給宿主機(jī),并在開發(fā)環(huán)境中以MI接口解析數(shù)據(jù),最終在開發(fā)環(huán)境的調(diào)試視圖中顯示變量的值、寄存器使用情況,實(shí)現(xiàn)了單步進(jìn)入、單步跳過、單步回跳等功能。
調(diào)試代理原理如圖7所示。
圖7 調(diào)試代理原理
在調(diào)試功能的多次使用測(cè)試后,得到如表2 所示的3種調(diào)試下載方式特點(diǎn)的比較,3種調(diào)試下載方式各有優(yōu)劣。
表2 3種調(diào)試方式特點(diǎn)對(duì)比
測(cè)試環(huán)境由x86 宿主機(jī)、龍心3A 目標(biāo)機(jī)及連接設(shè)備(包括網(wǎng)線、串口線、ejtag仿真器)組成。主要測(cè)試應(yīng)用程序的開發(fā)流程相關(guān)功能。測(cè)試結(jié)果表明,開發(fā)環(huán)境能夠提供完整的工程創(chuàng)建、工程管理、編譯和調(diào)試等界面及功能,能夠根據(jù)工程修改信息進(jìn)行增量編譯,節(jié)省編譯時(shí)間。應(yīng)用程序可以多種方式下載到目標(biāo)機(jī)上,因通信協(xié)議的不同下載速度有所差異,但均能夠保證程序正確運(yùn)行,達(dá)到了豐富調(diào)試方式,改善既有功能的目的。
為適應(yīng)高效高質(zhì)量的嵌入式開發(fā)方式,本文對(duì)嵌入式開發(fā)流程進(jìn)行了深入的研究,針對(duì)已有開發(fā)工具的不足,進(jìn)行了2次開發(fā),設(shè)計(jì)并實(shí)現(xiàn)了特定MIPS架構(gòu)目標(biāo)機(jī)的交叉開發(fā)環(huán)境。開發(fā)環(huán)境目前已能夠滿足用戶開發(fā)及調(diào)試目標(biāo)機(jī)上程序的需求,測(cè)試情況與設(shè)計(jì)相符,提供了友好的交互界面,在繼承Eclipse已有功能的基礎(chǔ)上,根據(jù)需求實(shí)現(xiàn)了針對(duì)MIPS平臺(tái)的工程管理、增量編譯及遠(yuǎn)程調(diào)試功能,縮短了編譯時(shí)間,改善了工程管理方式,從而提高了上層開發(fā)人員的開發(fā)效率。下一步的工作中,將對(duì)開發(fā)環(huán)境進(jìn)行完善,繼續(xù)擴(kuò)展必要的輔助功能,包括多核支持,性能分析、目標(biāo)機(jī)狀態(tài)監(jiān)測(cè)等。
[1]Kopetz H.Real-time systems:Design principles for distributed embedded applications[M].Germany:Springer,2011.
[2]Sriram S,Bhattacharyya SS.Embedded multiprocessors scheduling and synchronization [M].USA:CRC Press,2009.
[3]On-Line Applications Research Corporation.Getting started with RTEMS [S].2011.
[4]Andrew S Tanenbaum. Modern operating systems [M].USA:Prentice Hall,2009.
[5]Rafael V Aroca.A real time operating systems(RTOS)comparison [C]//Workshop de Sistemas Operacionais,2009:2441-2452.
[6]Tan S,Tran Nguyen B.Survey and performance evaluation of real-time operating systems(RTOS)for small microcontrollers[J].IEEE Micro,2009,99 (1):1-14.
[7]Randal E Bryant,David R O’Hallaron.Computer systems:A programmer’s perspective[M].USA:Prentice Hall,2010.
[8]Leupers R.Code optimization techniques for embedded processors:Methods,algorithms and tools [M].USA:Kluwer Academic Pubilshers,2010.
[9]NAN Fang.Embedded integration development environment analysis and design on Eclipse[D].Xi’an:Xidian University,2009 (in Chinese).[南方.基于Eclipse的嵌入式集成開發(fā)環(huán)境分析與設(shè)計(jì) [D].西安:西安電子科技大學(xué),2009.]
[10]WANG Yang.Embedded integrated development environment design and implementation on Eclipse [D].Chengdu:UESTC,2012 (in Chinese).[汪洋.基于Eclipse架構(gòu)面向Linux的嵌入式軟件開發(fā)環(huán)境的設(shè)計(jì)與實(shí)現(xiàn) [D].成都:電子科技大學(xué),2012.]