第7章嵌入式操作系統(tǒng)及開發(fā)簡述_第1頁
第7章嵌入式操作系統(tǒng)及開發(fā)簡述_第2頁
第7章嵌入式操作系統(tǒng)及開發(fā)簡述_第3頁
第7章嵌入式操作系統(tǒng)及開發(fā)簡述_第4頁
第7章嵌入式操作系統(tǒng)及開發(fā)簡述_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

嵌入式操作系統(tǒng)河北工業(yè)大學信息工程學院范書瑞第7章嵌入式操作系統(tǒng)及開發(fā)簡述7.1嵌入式Linux簡介17.2構建Linux開發(fā)環(huán)境27.3引導程序移植37.4Linux內核移植47.5

構建文件系統(tǒng)57.6應用程序開發(fā)63河北工業(yè)大學信息工程學院范書瑞2024/4/26嵌入式Linux開發(fā)步驟應用程序開發(fā)根文件系統(tǒng)內核引導程序開發(fā)環(huán)境4河北工業(yè)大學信息工程學院范書瑞2024/4/26嵌入式系統(tǒng)開發(fā)模型嵌入式開發(fā)成本6河北工業(yè)大學信息工程學院范書瑞2024/4/26

7.3引導程序移植7.3.5U-Boot常用命令7.3.4U-Boot移植思路7.3.3U-Boot編譯7.3.2U-Boot工程簡介7.3.1BootLoader種類BootLoader系統(tǒng)加電或復位后,所有CPU都會從某個地址開始執(zhí)行,這是由處理器設計決定的。ARM處理器在復位時從地址0x00000000取第一條指令。嵌入式系統(tǒng)的開發(fā)板都要把板上ROM或Flash映射到這個地址。因此,必須把BootLoader程序存儲在相應的Flash位置。系統(tǒng)加電后,CPU將首先執(zhí)行它。主機和目標機之間一般有串口可以連接,BootLoader軟件通常會通過串口來輸入輸出。例如:輸出出錯或者執(zhí)行結果信息到串口終端,從串口終端讀取用戶控制命令等。BootLoader啟動過程通常是多階段的,這樣既能提供復雜的功能,又有很好的可移植性。例如:從Flash啟動的BootLoader多數是兩階段的啟動過程。Bootloader的主要功能是引導操作系統(tǒng)啟動,可以提供各種啟動方式。啟動方式網絡啟動磁盤啟動Flash啟動操作系統(tǒng)網絡啟動方式不需要配置較大的存儲介質,跟無盤工作站有點類似。Bootloader安裝到板上的EPROM或者Flash中。Bootloader通過以太網接口遠程下載Linux內核映像或者文件系統(tǒng)。使用這種方式也有前提條件:就是目標板有串口、以太網接口。在服務器上配置啟動相關網絡服務。網絡啟動示意圖磁盤啟動方式傳統(tǒng)的Linux系統(tǒng)運行在臺式機或者服務器上,這些計算機一般都使用BIOS引導,并且使用磁盤作為存儲介質。如果進入BIOS設置菜單,可以探測處理器、內存、硬盤等設備,可以設置BIOS從軟盤、光盤或者某塊硬盤啟動。也就是說,BIOS并不直接引導操作系統(tǒng)。那么在硬盤的主引導區(qū),還需要一個Bootloader。這個Bootloader可以從磁盤文件系統(tǒng)中把操作系統(tǒng)引導起來。Linux傳統(tǒng)上是通過LILO(LInuxLOader)引導的,后來又出現了GNU的軟件GRUB(GRandUnifiedBootloader)。這2種Bootloader廣泛應用在X86的Linux系統(tǒng)上。開發(fā)主機使用了其中一種,熟悉它們有助于配置多種系統(tǒng)引導功能。Flash啟動方式Bootloader一般放在Flash的底端或者頂端,這要根據處理器的復位向量設置。要使Bootloader的入口位于處理器上電執(zhí)行第一條指令的位置。接下來分配參數區(qū),這里可以作為Bootloader的參數保存區(qū)域。再下來內核映像區(qū)。Bootloader引導Linux內核,就是要從這個地方把內核映像解壓到RAM中去,然后跳轉到內核映像入口執(zhí)行。然后是文件系統(tǒng)區(qū)。如果使用Ramdisk文件系統(tǒng),則需要Bootloader把它解壓到RAM中。如果使用JFFS2文件系統(tǒng),將直接掛接為根文件系統(tǒng)。7.3引導程序移植“BootLoader”和“Monitor”

“BootLoader”只是引導設備并且執(zhí)行主程序的固件;“Monitor”還提供了更多的命令行接口,可以進行調試、讀寫內存、燒寫Flash、配置環(huán)境變量等?!癕onitor”在嵌入式系統(tǒng)開發(fā)過程中可以提供很好的調試功能,開發(fā)完成以后,就完全設置成了一個“BootLoader”。所以,習慣上大家把它們統(tǒng)稱為BootLoader。7.3.1BootLoader的種類7.3.1BootLoader的種類BootloaderMonitor描

述x86ARMPowerPCLILO否Linux磁盤引導程序是否否GRUB否GNU的LILO替代程序是否否Loadlin否從DOS引導Linux是否否ROLO否從ROM引導Linux而不需要BIOS是否否Etherboot否通過以太網卡啟動Linux系統(tǒng)的固件是否否LinuxBIOS否完全替代BUIS的Linux引導程序是否否BLOB否LART等硬件平臺的引導程序否是否U-boot是通用引導程序是是是RedBoot是基于eCos的引導程序是是是開放源碼的Linux引導程序7.3.1BootLoader的種類LILO軟件工程是由WernerAlmesberger創(chuàng)建,專門為引導Linux開發(fā)的?,F在LILO的維護者是JohnCoffman,最新版本下載站點:。LILO有詳細的文檔,例如LILO套件中附帶使用手冊和參考手冊。此外,還可以在LDP的“LILOmini-HOWTO”中找到LILO的使用指南。GRUB是GNU計劃的主要bootloader。GRUB最初是由ErichBoleyn為GNUMach操作系統(tǒng)撰寫的引導程序。后來有GordonMatzigkeit和OkujiYoshinori接替Erich的工作,繼續(xù)維護和開發(fā)GRUB。GRUB的網站/software/grub/上有對套件使用的說明文件,叫作《GRUBmanual》。GRUB能夠使用TFTP和BOOTP或者DHCP通過網絡啟動,這種功能對于系統(tǒng)開發(fā)過程很有用。X86的工作站和服務器上一般使用LILO和GRUB。LILO是Linux發(fā)行版主流的Bootloader。不過RedhatLinux發(fā)行版已經使用了GRUB,GRUB比LILO有更有好的顯示界面,使用配置也更加靈活方便。7.3.1BootLoader的種類ARM處理器的芯片商很多,所以每種芯片的開發(fā)板都有自己的Bootloader。結果ARMbootloader也變得多種多樣。最早有為ARM720處理器的開發(fā)板的固件,又有了armboot,StrongARM平臺的blob,還有S3C2410處理器開發(fā)板上的vivi等?,F在armboot已經并入了U-Boot,所以U-Boot也支持ARM/XSCALE平臺。U-Boot已經成為ARM平臺事實上的標準Bootloader。PowerPC平臺的處理器有標準的Bootloader,就是ppcboot。PPCBOOT在合并armboot等之后,創(chuàng)建了U-Boot,成為各種體系結構開發(fā)板的通用引導程序。U-Boot仍然是PowerPC平臺的主要Bootloader。值得說明的是Redboot,它幾乎能夠支持所有的體系結構,包括MIPS、SH、M68K等體系結構。Redboot是以eCos為基礎,采用GPL許可的開源軟件工程?,F在由coreeCos的開發(fā)人員維護,源碼下載網站是/snapshots。Redboot的文檔也相當完善,有詳細的使用手冊《RedBootUser’sGuide》。7.3.2U-Boot工程簡介最早,DENX軟件工程中心的WolfgangDenk基于8xxrom的源碼創(chuàng)建了PPCBOOT工程,并且不斷添加處理器的支持。后來,SysgoGmbh把ppcboot移植到ARM平臺上,創(chuàng)建了ARMboot工程。然后以ppcboot工程和armboot工程為基礎,創(chuàng)建了U-Boot工程?,F在U-Boot已經能夠支持PowerPC、ARM、X86、MIPS體系結構的上百種開發(fā)板,已經成為功能最多、靈活性最強并且開發(fā)最積極的開放源碼Bootloader。U-Boot的源碼包可以從sourceforge網站下載,還可以訂閱該網站活躍的U-BootUsers郵件論壇,這個郵件論壇對于U-Boot的開發(fā)和使用都很有幫助。U-Boot軟件包下載網站:/project/u-boot。U-Boot郵件列表網站:/lists/listinfo/u-boot-users/。DENX相關的網站:http://www.denx.de/re/DPLG.html。7.3.2U-Boot工程簡介1處理器體系結構或者開發(fā)板硬件直接相關2一些通用的函數或者驅動程序3U-Boot的應用程序、工具或者文檔U-Boot源碼結構7.3.2U-Boot工程簡介目

錄特

性解釋說明board平臺依賴存放電路板相關的目錄文件,例如:RPXlite(mpc8xx)、smdk2410(arm920t)、sc520_cdp(x86)等目錄cpu平臺依賴存放CPU相關的目錄文件,例如:mpc8xx、ppc4xx、arm720t、arm920t、xscale、i386等目錄lib_ppc平臺依賴存放對PowerPC體系結構通用的文件,主要用于實現PowerPC平臺通用的函數lib_arm平臺依賴存放對ARM體系結構通用的文件,主要用于實現ARM平臺通用的函數lib_i386平臺依賴存放對X86體系結構通用的文件,主要用于實現X86平臺通用的函數include通用頭文件和開發(fā)板配置文件,所有開發(fā)板的配置文件都在configs目錄下common通用通用的多功能函數實現lib_generic通用通用庫函數的實現7.3.2U-Boot工程簡介目

錄特

性解釋說明Net通用存放網絡的程序Fs通用存放文件系統(tǒng)的程序Post通用存放上電自檢程序drivers通用通用的設備驅動程序,主要有以太網接口的驅動Disk通用硬盤接口程序Rtc通用RTC的驅動程序Dtt通用數字溫度測量器或者傳感器的驅動examples應用例程一些獨立運行的應用程序的例子,例如helloworldtools工具存放制作S-Record或者U-Boot格式的映像等工具,例如mkimageDoc文檔開發(fā)使用文檔7.3.3U-Boot的編譯U-Boot的源碼是通過GCC和Makefile組織編譯的。頂層目錄下的Makefile首先可以設置開發(fā)板的定義,然后遞歸地調用各級子目錄下的Makefile,最后把編譯過的程序鏈接成U-Boot映像。1.頂層目錄下的Makefile它負責U-Boot整體配置編譯。每一種開發(fā)板在Makefile都需要有板子配置的定義。例如smdk2410開發(fā)板的定義如下:smdk2410_config:

unconfig

@./mkconfig$(@:_config=)armarm920tsmdk2410NULLs3c24x0

執(zhí)行配置U-Boot的命令makesmdk2410_config,通過./mkconfig腳本生成include/config.mk的配置文件。7.3.3U-Boot的編譯文件內容正是根據Makefile對開發(fā)板的配置生成的。

ARCH

=armCPU

=arm920tBOARD

=smdk2410SOC

=s3c24x0

include/config.mk文件定義了ARCH、CPU、BOARD、SOC這些變量。這樣硬件平臺依賴的目錄文件可以根據這些定義來確定。。SMDK2410平臺相關目錄如下。board/smdk2410/cpu/arm920t/cpu/arm920t/s3c24x0/lib_arm/include/asm-arm/include/configs/smdk2410.h7.3.3U-Boot的編譯頂層目錄的Makefile文件開始的部分,其中下列幾行包含了這些變量的定義。

#loadARCH,BOARD,andCPUconfigurationincludeinclude/config.mkexport

ARCHCPUBOARDVENDORSOCMakefile的編譯選項和規(guī)則在頂層目錄的config.mk文件中定義。各種體系結構通用的規(guī)則直接在這個文件中定義。通過ARCH、CPU、BOARD、SOC等變量為不同硬件平臺定義不同選項。不同體系結構的規(guī)則分別包含在ppc_config.mk、arm_config.mk、mips_config.mk等文件中。7.3.3U-Boot的編譯ifeq($(ARCH),arm)CROSS_COMPILE=arm-linux-

//交叉編譯器的前綴#endifexport

CROSS_COMPILE…#U-Bootobjects....orderisimportant(i.e.startmustbefirst)OBJS

=cpu/$(CPU)/start.o

//處理器相關的目標文件…LIBS

=lib_generic/libgeneric.a

//定義依賴的目錄,每個目錄下先把目標文件連接成*.a文件。LIBS+=board/$(BOARDDIR)/lib$(BOARD).aLIBS+=cpu/$(CPU)/lib$(CPU).aifdefSOCLIBS+=cpu/$(CPU)/$(SOC)/lib$(SOC).aendifLIBS+=lib_$(ARCH)/lib$(ARCH).a…頂層目錄Makefile定義交叉編譯器7.3.3U-Boot的編譯ALL=u-boot.srecu-boot.binSystem.mapall:

$(ALL)u-boot.srec:

u-boot

$(OBJCOPY)${OBJCFLAGS}-Osrec$<$@u-boot.bin:u-boot

$(OBJCOPY)${OBJCFLAGS}-Obinary$<$@……u-boot:

depend$(SUBDIRS)$(OBJS)$(LIBS)$(LDSCRIPT)

UNDEF_SYM='$(OBJDUMP)-x$(LIBS)\

|sed

-n-e's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\

$(LD)$(LDFLAGS)$$UNDEF_SYM$(OBJS)\

--start-group$(LIBS)$(PLATFORM_LIBS)--end-group\

-Mapu-boot.map-ou-bootMakefile缺省的編譯目標為all,包括u-boot.srec、u-boot.bin、System.map。u-boot.srec和u-boot.bin又依賴于U-Boot。U-Boot就是通過ld命令按照u-boot.map地址表把目標文件組裝成u-boot。U-Boot映像編譯的依賴關系7.3.3U-Boot的編譯除了編譯過程Makefile以外,還要在程序中為開發(fā)板定義配置選項或者參數。這個頭文件是include/configs/<board_name>.h。<board_name>用相應的BOARD定義代替。這個頭文件中主要定義了兩類變量。一類是選項,前綴是CONFIG_,用來選擇處理器、設備接口、命令、屬性等。例如:

#define

CONFIG_ARM920T

1#define

CONFIG_DRIVER_CS8900

1

另一類是參數,前綴是CFG_,用來定義總線頻率、串口波特率、Flash地址等參數。例如:

#define

CFG_FLASH_BASE

0x00000000#defineCFG_PROMPT

"=>"開發(fā)板配置頭文件7.3.3U-Boot的編譯根據對Makefile的分析,編譯分為2步。第1步配置,例如:makesmdk2410_config;第2步編譯,執(zhí)行make就可以了。編譯完成后,可以得到U-Boot各種格式的映像文件和符號表,文件名稱說

明System.mapU-Boot映像的符號表u-bootU-Boot映像的ELF格式u-boot.binU-Boot映像原始的二進制格式u-boot.srecU-Boot映像的S-Record格式編譯結果7.3.4U-Boot的移植移植U-Boot的基本步驟如下。(1)在頂層Makefile中為開發(fā)板添加新的配置選項,使用已有的配置項目為例。

smdk2410_config

:

unconfig

@./mkconfig$(@:_config=)armarm920tsmdk2410NULLs3c24x0

參考上面2行,添加下面2行。

fs2410_config

:

unconfig

@./mkconfig$(@:_config=)armarm920tfs2410NULLs3c24x0

(2)創(chuàng)建一個新目錄存放開發(fā)板相關的代碼,并且添加文件。board/fs2410/config.mkboard/fs2410/flash.cboard/fs2410/fs2410.cboard/fs2410/Makefileboard/fs2410/memsetup.Sboard/fs2410/u-boot.lds7.3.4U-Boot的移植(3)為開發(fā)板添加新的配置文件可以先復制參考開發(fā)板的配置文件,再修改。例如:$cpinclude/configs/smdk2410.h

include/configs/fs2410.h如果是為一顆新的CPU移植,還要創(chuàng)建一個新的目錄存放CPU相關的代碼。(4)配置開發(fā)板$makefs2410_config(5)編譯U-Boot執(zhí)行make命令,編譯成功可以得到U-Boot映像。有些錯誤是跟配置選項是有關系的,通常打開某些功能選項會帶來一些錯誤,一開始可以盡量跟參考板配置相同。7.3.4U-Boot的移植(6)添加驅動或者功能選項在能夠編譯通過的基礎上,還要實現U-Boot的以太網接口、Flash擦寫等功能。對于FS2410開發(fā)板的以太網驅動和smdk2410完全相同,所以可以直接使用。CS8900驅動程序文件如下。drivers/cs8900.cdrivers/cs8900.h對于Flash的選擇就麻煩多了,Flash芯片價格或者采購方面的因素都有影響。多數開發(fā)板大小、型號不都相同。所以還需要移植Flash的驅動。每種開發(fā)板目錄下一般都有flash.c這個文件,需要根據具體的Flash類型修改。例如:board/fs2410/flash.c(7)調試U-Boot源代碼,直到U-Boot在開發(fā)板上能夠正常啟動。7.3.5U-Boot命令U-Boot是“Monitor”。除了Bootloader的系統(tǒng)引導功能,它還有用戶命令接口,提供了一些復雜的調試、讀寫內存、燒寫Flash、配置環(huán)境變量等功能。掌握U-Boot的使用,將極大地方便嵌入式系統(tǒng)的開發(fā)。7.3.5U-Boot命令U-Boot上電啟動后,敲任意鍵可以退出自動啟動狀態(tài),進入命令行。

U-Boot1.1.2(Apr262005-12:27:13)U-Bootcode:11080000->1109614C

BSS:->1109A91CRAMConfiguration:Bank#0:1000000032MBMicronStrataFlashMT28F128J3deviceinitializedFlash:32MBIn:

serialOut:

serialErr:

serialHitanykeytostopautoboot:

0U-Boot>

在命令行提示符下,可以輸入U-Boot的命令并執(zhí)行。U-Boot可以支持幾十個常用命令,通過這些命令,可以對開發(fā)板進行調試,可以引導Linux內核,還可以擦寫Flash完成系統(tǒng)部署等功能。掌握這些命令的使用,才能夠順利地進行嵌入式系統(tǒng)的開發(fā)。輸入help命令,可以得到當前U-Boot的所有命令列表。每一條命令后面是簡單的命令說明。7.3.5U-Boot命令U-Boot還提供了更加詳細的命令幫助,通過help命令還可以查看每個命令的參數說明。

=>helpbootmbootm[addr[arg...]]

-bootapplicationimagestoredinmemory

passingarguments'arg...';whenbootingaLinuxkernel,

'arg'canbetheaddressofaninitrdimage

bootm命令可以引導啟動存儲在內存中的程序映像。這些內存包括RAM和可以永久保存的Flash。第1個參數addr是程序映像的地址,這個程序映像必須轉換成U-Boot的格式。第2個參數對于引導Linux內核有用,通常作為U-Boot格式的RAMDISK映像存儲地址;也可以是傳遞給Linux內核的參數(缺省情況下傳遞bootargs環(huán)境變量給內核)。7.3.5U-Boot命令=>helpbootpbootp[loadAddress][bootfilename]bootp命令通過bootp請求,要求DHCP服務器分配IP地址,然后通過TFTP協議下載指定的文件到內存。第1個參數是下載文件存放的內存地址。第2個參數是要下載的文件名稱,這個文件應該在開發(fā)主機上準備好。

=>helpcmpcmp[.b,.w,.l]addr1addr2count

-comparememory

cmp命令可以比較2塊內存中的內容。.b以字節(jié)為單位;.w以字為單位;.l以長字為單位。注意:cmp.b中間不能保留空格,需要連續(xù)敲入命令。第1個參數addr1是第一塊內存的起始地址。第2個參數addr2是第二塊內存的起始地址。第3個參數count是要比較的數目,單位按照字節(jié)、字或者長字。7.3.5U-Boot命令=>helpcpcp[.b,.w,.l]sourcetargetcount

-copymemory

cp命令可以在內存中復制數據塊,包括對Flash的讀寫操作。第1個參數source是要復制的數據塊起始地址。第2個參數target是數據塊要復制到的地址。這個地址如果在Flash中,那么會直接調用寫Flash的函數操作。所以U-Boot寫Flash就使用這個命令,當然需要先把對應Flash區(qū)域擦干凈。第3個參數count是要復制的數目,根據cp.bcp.wcp.l分別以字節(jié)、字、長字為單位。

=>helpcrc32crc32addresscount[addr]

-computeCRC32checksum[saveataddr]

crc32命令可以計算存儲數據的校驗和。第1個參數address是需要校驗的數據起始地址。第2個參數count是要校驗的數據字節(jié)數。第3個參數addr用來指定保存結果的地址。7.3.5U-Boot命令=>helperaseerasestartend

-eraseFLASHfromaddr'start'toaddr'end'eraseN:SF[-SL]

-erasesectorsSF-SLinFLASHbank#NerasebankN

-eraseFLASHbank#Neraseall

-eraseallFLASHbanks

erase命令可以擦Flash。參數必須指定Flash擦除的范圍。按照起始地址和結束地址,start必須是擦除塊的起始地址;end必須是擦除末尾塊的結束地址。這種方式最常用。舉例說明:擦除0x20000–0x3ffff區(qū)域命令為erase200003ffff。按照組和扇區(qū),N表示Flash的組號,SF表示擦除起始扇區(qū)號,SL表示擦除結束扇區(qū)號。另外,還可以擦除整個組,擦除組號為N的整個Flash組。擦除全部Flash只要給出一個all的參數即可。7.3.5U-Boot命令

=>helpgogoaddr[arg...]

-startapplicationataddress'addr'

passing'arg'asarguments

go命令可以執(zhí)行應用程序。第1個參數是要執(zhí)行程序的入口地址。第2個可選參數是傳遞給程序的參數,可以不用。

=>helpiminfoiminfoaddr[addr...]

-printheaderinformationforapplicationimagestartingat

address'addr'inmemory;thisincludesverificationofthe

imagecontents(magicnumber,headerandpayloadchecksums)

iminfo可以打印程序映像的開頭信息,包含了映像內容的校驗(序列號、頭和校驗和)。第1個參數指定映像的起始地址??蛇x的參數是指定更多的映像地址7.3.5U-Boot命令=>helploadbloadb[off][baud]

-loadbinaryfileoverseriallinewithoffset'off'andbaudrate'baud'

loadb命令可以通過串口線下載二進制格式文件。

=>helploadsloads[off]

-loadS-Recordfileoverseriallinewithoffset'off'

loads命令可以通過串口線下載S-Record格式文件。

=>helpmwmw[.b,.w,.l]addressvalue[count]

-writememory

mw命令可以按照字節(jié)、字、長字寫內存,.b.w.l的用法與cp命令相同。第1個參數address是要寫的內存地址。第2個參數value是要寫的值。第3個可選參數count是要寫單位值的數目。

=>helpnfsnfs[loadAddress][hostipaddr:bootfilename]

nfs命令可以使用NFS網絡協議通過網絡啟動映像。7.3.5U-Boot命令

=>helpflinfoflinfo

-printinformationforallFLASHmemorybanksflinfoN

-printinformationforFLASHmemorybank#N

flinfo命令打印全部Flash組的信息,也可以只打印其中某個組。一般嵌入式系統(tǒng)的Flash只有一個組。=>helpprintenvprintenv

-printvaluesofallenvironmentvariablesprintenvname...

-printvalueofenvironmentvariable'name'

printenv命令打印環(huán)境變量。可以打印全部環(huán)境變量,也可以只打印參數中列出的環(huán)境變量。=>helprarpbootrarpboot[loadAddress][bootfilename]

rarboot命令可以使用TFTP協議通過網絡啟動映像。也就是把指定的文件下載到指定地址,然后執(zhí)行。第1個參數是映像文件下載到的內存地址。第2個參數是要下載執(zhí)行的映像文件。

=>helprunrunvar[...]

-runthecommandsintheenvironmentvariable(s)'var'

run命令可以執(zhí)行環(huán)境變量中的命令,后面參數可以跟幾個環(huán)境變量名。

=>helpsetenvsetenvnamevalue...

-setenvironmentvariable'name'to'value...'setenv命令可以設置環(huán)境變量。第1個參數是環(huán)境變量的名稱。第2個參數是要設置的值,如果沒有第2個參數,表示刪除這個環(huán)境變量。7.3.5U-Boot命令7.3.5U-Boot命令=>helpsleepsleepN

-delayexecutionforNseconds(Nis_decimal_!!!)

sleep命令可以延遲N秒鐘執(zhí)行,N為十進制數。

=>helptftpboottftpboot[loadAddress][bootfilename]

tftpboot命令可以使用TFTP協議通過網絡下載文件。按照二進制文件格式下載。另外使用這個命令,必須配置好相關的環(huán)境變量。例如serverip和ipaddr。第1個參數loadAddress是下載到的內存地址。第2個參數是要下載的文件名稱,必須放在TFTP服務器相應的目錄下。7.3.5U-Boot命令U-Boot>printenvbootdelay=3baudrate=115200netmask=ethaddr=12:34:56:78:90:abbootfile=uImagebootargs=console=ttyS0,115200root=/dev/ramrwinitrd=0x30800000,8Mbootcmd=tftp0x30008000zImage;go0x30008000serverip=ipaddr=00stdin=serialstdout=serialstderr=serial

Environmentsize:337/131068bytesU-Boot的環(huán)境變量7.3.5U-Boot命令環(huán)境變量解釋說明bootdelay定義執(zhí)行自動啟動的等候秒數baudrate定義串口控制臺的波特率netmask定義以太網接口的掩碼ethaddr定義以太網接口的MAC地址bootfile定義缺省的下載文件bootargs定義傳遞給Linux內核的命令行參數bootcmd定義自動啟動時執(zhí)行的幾條命令serverip定義tftp服務器端的IP地址ipaddr定義本地的IP地址stdin定義標準輸入設備,一般是串口stdout定義標準輸出設備,一般是串口stderr定義標準出錯信息輸出設備,一般是串口

U-Boot環(huán)境變量的解釋說明

7.3.5U-Boot命令

=>setenvserverip

=>setenvipaddr

00=>setenvrootpath

"/usr/local/arm/3.3.2/rootfs"=>setenvbootargs

"root=/dev/nfsrwnfsroot=\$(serverip):\$(rootpath)ip=

\$(ipaddr)"=>setenvkernel_addr30000000=>setenvnfscmd

"tftp\$(kernel_addr)uImage;bootm\$(kernel_addr)"=>runnfscmd

上面定義的環(huán)境變量有serveripipaddrrootpathbootargskernel_addr。環(huán)境變量bootargs中還使用了環(huán)境變量,bootargs定義命令行參數,通過bootm命令傳遞給內核。環(huán)境變量nfscmd中也使用了環(huán)境變量,功能是把uImage下載到指定的地址并且引導起來。可以通過run命令執(zhí)行nfscmd腳本。7.3.5U-Boot命令U-Boot>ethaddr=3a:1f:34:08:54:54bootdelay=3baudrate=115200serverip=ipaddr=bootcmd=cp.b0xC00400000x222000000x00173C78;bootm0x22200000bootargs=mem=64Mconsole=ttyS0,115200root=/dev/mtdblock0rwrootfstype=jffs2stdin=serialstdout=serialstderr=serialEnvironmentsize:277/16380bytes7.3.5U-Boot命令jffs2啟動方式setenvbootcmdcp.b0xC00400000x222000000x00173C78\;bootm0x22200000setenvbootargsmem=64Mconsole=ttyAT0,115200root=/dev/mtdblock0rwrootfstype=jffs2NFS啟動方式setenvserveripsetenvipaddrsetenvbootargsmem=64Mconsole=ttyAT0115200root=/dev/nfsnfsroot=:/release/at91-rootfs-releaserwip=::::::eth0:offsaveenv7.3.6添加U-Boot命令(補充)U-Boot的每一個命令都是通過U_Boot_CMD宏定義的。這個宏在include/command.h頭文件中定義,每一個命令定義一個cmd_tbl_t結構體。

#defineU_BOOT_CMD(name,maxargs,rep,cmd,usage,help)\cmd_tbl_t__u_boot_cmd_##nameStruct_Section={#name,maxargs,rep,cmd,usage,help}

這樣每一個U-Boot命令有一個結構體來描述。結構體包含的成員變量:命令名稱、最大參數個數、重復數、命令執(zhí)行函數、用法、幫助。從控制臺輸入的命令是由common/command.c中的程序解釋執(zhí)行的。find_cmd()負責匹配輸入的命令,從列表中找出對應的命令結構體?;赨-Boot命令的基本框架,分析簡單的icache操作命令。7.3.6添加U-Boot命令(1)定義CACHE命令。在include/cmd_confdefs.h中定義了所有U-Boot命令的標志位。

#defineCFG_CMD_CACHE

0x00000010ULL

/*icache,dcache

*/

如果有更多的命令,也要在這里添加定義。(2)實現CACHE命令的操作函數。下面是common/cmd_cache.c文件中icache命令部分的代碼。

#if(CONFIG_COMMANDS&CFG_CMD_CACHE)staticinton_off(constchar*s){

//這個函數解析參數,判斷是打開cache,還是關閉cache

if(strcmp(s,"on")==0){

//參數為“on”

return(1);

}elseif(strcmp(s,"off")==0){

//參數為“off”

return(0);

}

return(-1);}7.3.6添加U-Boot命令intdo_icache(cmd_tbl_t*cmdtp,intflag,intargc,char*argv[]){

//對指令cache的操作函數

switch(argc){

case2:

/*參數個數為1,則執(zhí)行打開或者關閉指令cache操作*/

switch(on_off(argv[1])){

case0:

icache_disable();

//打開指令cache

break;

case1:

icache_enable();

//關閉指令cache

break;

}

/*FALLTROUGH*/

case1:

/*參數個數為0,則獲取指令cache狀態(tài)*/

printf("InstructionCacheis%s\n",

icache_status()?"ON":"OFF");

return0;

default:

//其他缺省情況下,打印命令使用說明

printf("Usage:\n%s\n",cmdtp->usage);

return1;

}

return0;}……7.3.6添加U-Boot命令U_Boot_CMD(//通過宏定義命令

icache,

2,

1,

do_icache,

//命令為icache,命令執(zhí)行函數為do_icache()

"icache

-enableordisableinstructioncache\n",

//幫助信息

"[on,off]\n"

"

-enableordisableinstructioncache\n");……#endif

U-Boot的命令都是通過結構體__U_Boot_cmd_##name來描述的。根據U_Boot_CMD在include/command.h中的兩行定義可以明白。

#defineU_BOOT_CMD(name,maxargs,rep,cmd,usage,help)\cmd_tbl_t__u_boot_cmd_##nameStruct_Section={#name,maxargs,rep,cmd,usage,help}

還有,不要忘了在common/Makefile中添加編譯的目標文件。7.3.6添加U-Boot命令(3)打開CONFIG_COMMANDS選項的命令標志位。這個程序文件開頭有#if語句需要預處理是否包含這個命令函數。CONFIG_COMMANDS選項在開發(fā)板的配置文件中定義。例如:SMDK2410平臺在include/configs/smdk2410.h中有如下定義。

/***********************************************************

*Commanddefinition

***********************************************************/#defineCONFIG_COMMANDS\

(CONFIG_CMD_DFL

|\

CFG_CMD_CACHE

|\

CFG_CMD_REGINFO

|\

CFG_CMD_DATE

|\

CFG_CMD_ELF)

按照這3步,就可以添加新的U-Boot命令7.3.7U-Boot啟動過程board/smsk2410/u-boot.lds這個鏈接腳本,可以知道目標程序的各部分鏈接順序。第一個要鏈接的是cpu/arm920t/start.o,那么U-Boot的入口指令一定位于這個程序中。7.3.7U-Boot啟動過程(補充)1.cpu/arm920t/start.S這個匯編程序是U-Boot的入口程序,開頭就是復位向量的代碼。2.lib_arm/board.cstart_armboot是U-Boot執(zhí)行的第一個C語言函數,完成系統(tǒng)初始化工作,進入主循環(huán),處理用戶輸入的命令。3.init_sequence[]init_sequence[]數組保存著基本的初始化函數指針。7.3.7U-Boot啟動過程init_fnc_t*init_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論