第八章 uclinux及應用開發(fā)ok
單擊此處編輯母版標題樣式,,單擊此處編輯母版文本樣式,,第二級,,第三級,,第四級,,第五級,,*,*,*,嵌入式系統(tǒng)開發(fā)與應用,第八章,uclinux,及應用開發(fā),主要內(nèi)容,8.1,,linux,介紹,,8.2,,µ,Clinux,簡介,,8.3,µ,Clinux,中的應用程序開發(fā),,8.4,如何,構(gòu)造嵌入式,linux,系統(tǒng),,,8.5,實驗理論部分,8.1,,linux,介紹,8.1.1,linux,簡介,,8.1.2,linux,特點,,8.1.3,linux,作為嵌入式操作系統(tǒng)的優(yōu)點,,,8.1.4,嵌入式,linux,的版本,,主要內(nèi)容,8.1.1,簡介,Linux,是個和,Unix,相似、以內(nèi)核為基礎的、完全內(nèi)存保護、多任務多進程的操作系統(tǒng)。,Linux,最初是在,1991,年由一名芬蘭學生,Linus,,Torvalds,開發(fā)的,至今不過,14,個年頭,它是一個年輕的操作系統(tǒng),最初開發(fā)的,Linux,不成熟、性能較低,但是,由于,Linux,具有開放性,任何人只要遵守,GNU,組織的,GPL,(,GNU Public License,),標準,都可對其源碼進行修改。所以,Linux,在短短的時間內(nèi)就成了一個穩(wěn)定、成熟的操作系統(tǒng)。,,8.1.2,linux,特點,,1.,符合,POSIX 1003.1,標準,,,POSIX 1003.1,標準定義了一個最小,的,Unix,操作系統(tǒng)接口,只有符合這一標準,才可以運行,Unix,程序。由于,Unix,具有豐富的應用程序,當今絕大多數(shù)操作系統(tǒng)都把滿足,POSIX 1003.1,標準作為實現(xiàn)目標,,Linux,完全支持,POSIX 1003.1,標準。另外,,,Linux,還增加了部分,System V,和,BSD,的系統(tǒng)接口使得,Unix System V,和,BSD,上的程序能直接在,,Linux,上運行,從而使,Linux,成為一個完善,的,Unix,程序開發(fā)系統(tǒng)。,,linux,特點,2.,,支持多用戶訪問和多任務編程,,,Linux,是一個真正的多用戶、多任務操作系統(tǒng),它允許多個用戶同時訪問系統(tǒng)且不會造成用戶之間的相互干擾。而且,每一個用戶可以創(chuàng)建多個進程,并使各個進程協(xié)同工作來完成用戶的需求。,,3.,,采用頁式存儲管理,,,與大多數(shù)操作系統(tǒng)一樣,,Linux,支持頁式存儲管理。它能使,Linux,更有效地利用物理存儲空間,頁面的換入換出為用戶提供了更大的存儲空間。,linux,特點,4.,,支持動態(tài)鏈接,,,用戶程序的執(zhí)行往往離不開標準庫的支持,運行程序前,需要將標準庫與程序鏈接好。按照鏈接方式的不同有靜態(tài)與動態(tài)兩種。一般的系統(tǒng)往往采用靜態(tài)鏈接方式,即在裝配階段就已將用戶程序和標準庫鏈接好,這樣,當多個進程運行時,可能會出現(xiàn)庫代碼在內(nèi)存中有多個副本而浪費存儲空間的情況;,Linux,支持動態(tài)鏈接方式,當運行時才進行庫鏈接,如果所需要的庫已被其它進程裝入內(nèi)存,則不必再裝入,否則才從硬盤中將庫調(diào)入。這樣能保證內(nèi)存中的庫程序代碼是唯一的,也節(jié)省了內(nèi)存,提高了程序的運行效率。,,linux,特點,5.,,支持多種文件系統(tǒng),,,Linux,能支持多種文件系統(tǒng)。常見的有:,EXT,、,EXT2,、,HPFS,、,MSDOS,、,UMSDOS,、,PROC,、,NFS,、,SYSV,、,MINIX,、,SMB,、,UFS,、,NCP,、,VFAT,、,JFFS,。,Linux,最常用的文件系統(tǒng)是,EXT2/3,,,它是,EXT,文件的改進版本。,,6.,,支持,TCP/IP,、,SLIP,和,PPP,,,在,Linux,中,用戶可以使用所有的網(wǎng)絡服務。,,8.1.3linux,作為嵌入式操作系統(tǒng)的優(yōu)點,1.,,可應用于多種硬件平臺,。,Linux,已經(jīng)被移植到多種硬件平臺,這對受成本、時間限制的研究與開發(fā)項目是很有吸引力的。可以在標準平臺上開發(fā)然后移植到具體的硬件上,加快了軟件與硬件的開發(fā)過程并降低了開發(fā)成本。,,2.,,Linux,可以隨意地配置而不需要任何的許可證或商家的合作關系。,,3.,,它是免費的,源代碼可以得到。這是最吸引人的。毫無疑問,這會節(jié)省大量的開發(fā),,費用。,linux,作為嵌入式操作系統(tǒng)的優(yōu)點,4.,,它本身內(nèi)置網(wǎng)絡支持,具有公認的強大的網(wǎng)絡功能。,,5.,,Linux,的高度模塊化使添加部件非常容易。,,6. Linux,在臺式機上的成功,使大家看到了,linux,在嵌入式系統(tǒng)中的輝煌前景,。,8.1.4,嵌入式,linux,的版本,,,Linux,應用于嵌入式領域雖然時間不長,但已形成了許多版本,按照其實際應用的場合及特殊的功能需求,基本上可以分為以下,3,類:,,1.,將,Linux,改進以滿足實時要求的實時操作系統(tǒng),應用于一些關鍵的控制場合,,如,RT,-,Linux,,,Hard Hat Linux,。,,2.,盡可能保留,Linux,的強大功能,盡可能地減少其體積,以滿足許多嵌入式系統(tǒng)對體積的要求,如,µClinux,。,,3.,針對特定嵌入式領域采用的整合方案,,如,Lineo,,,TimeSys,,,合肥華恒等,8.2µClinux,簡介,,8.2.1 µ,Clinux,特色,,,8.2.2 µ,Clinux,的設計特征,,,主要內(nèi)容,,,µClinux,是保留,Linux,的強大功能,但體積大大減少,是主要針對沒有,MMU,的微處理器開發(fā)的一個嵌入式,Linux,版本。,µClinux,是,Linux2.0,版本的一個分支,被設計用來微型控制應用領域。,µClinux,單詞中,µ,代表微型,,C,代表控制器,,µClinux,的含義就是,",針對微控制領域而設計的,Linux,系統(tǒng),",,通常讀,作“,you see,linux,”,8.2.1µClinux,特色,,通用,的,Linux API,,µ,Ckernel,<512 KB,,µ,Ckernel,+,工具,<900KB,,完整的,TCP/IP,協(xié)議堆棧,,,支持大量其它的網(wǎng)絡協(xié)議,,,支持各種文件系統(tǒng),包括,NFS,、,EXT2,、,ROMfs,、,JFFS,、,MS-DOS,以及,FAT16/32,,只支持沒有,MMU,的微控制器,,8.2.2µClinux,的設計特征,,,1,、,µClinux,的內(nèi)存管理,,,2,、,µClinux,的多進程處理,,3,、,µClinux,的實時性,,4,、執(zhí)行程序的格式,,5,、文件系統(tǒng),,6,、,標準,C,函數(shù)庫,1,、,µClinux,的內(nèi)存管理,,µClinux,同標準,Linux,的最大區(qū)別就在于內(nèi)存管理。標準,Linux,是針對,有,MMU,的處理器設計的。在這種處理器上,虛擬地址被送到,MMU,,,MMU,把虛擬地址映射為物理地址。通過賦予每個任務不同的虛擬,—,物理地址轉(zhuǎn)換映射,支持不同任務之間的保護。其,優(yōu)點,是提供了比計算機系統(tǒng)實際物理內(nèi)存大得多的內(nèi)存空間,這樣編程人員在編程時勿需考慮計算機中物理內(nèi)存的實際容量。,缺點:,地址轉(zhuǎn)換表和其他一些數(shù)據(jù)結(jié)構(gòu)占據(jù)了內(nèi)存空間,這樣留給程序員的內(nèi)存空間就減少了;同時地址轉(zhuǎn)換增加了每一條指令的執(zhí)行時間。,。,,µClinux,不使用虛擬內(nèi)存管理技術(shù),采用的是,實存儲器管理策略,。也就是,µClinux,系統(tǒng)對于內(nèi)存的訪問是直接的,(它對地址的訪問不需要經(jīng)過,MMU,,,而是直接送到地址線上輸出),分析,從易用性這一點來說,,,µClinux,的內(nèi)存管理實際上是一種倒退,,退回到了,UNIX,早期或是,Dos,系統(tǒng)時代。開發(fā)人員必須參與系統(tǒng)的內(nèi)存管理。從編譯內(nèi)核開始,開發(fā)人員就必須告訴系統(tǒng)這塊開發(fā)板到底擁有多少的內(nèi)存(假如你欺騙了系統(tǒng),那將在后面運行程序時受到懲罰),從而系統(tǒng)將在啟動的初始化階段對內(nèi)存進行分頁,并且標記已使用的和未使用的內(nèi)存。系統(tǒng)將在運行應用程序時使用這些分頁內(nèi)存。,分析,從,內(nèi)存的訪問角度來看,,由于采用實存儲器管理策略,,用戶程序同內(nèi)核在一個地址空間,操作系統(tǒng)對內(nèi)存空間沒有保護,。因此,開發(fā)人員的,權(quán)利增大了,(開發(fā)人員在編程時可以訪問任意的地址空間),但與此同時系統(tǒng)的,安全性也大為下降,。,,總結(jié),,µClinux,的內(nèi)存管理與標準,Linux,系統(tǒng)相比功能相差很多,但當前這種不帶有,MMU,的處理器在嵌入式設備中相當普遍。原因是系統(tǒng)中實現(xiàn),MMU,需要在軟件及硬件上有些開銷,比如說需要有一個,MMU,芯片,而大多數(shù)嵌入式應用對成本很敏感。同時,地址轉(zhuǎn)換表和其他一些數(shù)據(jù)結(jié)構(gòu)占據(jù)了內(nèi)存空間,這樣留給程序員的內(nèi)存空間就減少了;同時地址轉(zhuǎn)換增加了每一條指令的執(zhí)行時間。,,而嵌入式設備通常運行在某一特定的環(huán)境下,只需實現(xiàn)特定的功能即可,功能相對也簡單,這樣就可以不使用,MMU,,,以減小生產(chǎn)成本及系統(tǒng)開銷,。,,linux,中創(chuàng)建進程是由,fork,調(diào)用實現(xiàn)的,但由于,µClinux,在存儲管理方面的特點,在實現(xiàn)多進程時是通過,vfork,來實現(xiàn),,在,µClinux,中,vfork,等于,fork,。,2,、,µClinux,的多進程處理,,3,、,µClinux,的實時,性,,,µClinux,本身并沒有關注實時問題,它并不是為了,Linux,的實時性而提出的,,因此若將,µClinux,用于實時性要求較高的場合時,需要對其內(nèi)核做必要的改進。如:為,µClinux,添加,RT-Linux,的,patch,,,從而增強,µClinux,的實時性,使得,µClinux,可以應用于工業(yè)控制、進程控制等一些實時性要求較高的場合。,,4,、執(zhí)行程序的格式,,不管是內(nèi)核還是應用程序,,µClinux,均使用,flat,可執(zhí)行文件格式替代,elf,格式,,,elf,格式有比較大的文件頭,,flat,文件格式簡化了文件頭和部分段信息。,,5,、文件系統(tǒng),,,µClinux,是,Linux,的擴展,因此,所有,Linux,支持的文件系統(tǒng),,µ,Cinux,,都支持,。,為節(jié)省資源,,µClinux,一般使用專門為嵌入式系統(tǒng)設計的文件系統(tǒng)如,Romfs,,,JFFS,等,,這些文件系統(tǒng)較常用,的,ext2/3,占用更少資源,,,更支持壓縮,,同時在內(nèi)核中支持,romfs,文件系統(tǒng)相對來說只需要更少的代碼,。,,6,、,標準,C,函數(shù)庫,,µClinux,使用嵌入式標準,C,函數(shù)庫,µ,Clibc,或,µC-,libC,替代,libc,,,Linux,下使用的標準,C,函數(shù)庫,libc,需要非常多的資源,,µ,Clibc,對,libc,做了精簡,在,µClinux,中的應用程序均采用,靜態(tài)連接的方式鏈接標準,C,函數(shù),庫,。,,µC-,libc,是,µClinux,最初的函數(shù)庫,,是,libc,的不完全的嵌入式實現(xiàn),,部分函數(shù)接口不標準,,,還有部分函數(shù)未實現(xiàn),。目前主要使用在,Coldfire,和,ARM,結(jié)構(gòu)。,,µ,Clibc,函數(shù)庫彌補了,µC-,libc,的一些問題,,如:使所有的函數(shù)接口標準化,填補未實現(xiàn)的函數(shù),,µ,Clibc,目前已支持相當多的處理器結(jié)構(gòu),使用,µ,Clibc,能夠?qū)贸绦虻囊浦蔡峁└玫募嫒菪浴?µ,Clibc,正在逐步的取代,µC-,libc,。,,8.3µClinux,中的應用程序開發(fā),,8.3.1,程序開發(fā)的基本流程,,,8.3.2,交叉開發(fā)環(huán)境,,,8.3.3,uCLinux,應用程序開發(fā),,主要內(nèi)容,8.3.1,程序開發(fā)的基本流程,建立開發(fā)環(huán)境,源文件,編譯,下載,鏈接,C,語言程序*,.c,匯編源程序*,.s,目標文件,可,執(zhí)行文件,8.3.2,交叉開發(fā)環(huán)境,,先在通用,PC,機上編程,然后通過交叉編譯鏈接,將程序做成目標平臺上可以運行的二進制代碼格式。最后將程序下載到目標平臺上的特定位置由目標板上啟動代碼運行這段二進制代碼。,,交叉開發(fā):我們把這種在一臺通用計算機上進行軟件的編輯編譯,然后下載到嵌入式設備中運行調(diào)試的開發(fā)方式。開發(fā)計算機一般稱宿主機,嵌入式設備稱為目標機,在宿主機上編譯好的程序,下載到目標機上運行。,,交叉開發(fā)環(huán)境一般由運行于宿主機上的交叉開發(fā)軟件、宿主機到目標機的調(diào)試通道組成。如在,µClinux,的開發(fā)過程中,需要安裝交叉編譯工具,arm-elf-,gcc,,。,調(diào)試時還需要,gdb,軟件等。,,8.3.3,uCLinux,應用程序開發(fā),,,uClinux,是由,Linux2.0,版本發(fā)展來的,主要是針對沒有內(nèi)存管理單元,(MMU),的處理器和控制器而設計的。部分標準,C,函數(shù)在標準,Linux,下可以使用而在,uClinux,下不能使用,因此,需要用戶編寫相應的庫函數(shù),但是絕大多數(shù)的函數(shù)還是通用的。也就是說大多數(shù)函數(shù)不需要做太大的改動就可以編譯成可以,在,uClinux,上運行的文件格式,。,,總結(jié),在嵌入,式,uClinux,中進行應用程序開發(fā)時,首先是在主機上編程并編譯,然后經(jīng)修改后用主機上建立的交叉編譯環(huán)境生成,.elf,文件,,并用,elf2flat,工具將,.elf,文件轉(zhuǎn)換為,.flat,文件,最后使用下載工具將文件下載到目標板上,并運行及調(diào)試。,,8.4,如何,構(gòu)造嵌入式,linux,系統(tǒng),,8.4.1,構(gòu)造嵌入式,Linux,系統(tǒng)的幾個關鍵問題,,8.4.2,構(gòu)造嵌入式,Linux,系統(tǒng)的關鍵步驟,,主要內(nèi)容,8.4.1,構(gòu)造嵌入,式,Linux,系統(tǒng)的幾個關鍵問題,一個小型的嵌入,式,Linux,系統(tǒng)需要三個基本元素:,,u,,引導工具,,u,,Linux,微內(nèi)核(由內(nèi)存管理、進程管理和事務處理構(gòu)成),,u,,初始化進程,,若想讓它干點什么且繼續(xù)保持小型化,還得加上,,u,,硬件驅(qū)動程序,,u,,提供所需功能的一個或多個應用程序,,若再增加功能,需要這些,,u,,一個文件系統(tǒng)(也許在,ROM,或,RAM,中),,u,,TCP/IP,網(wǎng)絡協(xié)議棧,,u,,一個磁盤用來存放半易失性數(shù)據(jù)和提供交換能力,8.4.2,構(gòu)造嵌入式,Linux,系統(tǒng)的關鍵步驟,,1,、建立交叉開發(fā)環(huán)境,,2,、安裝,µClinux,內(nèi)核,,3,、安裝應用程序庫,,8.5,實驗理論部分,8.5.1,內(nèi)核編譯,,8.5.2,,Boot Loader,編譯運行,,8.5.3,,內(nèi)核啟動加載的方式,,,8.5.4,,uClinux,應用程序開發(fā),,8.5.5,下載及調(diào)試應用程序的方法,,8.5.6,,makefile,介紹,,8.5.7,將應用程序添加到文件系統(tǒng)的方法,,主要內(nèi)容,8.5.1,內(nèi)核編譯,8.5.1.1,實驗前的準備工作,,,8.5.1.2,配置及編譯,uClinux,,,8.5.1.3,下載并運行,,主要內(nèi)容,8.5.1.1,實驗前的準備工作,,,1,、安裝,uClinux,,源代碼,,,cp /mnt/hda1/uClinux-s3cev40.tar.gz /root/,,,cd,/root,,,tar,zxvf,uClinux-s3cev40.tar.gz,2,、安裝編譯器,,cp /mnt/hda1/arm-elf-compiler.tar.gz /,usr,/local,,,tar,zxvf,arm-elf-,compiler.tar.gz,,,PATH=”/,usr/local/bin:$PATH,”,8.5.1.2,配置及編譯,uClinux,1,、配置,uClinux,,,make,config,,,make,menuconfig,,,make,xconfig,,,,生成文件,.,config,,,保存配置信息。下次配置時產(chǎn)生新的,.,config,文件,原來的,.,config,被改名為,.,config.old,。,,配置及編譯,2,、編譯,uClinux,,,cd,/root/uclinux-s3cev40,,,make clean,,,make,xconfig,,,,make,dep,,,,make lib_only,,,make user_only,,,make,romfs,,,make image,配置及編譯,最后,,在,images,目錄下生成,2,個文件,,zImage,:,uClinux,,內(nèi)核,2.4.x,的壓縮方式執(zhí)行映像文件,,,romfs.,img,:,文件系統(tǒng)的映像文件,。,,8.5.1.3,下載并運行,1,、下載,,使用,Embest,S3CEV40,目標板附帶的串口線連接目標板上的,UART0,和,PC,機的串口,,,,用,Embest,燒寫工具軟件進行燒寫,加載,EmbestS3CEV40.cfg,目標板配置文件,將,bootloader.bin,燒寫至,FLASH,的,1-16,扇區(qū),,zImage,燒寫至,17-192,扇區(qū),,,romfs.img,燒寫至,193-400,扇區(qū),。,,下載并運行,2,、運行,,,在,PC,機上運行,Windows,自帶的超級終端串口通信程序(波特率,115200,、,1,位停止位、,8,位數(shù)據(jù)位、無校驗位、無硬件流控制);或者使用其它串口通信程序。,,重新啟動目標板,運行,uclinux,。,,8.5.2,,Boot Loader,編譯運行,,8.5.2.1,簡介,,,8.5.2.2,Boot Loader,設計,,,8.5.2.3,實驗,例程,主要內(nèi)容,8.5.2.1,簡介,系統(tǒng)引導程序通常稱為,Boot Loader,,,是在系統(tǒng)復位后執(zhí)行的第一段代碼,相當于,PC,上的,BIOS,以及商業(yè)實時操作系統(tǒng)中的板級支持,包,BSP,,,Boot Loader,首先完成系統(tǒng)硬件的初始化,包括時鐘的設置、存儲區(qū)的映射等,設置堆棧指針,然后跳轉(zhuǎn)到操作系統(tǒng)內(nèi)核的入口,將系統(tǒng)控制權(quán)交給操作系統(tǒng),在此之后系統(tǒng)的運行,和,Boot Loader,再無任何關系。,,,,Boot Loader,獨立于操作系統(tǒng),必須由用戶自己設計。,,,,Boot Loader,的實現(xiàn)高度依賴于硬件,包括處理器的體系結(jié)構(gòu)、具體型號、硬件電路板的設計。,,簡介,Boot Loader,、,內(nèi)核映像和文件系統(tǒng)映像在系統(tǒng)中的存儲的典型空間分配結(jié)構(gòu)圖如下:,,,,,,,典型空間分配結(jié)構(gòu)圖,8.5.2.2 Boot Loader,設計,,1,、最簡功能設計要求,禁止所有的中斷;,,設置處理器時鐘、運行速度;,,存儲區(qū)初始化;,,設置堆棧指針將,bss,段清零;,,跳轉(zhuǎn)到內(nèi)核映像的入口,,Boot Loader,設計,上電自檢;,,支持串口通訊方式,提供串口方式的命令控制臺;,,支持以太網(wǎng)通訊方式,提供以太網(wǎng)通訊方式的命令控制臺;,,可以通過串口或以太網(wǎng)下載并引導內(nèi)核和文件系統(tǒng)映像文件;,2,、完備功能設計要求,8.5.3,,內(nèi)核啟動加載的方式,8.5.3.1,內(nèi)核提供方式,,,8.5.3.2,內(nèi)核加載及啟動方式,,,主要內(nèi)容,8.5.3.1,內(nèi)核提供方式,(,1,)壓縮形式內(nèi)核:固化,在,Flash,中,由,uClinux,提供的解壓復制程序?qū)?nèi)核解壓后復制到,RAM,中運行;,,(,2,)正常未壓縮的內(nèi)核:可以先固化在,Flash,中,由,Boot Loader,復制到,RAM,中運行,顯然這樣更浪費,Flash,存儲空間;故一般通過,Boot Loader,提供的串口、網(wǎng)絡下載功能直接,從,PC,機下載到系統(tǒng),的,RAM,中,然后由,Boot Loader,的啟動內(nèi)核功能啟動,這種方式主要用來工程師的內(nèi)核調(diào)試。,,8.5.3.2,內(nèi)核加載及啟動方式,(1,),Flash,本地運行方式:內(nèi)核的未經(jīng)壓縮的可執(zhí)行映像固化在,Flash,,,系統(tǒng)啟動時內(nèi)核在,Flash,中開始逐句執(zhí)行。,,(,2,)壓縮內(nèi)核加載方式:內(nèi)核的壓縮映像固化,在,Flash,上,系統(tǒng)啟動時由附加在壓縮映像前的解壓復制程序讀取壓縮映像,在內(nèi)存中解壓后執(zhí)行,這種方式相對復雜,但是運行速度更快,(,RAM,的存取速率要,比,Flash,高)。,,8.5.4,,uClinux,應用程序開發(fā),一、將,Linux,下的應用程序移植到,uCLinux,,下,時,需要注意的限制,,二、應用程序開發(fā)步驟,主要內(nèi)容,一、將,Linux,下的應用程序移植,到,uCLinux,下時,需要注意有以下限制,,1,),uC-libc,中不帶有,pthread,庫,要進行多線程編程,只能選擇,select,函數(shù)。,,,2,),uClinux,系統(tǒng)中由于內(nèi)存管理的問題,沒有,fork,(),函數(shù),用,vfork,(),代替,因為,uClinux,,系統(tǒng)中沒有真正的,fork,,,多進程實際是使用,vfork,實現(xiàn)的,子進程執(zhí)行完后父進程才繼續(xù)執(zhí)行。,,,,3,),uClinux,所用的,Libc,庫不是一個全功能的庫,而是一個適合嵌入式應用的功能有限的庫,對于一些不太常用的函數(shù)可能庫里沒有,需要用戶自己編寫。,,,4,)堆棧有限制,現(xiàn)在堆棧大小限制在,4K,字節(jié),你可以用如下方法增加堆棧的大?。涸谑褂?elf2flt,工具軟件時加上,“,-s,”,參數(shù)。,,二、應用程序開發(fā)步驟,,1,、,在,Linux,下編寫源程序,example.c,,,確認編譯生 成的程序,example,能在,Linux,下正確執(zhí)行。,,,,#,gcc,–o example example.c,,#,./example,,,2,、,按照移植注意事項改寫源代碼,example.c,,,改寫 以后的文件命名為,example_uc.c,。,,,3,、,使用交叉編譯工具編譯,example_uc.c,,,生成,,example_uc,執(zhí)行文件。編譯命令如下:,,,,$arm-elf-,gcc,–o,example_uc,,example_uc.c,–elf2flt,,,4,、,下載并執(zhí)行,,對于下載方法我們介紹兩種最經(jīng)常使用的下載調(diào)試應用程序的方法,:,8.5.5,下載及調(diào)試應用程序的方法,,8.5.5.1,下載方法,FTP,與,TFTP,,8.5.5.2,uClinux,應用程序調(diào)試方法,下載方法,FTP,與,TFTP,文件傳輸協(xié)議,FTP,是,Internet,上使用得最廣泛的文件傳輸協(xié)議。在嵌入式開發(fā)中使用,FTP,方式下載應用程序時,是,在,PC,即宿主機上建立,FTP,服務器,然后,在,uClinux,的超級終端窗口啟動,FTP,客戶程序,執(zhí)行,FTP,命令下載應用程序到目標板的指定目錄中。,,,簡單文件傳輸協(xié)議,TFTP,全稱,為,Trivial File Transfer Protocol,,,適合小型文件傳輸,比較小并且容易實現(xiàn)。在,uClinux,的相關開發(fā)過程中,更經(jīng)常地使用,TFTP,。,,下載方法,1,、在,Win2000,操作系統(tǒng)下建立,TFTP,服務器,,,運行,TFTP,服務器程序,tftpd32.exe,,,進行各種工作狀態(tài)、權(quán)限以及本地,tftp,工作目錄的設置,默認狀態(tài)下可以直接進行工作,本地,tftp,工作目錄即當前目錄,,,2,、在,uClinux,的超級終端窗口執(zhí)行,TFTP,客戶端命令連接服務器程序,tftpd32,,,直接下載文件(如,LED,燈控制程序)到,var,目錄,修改權(quán)限后運行:,,,,tftp,-g -l /,var/example_uc,-r,example_uc,192.168.0.35,,,cd,/,var,,,/,var,>,chmod,777,example_uc,,,/,var,> ./,example_uc,,8.5.6,,makefile,介紹,程序大型化、復雜化是嵌入式軟件發(fā)展的必然趨勢。如何維護和管理程序就是個突出和緊迫的問題。高級語言編程所形成的模塊之間不可避免的存在著相互的聯(lián)系和制約,而且其關系也非常復雜。這樣,如果某個模塊需要改動、更換或者刪除,那么需要把與該程序相關的所有程序都重新編譯、鏈接。這樣不僅需要程序員找出與該程序相關的其它程序,并且需要使用長而復雜的命令對其逐一進行編譯、鏈接。這對程序員來講不僅費時費力而且易出錯。針對以上問題,,GNU,為我們推出了,make,項目管理工具,。,,Make,項目管理工具能夠自動確定需要重新編譯的文件,并對它們進行重新編譯,然后鏈接生成執(zhí)行文件。,Make,項目管理工具是通過,makefile,來完成這一工作的,它對大型項目軟件的開發(fā)是很有必要的。,Make,管理項目把所用的命令行保存到,Makefile,文件中,簡化了編譯工作。,Make,管理項目可以減少重新編譯所需要的時間,它可以識別出,makefile,中哪些文件已經(jīng)修改,并且在再次編譯時只編譯這些文件,這樣提高了編譯的效率。,,,,,Make,管理項目還在數(shù)據(jù)庫中維護了當前開發(fā)工程中各個文件的依賴關系,在編譯前就可以確定是否能找到所需文件。,,要完成,Make,管理項目的工作必須編寫,makefile,,,makefile,是一個文本形式的數(shù)據(jù)庫文件,其中包含一些規(guī)則來告訴,Make,編譯哪些文件以及怎樣編譯這些文件。每條規(guī)則包含以下內(nèi)容:,,,l,,一個,target,,是,Make,最終要創(chuàng)建的文件,,l,,一個或多個,dependencies,列表,是編譯生成目標文件所需的其他文件,,l,,需要執(zhí)行的,commands,,,用于從指定的文件處生成目標文件,,,一個簡單,的,makefile,規(guī)則可以使用如下代碼表示,:,target:dependency file1 dependency file2[…],,command1,,command1,,[…],注意:每一個命令的第一個字符必須是制表符,僅使用,8,個空格是不行的。否則,make,會顯示出錯信息。,,其中:,target,是要創(chuàng)建的目標文件或者,linux,系統(tǒng)支持格式的可執(zhí)行文件,。,dependency,fileN,是創(chuàng)建,target,需要的依賴文件列表。,CommandN,是創(chuàng)建,target,時使用的命令組,是包括,make,在內(nèi)的許多,shell,命令的集合。此外,除非特別指定,否則,make,的工作目錄就是當前目錄。還要注意“,#,”,號以后的文字為注釋。,,# a simple,makefile,,square,:,square.o Length.o width.o,,#,gcc,–o square square.o Length.o width.o,,square.o,:,square.c square.h Length.h width.h,,#,gcc,–c square.c,,Length.o,:,Length.c Length.h,,#,gcc,–c Length.c,,width.o,:,width.c,,#,gcc,–c width.c,,clean:,,,rm,,edito,*.o,一個簡單,的,makefile,實例,。,,makefile,文件編寫好以后,,在,makefile,所在目錄下鍵入,make,就可編譯,square,。,這個,makefile,有,5,條規(guī)則。第,1,條規(guī)則用于創(chuàng)建默認的目標,square,,,,它有,3,個依賴文件:,square.o,、,Length.o,和,width.o,。,在編譯,square,時這些文件必須存在。第,2,行是,,make,為創(chuàng)建,square,所要執(zhí)行的命令,后面的三條規(guī)(,4,~,9,行)則告訴,make,如何逐個生成那些依賴文件。,Clean,用來清除編譯過程中的中間文件。,,通常情況下,如果試圖在依賴文件不存在的情況下使用第二行所示的命令來編譯,square,,,gcc,將會出錯并退出;,而,make,則在生成,square,前先檢查所需要的依賴文件是否存在,如果不存在,則先執(zhí)行別的規(guī)則以生成缺少的依賴文件,最后才編譯依賴性最強的目標。如果,square.o,、,Length.o,和,width.o,已經(jīng)存在,則它不急于再次運行后面的規(guī)則,而是比較這些依賴文件與其對應的源文件的生成時間,如果判定有一個或者多個源文件新于這些依賴文件,,make,才重新編譯生成這些文件以反映相關源文件的最新變化,否則使用舊的依賴文件完成目標,square,的編譯。至此,這個小小的,makefile,顯示了它強有力的自動查找、比較、編譯等功能,它的用處是顯而易見的。,,在編寫,makefile,時我們會使用一些常用的諸如,clean,、,install,、,dist,、,tags,、,depend,、,test,、,check,、,installtest,以及,installcheck,的目標名。目標,名,clean,一般用來清除編譯過程中的中間文件,。,install,目標名常會把最終的二進制文件、所支持的庫文件,和,shell,腳本以及相關文檔移到文件系統(tǒng)中與它對應的位置,同時設置文件的權(quán)限和所有者。,Uninstall,用來刪除,install,目標安裝的文件,。,Dist,常常用于刪除編譯工作目錄中舊的二進制文件和目標文件并且創(chuàng)建歸檔文件。,Tags,用來更新或創(chuàng)建程序的標記表。,Depend,用來設置,makefile,文件中各個目標所需要的依賴文件列表。,installtest,和,installcheck,一般用于驗證,install,目標的安裝過程,。,,5.2.4.7,將應用程序添加到文件系統(tǒng)的方法,一、 編寫,Makefile,,,二、,,修改配置相關文件,,,三、 快速添加應用程序,,一、編寫,Makefile,1,、使用,Vi,在,/user/app/,下編寫,,hello.c,文件,#include <,stdio.h,>,,int,main(void) {,,printf("Hello,world!\n");,,return 1;,,},2,、編寫,Makefile,,EXEC = hello,,OBJS = hello.o,,all: $(EXEC),,$(EXEC): $(OBJS),,$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS),,romfs,:,,$(ROMFSINST) /bin/$(EXEC),,clean:,,,,-,rm,-f $(EXEC) *.elf *.,gdb,*.o,二、,,修改配置相關文件,1,、,修改,./,config/config.in,,在最后面增加菜單:,,###############################,,mainmenu_option,next_comment,,comment'User Application',,bool,'Hello‘CONFIG_USER_HELLO,,comment "User Application",,endmenu,,,##################################,,或者在合適的菜單塊中增加一行:,,bool,'Hello' CONFIG_USER_HELLO,二、,,修改配置相關文件,CONFIG_USER_HELLO,,This program print hello on screen.,注意:,,描述文本必須縮進兩空格,不能包括空行且必須少于,70,個字符,2,、修改,./,config/Configure.help,Configure.help,包含配置時顯示的描述文本,在文件中增加:,,修改配置相關文件,增加行,,,dir_$(CONFIG_USER_HELLO) += app,,3,、修改用戶程序工程管理文件,,user/,Makefile,三、,快速添加應用程序,1,、編譯生成可執(zhí)行文件,,,輸入以下命令直接編譯程序源代碼文件,對于復雜一點的工程可以使用上節(jié)中的,Makefile,:,,,,2,、,復制可執(zhí)行文件到文件系統(tǒng),,,,在執(zhí)行,make,romfs,命令時會生成,romfs,文件夾,它是生成的文件系統(tǒng)目錄,因此如果已經(jīng)執(zhí)行過,make,romfs,命令,用戶可將生成的可執(zhí)行文件,hello,復制到,romfs,/bin,目錄,不必重復該命令。,,注意,:如果用戶執(zhí)行了,make clean,命令,,romfs,下的全部內(nèi)容將被清除。,,arm-elf-,gcc,–Wall –O2 -Wl,-elf2flt –o hello hello.c,3,、,,生成文件系統(tǒng)映像,,,直接執(zhí)行下面的命令生成文件系統(tǒng)映像,romfs.img,:,,,genromfs,-v -V ",ROMdisk," –f,romfs.img,-d /root/uclinux-s3cev40/romfs,,,這里的文件系統(tǒng)映像,romfs.img,包含了新增的應用程序,hello,。,,genromfs,-v -V ",ROMdisk," –f,romfs.img,-d /root/uclinux-s3cev40/romfs,