




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
嵌入式操作系統(tǒng)河北工業(yè)大學(xué)信息工程學(xué)院范書瑞第7章嵌入式操作系統(tǒng)及開發(fā)簡述7.1嵌入式Linux簡介17.2構(gòu)建Linux開發(fā)環(huán)境27.3引導(dǎo)程序移植37.4Linux內(nèi)核移植47.5
構(gòu)建文件系統(tǒng)57.6應(yīng)用程序開發(fā)63河北工業(yè)大學(xué)信息工程學(xué)院范書瑞2024/4/26嵌入式Linux開發(fā)步驟應(yīng)用程序開發(fā)根文件系統(tǒng)內(nèi)核引導(dǎo)程序開發(fā)環(huán)境4河北工業(yè)大學(xué)信息工程學(xué)院范書瑞2024/4/26嵌入式系統(tǒng)開發(fā)模型嵌入式開發(fā)成本6河北工業(yè)大學(xué)信息工程學(xué)院范書瑞2024/4/26
7.3引導(dǎo)程序移植7.3.5U-Boot常用命令7.3.4U-Boot移植思路7.3.3U-Boot編譯7.3.2U-Boot工程簡介7.3.1BootLoader種類BootLoader系統(tǒng)加電或復(fù)位后,所有CPU都會(huì)從某個(gè)地址開始執(zhí)行,這是由處理器設(shè)計(jì)決定的。ARM處理器在復(fù)位時(shí)從地址0x00000000取第一條指令。嵌入式系統(tǒng)的開發(fā)板都要把板上ROM或Flash映射到這個(gè)地址。因此,必須把BootLoader程序存儲在相應(yīng)的Flash位置。系統(tǒng)加電后,CPU將首先執(zhí)行它。主機(jī)和目標(biāo)機(jī)之間一般有串口可以連接,BootLoader軟件通常會(huì)通過串口來輸入輸出。例如:輸出出錯(cuò)或者執(zhí)行結(jié)果信息到串口終端,從串口終端讀取用戶控制命令等。BootLoader啟動(dòng)過程通常是多階段的,這樣既能提供復(fù)雜的功能,又有很好的可移植性。例如:從Flash啟動(dòng)的BootLoader多數(shù)是兩階段的啟動(dòng)過程。Bootloader的主要功能是引導(dǎo)操作系統(tǒng)啟動(dòng),可以提供各種啟動(dòng)方式。啟動(dòng)方式網(wǎng)絡(luò)啟動(dòng)磁盤啟動(dòng)Flash啟動(dòng)操作系統(tǒng)網(wǎng)絡(luò)啟動(dòng)方式不需要配置較大的存儲介質(zhì),跟無盤工作站有點(diǎn)類似。Bootloader安裝到板上的EPROM或者Flash中。Bootloader通過以太網(wǎng)接口遠(yuǎn)程下載Linux內(nèi)核映像或者文件系統(tǒng)。使用這種方式也有前提條件:就是目標(biāo)板有串口、以太網(wǎng)接口。在服務(wù)器上配置啟動(dòng)相關(guān)網(wǎng)絡(luò)服務(wù)。網(wǎng)絡(luò)啟動(dòng)示意圖磁盤啟動(dòng)方式傳統(tǒng)的Linux系統(tǒng)運(yùn)行在臺式機(jī)或者服務(wù)器上,這些計(jì)算機(jī)一般都使用BIOS引導(dǎo),并且使用磁盤作為存儲介質(zhì)。如果進(jìn)入BIOS設(shè)置菜單,可以探測處理器、內(nèi)存、硬盤等設(shè)備,可以設(shè)置BIOS從軟盤、光盤或者某塊硬盤啟動(dòng)。也就是說,BIOS并不直接引導(dǎo)操作系統(tǒng)。那么在硬盤的主引導(dǎo)區(qū),還需要一個(gè)Bootloader。這個(gè)Bootloader可以從磁盤文件系統(tǒng)中把操作系統(tǒng)引導(dǎo)起來。Linux傳統(tǒng)上是通過LILO(LInuxLOader)引導(dǎo)的,后來又出現(xiàn)了GNU的軟件GRUB(GRandUnifiedBootloader)。這2種Bootloader廣泛應(yīng)用在X86的Linux系統(tǒng)上。開發(fā)主機(jī)使用了其中一種,熟悉它們有助于配置多種系統(tǒng)引導(dǎo)功能。Flash啟動(dòng)方式Bootloader一般放在Flash的底端或者頂端,這要根據(jù)處理器的復(fù)位向量設(shè)置。要使Bootloader的入口位于處理器上電執(zhí)行第一條指令的位置。接下來分配參數(shù)區(qū),這里可以作為Bootloader的參數(shù)保存區(qū)域。再下來內(nèi)核映像區(qū)。Bootloader引導(dǎo)Linux內(nèi)核,就是要從這個(gè)地方把內(nèi)核映像解壓到RAM中去,然后跳轉(zhuǎn)到內(nèi)核映像入口執(zhí)行。然后是文件系統(tǒng)區(qū)。如果使用Ramdisk文件系統(tǒng),則需要Bootloader把它解壓到RAM中。如果使用JFFS2文件系統(tǒng),將直接掛接為根文件系統(tǒng)。7.3引導(dǎo)程序移植“BootLoader”和“Monitor”
“BootLoader”只是引導(dǎo)設(shè)備并且執(zhí)行主程序的固件;“Monitor”還提供了更多的命令行接口,可以進(jìn)行調(diào)試、讀寫內(nèi)存、燒寫Flash、配置環(huán)境變量等?!癕onitor”在嵌入式系統(tǒng)開發(fā)過程中可以提供很好的調(diào)試功能,開發(fā)完成以后,就完全設(shè)置成了一個(gè)“BootLoader”。所以,習(xí)慣上大家把它們統(tǒng)稱為BootLoader。7.3.1BootLoader的種類7.3.1BootLoader的種類BootloaderMonitor描
述x86ARMPowerPCLILO否Linux磁盤引導(dǎo)程序是否否GRUB否GNU的LILO替代程序是否否Loadlin否從DOS引導(dǎo)Linux是否否ROLO否從ROM引導(dǎo)Linux而不需要BIOS是否否Etherboot否通過以太網(wǎng)卡啟動(dòng)Linux系統(tǒng)的固件是否否LinuxBIOS否完全替代BUIS的Linux引導(dǎo)程序是否否BLOB否LART等硬件平臺的引導(dǎo)程序否是否U-boot是通用引導(dǎo)程序是是是RedBoot是基于eCos的引導(dǎo)程序是是是開放源碼的Linux引導(dǎo)程序7.3.1BootLoader的種類LILO軟件工程是由WernerAlmesberger創(chuàng)建,專門為引導(dǎo)Linux開發(fā)的?,F(xiàn)在LILO的維護(hù)者是JohnCoffman,最新版本下載站點(diǎn):。LILO有詳細(xì)的文檔,例如LILO套件中附帶使用手冊和參考手冊。此外,還可以在LDP的“LILOmini-HOWTO”中找到LILO的使用指南。GRUB是GNU計(jì)劃的主要bootloader。GRUB最初是由ErichBoleyn為GNUMach操作系統(tǒng)撰寫的引導(dǎo)程序。后來有GordonMatzigkeit和OkujiYoshinori接替Erich的工作,繼續(xù)維護(hù)和開發(fā)GRUB。GRUB的網(wǎng)站/software/grub/上有對套件使用的說明文件,叫作《GRUBmanual》。GRUB能夠使用TFTP和BOOTP或者DHCP通過網(wǎng)絡(luò)啟動(dòng),這種功能對于系統(tǒng)開發(fā)過程很有用。X86的工作站和服務(wù)器上一般使用LILO和GRUB。LILO是Linux發(fā)行版主流的Bootloader。不過RedhatLinux發(fā)行版已經(jīng)使用了GRUB,GRUB比LILO有更有好的顯示界面,使用配置也更加靈活方便。7.3.1BootLoader的種類ARM處理器的芯片商很多,所以每種芯片的開發(fā)板都有自己的Bootloader。結(jié)果ARMbootloader也變得多種多樣。最早有為ARM720處理器的開發(fā)板的固件,又有了armboot,StrongARM平臺的blob,還有S3C2410處理器開發(fā)板上的vivi等?,F(xiàn)在armboot已經(jīng)并入了U-Boot,所以U-Boot也支持ARM/XSCALE平臺。U-Boot已經(jīng)成為ARM平臺事實(shí)上的標(biāo)準(zhǔn)Bootloader。PowerPC平臺的處理器有標(biāo)準(zhǔn)的Bootloader,就是ppcboot。PPCBOOT在合并armboot等之后,創(chuàng)建了U-Boot,成為各種體系結(jié)構(gòu)開發(fā)板的通用引導(dǎo)程序。U-Boot仍然是PowerPC平臺的主要Bootloader。值得說明的是Redboot,它幾乎能夠支持所有的體系結(jié)構(gòu),包括MIPS、SH、M68K等體系結(jié)構(gòu)。Redboot是以eCos為基礎(chǔ),采用GPL許可的開源軟件工程。現(xiàn)在由coreeCos的開發(fā)人員維護(hù),源碼下載網(wǎng)站是/snapshots。Redboot的文檔也相當(dāng)完善,有詳細(xì)的使用手冊《RedBootUser’sGuide》。7.3.2U-Boot工程簡介最早,DENX軟件工程中心的WolfgangDenk基于8xxrom的源碼創(chuàng)建了PPCBOOT工程,并且不斷添加處理器的支持。后來,SysgoGmbh把ppcboot移植到ARM平臺上,創(chuàng)建了ARMboot工程。然后以ppcboot工程和armboot工程為基礎(chǔ),創(chuàng)建了U-Boot工程?,F(xiàn)在U-Boot已經(jīng)能夠支持PowerPC、ARM、X86、MIPS體系結(jié)構(gòu)的上百種開發(fā)板,已經(jīng)成為功能最多、靈活性最強(qiáng)并且開發(fā)最積極的開放源碼Bootloader。U-Boot的源碼包可以從sourceforge網(wǎng)站下載,還可以訂閱該網(wǎng)站活躍的U-BootUsers郵件論壇,這個(gè)郵件論壇對于U-Boot的開發(fā)和使用都很有幫助。U-Boot軟件包下載網(wǎng)站:/project/u-boot。U-Boot郵件列表網(wǎng)站:/lists/listinfo/u-boot-users/。DENX相關(guān)的網(wǎng)站:http://www.denx.de/re/DPLG.html。7.3.2U-Boot工程簡介1處理器體系結(jié)構(gòu)或者開發(fā)板硬件直接相關(guān)2一些通用的函數(shù)或者驅(qū)動(dòng)程序3U-Boot的應(yīng)用程序、工具或者文檔U-Boot源碼結(jié)構(gòu)7.3.2U-Boot工程簡介目
錄特
性解釋說明board平臺依賴存放電路板相關(guān)的目錄文件,例如:RPXlite(mpc8xx)、smdk2410(arm920t)、sc520_cdp(x86)等目錄cpu平臺依賴存放CPU相關(guān)的目錄文件,例如:mpc8xx、ppc4xx、arm720t、arm920t、xscale、i386等目錄lib_ppc平臺依賴存放對PowerPC體系結(jié)構(gòu)通用的文件,主要用于實(shí)現(xiàn)PowerPC平臺通用的函數(shù)lib_arm平臺依賴存放對ARM體系結(jié)構(gòu)通用的文件,主要用于實(shí)現(xiàn)ARM平臺通用的函數(shù)lib_i386平臺依賴存放對X86體系結(jié)構(gòu)通用的文件,主要用于實(shí)現(xiàn)X86平臺通用的函數(shù)include通用頭文件和開發(fā)板配置文件,所有開發(fā)板的配置文件都在configs目錄下common通用通用的多功能函數(shù)實(shí)現(xiàn)lib_generic通用通用庫函數(shù)的實(shí)現(xiàn)7.3.2U-Boot工程簡介目
錄特
性解釋說明Net通用存放網(wǎng)絡(luò)的程序Fs通用存放文件系統(tǒng)的程序Post通用存放上電自檢程序drivers通用通用的設(shè)備驅(qū)動(dòng)程序,主要有以太網(wǎng)接口的驅(qū)動(dòng)Disk通用硬盤接口程序Rtc通用RTC的驅(qū)動(dòng)程序Dtt通用數(shù)字溫度測量器或者傳感器的驅(qū)動(dòng)examples應(yīng)用例程一些獨(dú)立運(yùn)行的應(yīng)用程序的例子,例如helloworldtools工具存放制作S-Record或者U-Boot格式的映像等工具,例如mkimageDoc文檔開發(fā)使用文檔7.3.3U-Boot的編譯U-Boot的源碼是通過GCC和Makefile組織編譯的。頂層目錄下的Makefile首先可以設(shè)置開發(fā)板的定義,然后遞歸地調(diào)用各級子目錄下的Makefile,最后把編譯過的程序鏈接成U-Boot映像。1.頂層目錄下的Makefile它負(fù)責(zé)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的編譯文件內(nèi)容正是根據(jù)Makefile對開發(fā)板的配置生成的。
ARCH
=armCPU
=arm920tBOARD
=smdk2410SOC
=s3c24x0
include/config.mk文件定義了ARCH、CPU、BOARD、SOC這些變量。這樣硬件平臺依賴的目錄文件可以根據(jù)這些定義來確定。。SMDK2410平臺相關(guān)目錄如下。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的編譯選項(xiàng)和規(guī)則在頂層目錄的config.mk文件中定義。各種體系結(jié)構(gòu)通用的規(guī)則直接在這個(gè)文件中定義。通過ARCH、CPU、BOARD、SOC等變量為不同硬件平臺定義不同選項(xiàng)。不同體系結(jié)構(gòu)的規(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
//處理器相關(guān)的目標(biāo)文件…LIBS
=lib_generic/libgeneric.a
//定義依賴的目錄,每個(gè)目錄下先把目標(biāo)文件連接成*.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缺省的編譯目標(biāo)為all,包括u-boot.srec、u-boot.bin、System.map。u-boot.srec和u-boot.bin又依賴于U-Boot。U-Boot就是通過ld命令按照u-boot.map地址表把目標(biāo)文件組裝成u-boot。U-Boot映像編譯的依賴關(guān)系7.3.3U-Boot的編譯除了編譯過程Makefile以外,還要在程序中為開發(fā)板定義配置選項(xiàng)或者參數(shù)。這個(gè)頭文件是include/configs/<board_name>.h。<board_name>用相應(yīng)的BOARD定義代替。這個(gè)頭文件中主要定義了兩類變量。一類是選項(xiàng),前綴是CONFIG_,用來選擇處理器、設(shè)備接口、命令、屬性等。例如:
#define
CONFIG_ARM920T
1#define
CONFIG_DRIVER_CS8900
1
另一類是參數(shù),前綴是CFG_,用來定義總線頻率、串口波特率、Flash地址等參數(shù)。例如:
#define
CFG_FLASH_BASE
0x00000000#defineCFG_PROMPT
"=>"開發(fā)板配置頭文件7.3.3U-Boot的編譯根據(jù)對Makefile的分析,編譯分為2步。第1步配置,例如:makesmdk2410_config;第2步編譯,執(zhí)行make就可以了。編譯完成后,可以得到U-Boot各種格式的映像文件和符號表,文件名稱說
明System.mapU-Boot映像的符號表u-bootU-Boot映像的ELF格式u-boot.binU-Boot映像原始的二進(jìn)制格式u-boot.srecU-Boot映像的S-Record格式編譯結(jié)果7.3.4U-Boot的移植移植U-Boot的基本步驟如下。(1)在頂層Makefile中為開發(fā)板添加新的配置選項(xiàng),使用已有的配置項(xiàng)目為例。
smdk2410_config
:
unconfig
@./mkconfig$(@:_config=)armarm920tsmdk2410NULLs3c24x0
參考上面2行,添加下面2行。
fs2410_config
:
unconfig
@./mkconfig$(@:_config=)armarm920tfs2410NULLs3c24x0
(2)創(chuàng)建一個(gè)新目錄存放開發(fā)板相關(guān)的代碼,并且添加文件。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ù)制參考開發(fā)板的配置文件,再修改。例如:$cpinclude/configs/smdk2410.h
include/configs/fs2410.h如果是為一顆新的CPU移植,還要?jiǎng)?chuàng)建一個(gè)新的目錄存放CPU相關(guān)的代碼。(4)配置開發(fā)板$makefs2410_config(5)編譯U-Boot執(zhí)行make命令,編譯成功可以得到U-Boot映像。有些錯(cuò)誤是跟配置選項(xiàng)是有關(guān)系的,通常打開某些功能選項(xiàng)會(huì)帶來一些錯(cuò)誤,一開始可以盡量跟參考板配置相同。7.3.4U-Boot的移植(6)添加驅(qū)動(dòng)或者功能選項(xiàng)在能夠編譯通過的基礎(chǔ)上,還要實(shí)現(xiàn)U-Boot的以太網(wǎng)接口、Flash擦寫等功能。對于FS2410開發(fā)板的以太網(wǎng)驅(qū)動(dòng)和smdk2410完全相同,所以可以直接使用。CS8900驅(qū)動(dòng)程序文件如下。drivers/cs8900.cdrivers/cs8900.h對于Flash的選擇就麻煩多了,F(xiàn)lash芯片價(jià)格或者采購方面的因素都有影響。多數(shù)開發(fā)板大小、型號不都相同。所以還需要移植Flash的驅(qū)動(dòng)。每種開發(fā)板目錄下一般都有flash.c這個(gè)文件,需要根據(jù)具體的Flash類型修改。例如:board/fs2410/flash.c(7)調(diào)試U-Boot源代碼,直到U-Boot在開發(fā)板上能夠正常啟動(dòng)。7.3.5U-Boot命令U-Boot是“Monitor”。除了Bootloader的系統(tǒng)引導(dǎo)功能,它還有用戶命令接口,提供了一些復(fù)雜的調(diào)試、讀寫內(nèi)存、燒寫Flash、配置環(huán)境變量等功能。掌握U-Boot的使用,將極大地方便嵌入式系統(tǒng)的開發(fā)。7.3.5U-Boot命令U-Boot上電啟動(dòng)后,敲任意鍵可以退出自動(dòng)啟動(dòng)狀態(tài),進(jìn)入命令行。
U-Boot1.1.2(Apr262005-12:27:13)U-Bootcode:11080000->1109614C
BSS:->1109A91CRAMConfiguration:Bank#0:1000000032MBMicronStrataFlashMT28F128J3deviceinitializedFlash:32MBIn:
serialOut:
serialErr:
serialHitanykeytostopautoboot:
0U-Boot>
在命令行提示符下,可以輸入U(xiǎn)-Boot的命令并執(zhí)行。U-Boot可以支持幾十個(gè)常用命令,通過這些命令,可以對開發(fā)板進(jìn)行調(diào)試,可以引導(dǎo)Linux內(nèi)核,還可以擦寫Flash完成系統(tǒng)部署等功能。掌握這些命令的使用,才能夠順利地進(jìn)行嵌入式系統(tǒng)的開發(fā)。輸入help命令,可以得到當(dāng)前U-Boot的所有命令列表。每一條命令后面是簡單的命令說明。7.3.5U-Boot命令U-Boot還提供了更加詳細(xì)的命令幫助,通過help命令還可以查看每個(gè)命令的參數(shù)說明。
=>helpbootmbootm[addr[arg...]]
-bootapplicationimagestoredinmemory
passingarguments'arg...';whenbootingaLinuxkernel,
'arg'canbetheaddressofaninitrdimage
bootm命令可以引導(dǎo)啟動(dòng)存儲在內(nèi)存中的程序映像。這些內(nèi)存包括RAM和可以永久保存的Flash。第1個(gè)參數(shù)addr是程序映像的地址,這個(gè)程序映像必須轉(zhuǎn)換成U-Boot的格式。第2個(gè)參數(shù)對于引導(dǎo)Linux內(nèi)核有用,通常作為U-Boot格式的RAMDISK映像存儲地址;也可以是傳遞給Linux內(nèi)核的參數(shù)(缺省情況下傳遞bootargs環(huán)境變量給內(nèi)核)。7.3.5U-Boot命令=>helpbootpbootp[loadAddress][bootfilename]bootp命令通過bootp請求,要求DHCP服務(wù)器分配IP地址,然后通過TFTP協(xié)議下載指定的文件到內(nèi)存。第1個(gè)參數(shù)是下載文件存放的內(nèi)存地址。第2個(gè)參數(shù)是要下載的文件名稱,這個(gè)文件應(yīng)該在開發(fā)主機(jī)上準(zhǔn)備好。
=>helpcmpcmp[.b,.w,.l]addr1addr2count
-comparememory
cmp命令可以比較2塊內(nèi)存中的內(nèi)容。.b以字節(jié)為單位;.w以字為單位;.l以長字為單位。注意:cmp.b中間不能保留空格,需要連續(xù)敲入命令。第1個(gè)參數(shù)addr1是第一塊內(nèi)存的起始地址。第2個(gè)參數(shù)addr2是第二塊內(nèi)存的起始地址。第3個(gè)參數(shù)count是要比較的數(shù)目,單位按照字節(jié)、字或者長字。7.3.5U-Boot命令=>helpcpcp[.b,.w,.l]sourcetargetcount
-copymemory
cp命令可以在內(nèi)存中復(fù)制數(shù)據(jù)塊,包括對Flash的讀寫操作。第1個(gè)參數(shù)source是要復(fù)制的數(shù)據(jù)塊起始地址。第2個(gè)參數(shù)target是數(shù)據(jù)塊要復(fù)制到的地址。這個(gè)地址如果在Flash中,那么會(huì)直接調(diào)用寫Flash的函數(shù)操作。所以U-Boot寫Flash就使用這個(gè)命令,當(dāng)然需要先把對應(yīng)Flash區(qū)域擦干凈。第3個(gè)參數(shù)count是要復(fù)制的數(shù)目,根據(jù)cp.bcp.wcp.l分別以字節(jié)、字、長字為單位。
=>helpcrc32crc32addresscount[addr]
-computeCRC32checksum[saveataddr]
crc32命令可以計(jì)算存儲數(shù)據(jù)的校驗(yàn)和。第1個(gè)參數(shù)address是需要校驗(yàn)的數(shù)據(jù)起始地址。第2個(gè)參數(shù)count是要校驗(yàn)的數(shù)據(jù)字節(jié)數(shù)。第3個(gè)參數(shù)addr用來指定保存結(jié)果的地址。7.3.5U-Boot命令=>helperaseerasestartend
-eraseFLASHfromaddr'start'toaddr'end'eraseN:SF[-SL]
-erasesectorsSF-SLinFLASHbank#NerasebankN
-eraseFLASHbank#Neraseall
-eraseallFLASHbanks
erase命令可以擦Flash。參數(shù)必須指定Flash擦除的范圍。按照起始地址和結(jié)束地址,start必須是擦除塊的起始地址;end必須是擦除末尾塊的結(jié)束地址。這種方式最常用。舉例說明:擦除0x20000–0x3ffff區(qū)域命令為erase200003ffff。按照組和扇區(qū),N表示Flash的組號,SF表示擦除起始扇區(qū)號,SL表示擦除結(jié)束扇區(qū)號。另外,還可以擦除整個(gè)組,擦除組號為N的整個(gè)Flash組。擦除全部Flash只要給出一個(gè)all的參數(shù)即可。7.3.5U-Boot命令
=>helpgogoaddr[arg...]
-startapplicationataddress'addr'
passing'arg'asarguments
go命令可以執(zhí)行應(yīng)用程序。第1個(gè)參數(shù)是要執(zhí)行程序的入口地址。第2個(gè)可選參數(shù)是傳遞給程序的參數(shù),可以不用。
=>helpiminfoiminfoaddr[addr...]
-printheaderinformationforapplicationimagestartingat
address'addr'inmemory;thisincludesverificationofthe
imagecontents(magicnumber,headerandpayloadchecksums)
iminfo可以打印程序映像的開頭信息,包含了映像內(nèi)容的校驗(yàn)(序列號、頭和校驗(yàn)和)。第1個(gè)參數(shù)指定映像的起始地址??蛇x的參數(shù)是指定更多的映像地址7.3.5U-Boot命令=>helploadbloadb[off][baud]
-loadbinaryfileoverseriallinewithoffset'off'andbaudrate'baud'
loadb命令可以通過串口線下載二進(jìn)制格式文件。
=>helploadsloads[off]
-loadS-Recordfileoverseriallinewithoffset'off'
loads命令可以通過串口線下載S-Record格式文件。
=>helpmwmw[.b,.w,.l]addressvalue[count]
-writememory
mw命令可以按照字節(jié)、字、長字寫內(nèi)存,.b.w.l的用法與cp命令相同。第1個(gè)參數(shù)address是要寫的內(nèi)存地址。第2個(gè)參數(shù)value是要寫的值。第3個(gè)可選參數(shù)count是要寫單位值的數(shù)目。
=>helpnfsnfs[loadAddress][hostipaddr:bootfilename]
nfs命令可以使用NFS網(wǎng)絡(luò)協(xié)議通過網(wǎng)絡(luò)啟動(dòng)映像。7.3.5U-Boot命令
=>helpflinfoflinfo
-printinformationforallFLASHmemorybanksflinfoN
-printinformationforFLASHmemorybank#N
flinfo命令打印全部Flash組的信息,也可以只打印其中某個(gè)組。一般嵌入式系統(tǒng)的Flash只有一個(gè)組。=>helpprintenvprintenv
-printvaluesofallenvironmentvariablesprintenvname...
-printvalueofenvironmentvariable'name'
printenv命令打印環(huán)境變量??梢源蛴∪凯h(huán)境變量,也可以只打印參數(shù)中列出的環(huán)境變量。=>helprarpbootrarpboot[loadAddress][bootfilename]
rarboot命令可以使用TFTP協(xié)議通過網(wǎng)絡(luò)啟動(dòng)映像。也就是把指定的文件下載到指定地址,然后執(zhí)行。第1個(gè)參數(shù)是映像文件下載到的內(nèi)存地址。第2個(gè)參數(shù)是要下載執(zhí)行的映像文件。
=>helprunrunvar[...]
-runthecommandsintheenvironmentvariable(s)'var'
run命令可以執(zhí)行環(huán)境變量中的命令,后面參數(shù)可以跟幾個(gè)環(huán)境變量名。
=>helpsetenvsetenvnamevalue...
-setenvironmentvariable'name'to'value...'setenv命令可以設(shè)置環(huán)境變量。第1個(gè)參數(shù)是環(huán)境變量的名稱。第2個(gè)參數(shù)是要設(shè)置的值,如果沒有第2個(gè)參數(shù),表示刪除這個(gè)環(huán)境變量。7.3.5U-Boot命令7.3.5U-Boot命令=>helpsleepsleepN
-delayexecutionforNseconds(Nis_decimal_!!!)
sleep命令可以延遲N秒鐘執(zhí)行,N為十進(jìn)制數(shù)。
=>helptftpboottftpboot[loadAddress][bootfilename]
tftpboot命令可以使用TFTP協(xié)議通過網(wǎng)絡(luò)下載文件。按照二進(jìn)制文件格式下載。另外使用這個(gè)命令,必須配置好相關(guān)的環(huán)境變量。例如serverip和ipaddr。第1個(gè)參數(shù)loadAddress是下載到的內(nèi)存地址。第2個(gè)參數(shù)是要下載的文件名稱,必須放在TFTP服務(wù)器相應(yīng)的目錄下。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í)行自動(dòng)啟動(dòng)的等候秒數(shù)baudrate定義串口控制臺的波特率netmask定義以太網(wǎng)接口的掩碼ethaddr定義以太網(wǎng)接口的MAC地址bootfile定義缺省的下載文件bootargs定義傳遞給Linux內(nèi)核的命令行參數(shù)bootcmd定義自動(dòng)啟動(dòng)時(shí)執(zhí)行的幾條命令serverip定義tftp服務(wù)器端的IP地址ipaddr定義本地的IP地址stdin定義標(biāo)準(zhǔn)輸入設(shè)備,一般是串口stdout定義標(biāo)準(zhǔn)輸出設(shè)備,一般是串口stderr定義標(biāo)準(zhǔn)出錯(cuò)信息輸出設(shè)備,一般是串口
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定義命令行參數(shù),通過bootm命令傳遞給內(nèi)核。環(huán)境變量nfscmd中也使用了環(huán)境變量,功能是把uImage下載到指定的地址并且引導(dǎo)起來??梢酝ㄟ^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啟動(dòng)方式setenvbootcmdcp.b0xC00400000x222000000x00173C78\;bootm0x22200000setenvbootargsmem=64Mconsole=ttyAT0,115200root=/dev/mtdblock0rwrootfstype=jffs2NFS啟動(dòng)方式setenvserveripsetenvipaddrsetenvbootargsmem=64Mconsole=ttyAT0115200root=/dev/nfsnfsroot=:/release/at91-rootfs-releaserwip=::::::eth0:offsaveenv7.3.6添加U-Boot命令(補(bǔ)充)U-Boot的每一個(gè)命令都是通過U_Boot_CMD宏定義的。這個(gè)宏在include/command.h頭文件中定義,每一個(gè)命令定義一個(gè)cmd_tbl_t結(jié)構(gòu)體。
#defineU_BOOT_CMD(name,maxargs,rep,cmd,usage,help)\cmd_tbl_t__u_boot_cmd_##nameStruct_Section={#name,maxargs,rep,cmd,usage,help}
這樣每一個(gè)U-Boot命令有一個(gè)結(jié)構(gòu)體來描述。結(jié)構(gòu)體包含的成員變量:命令名稱、最大參數(shù)個(gè)數(shù)、重復(fù)數(shù)、命令執(zhí)行函數(shù)、用法、幫助。從控制臺輸入的命令是由common/command.c中的程序解釋執(zhí)行的。find_cmd()負(fù)責(zé)匹配輸入的命令,從列表中找出對應(yīng)的命令結(jié)構(gòu)體?;赨-Boot命令的基本框架,分析簡單的icache操作命令。7.3.6添加U-Boot命令(1)定義CACHE命令。在include/cmd_confdefs.h中定義了所有U-Boot命令的標(biāo)志位。
#defineCFG_CMD_CACHE
0x00000010ULL
/*icache,dcache
*/
如果有更多的命令,也要在這里添加定義。(2)實(shí)現(xiàn)CACHE命令的操作函數(shù)。下面是common/cmd_cache.c文件中icache命令部分的代碼。
#if(CONFIG_COMMANDS&CFG_CMD_CACHE)staticinton_off(constchar*s){
//這個(gè)函數(shù)解析參數(shù),判斷是打開cache,還是關(guān)閉cache
if(strcmp(s,"on")==0){
//參數(shù)為“on”
return(1);
}elseif(strcmp(s,"off")==0){
//參數(shù)為“off”
return(0);
}
return(-1);}7.3.6添加U-Boot命令intdo_icache(cmd_tbl_t*cmdtp,intflag,intargc,char*argv[]){
//對指令cache的操作函數(shù)
switch(argc){
case2:
/*參數(shù)個(gè)數(shù)為1,則執(zhí)行打開或者關(guān)閉指令cache操作*/
switch(on_off(argv[1])){
case0:
icache_disable();
//打開指令cache
break;
case1:
icache_enable();
//關(guān)閉指令cache
break;
}
/*FALLTROUGH*/
case1:
/*參數(shù)個(gè)數(shù)為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í)行函數(shù)為do_icache()
"icache
-enableordisableinstructioncache\n",
//幫助信息
"[on,off]\n"
"
-enableordisableinstructioncache\n");……#endif
U-Boot的命令都是通過結(jié)構(gòu)體__U_Boot_cmd_##name來描述的。根據(jù)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中添加編譯的目標(biāo)文件。7.3.6添加U-Boot命令(3)打開CONFIG_COMMANDS選項(xiàng)的命令標(biāo)志位。這個(gè)程序文件開頭有#if語句需要預(yù)處理是否包含這個(gè)命令函數(shù)。CONFIG_COMMANDS選項(xiàng)在開發(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啟動(dòng)過程board/smsk2410/u-boot.lds這個(gè)鏈接腳本,可以知道目標(biāo)程序的各部分鏈接順序。第一個(gè)要鏈接的是cpu/arm920t/start.o,那么U-Boot的入口指令一定位于這個(gè)程序中。7.3.7U-Boot啟動(dòng)過程(補(bǔ)充)1.cpu/arm920t/start.S這個(gè)匯編程序是U-Boot的入口程序,開頭就是復(fù)位向量的代碼。2.lib_arm/board.cstart_armboot是U-Boot執(zhí)行的第一個(gè)C語言函數(shù),完成系統(tǒng)初始化工作,進(jìn)入主循環(huán),處理用戶輸入的命令。3.init_sequence[]init_sequence[]數(shù)組保存著基本的初始化函數(shù)指針。7.3.7U-Boot啟動(dòng)過程init_fnc_t*init_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 轉(zhuǎn)向齒條項(xiàng)目風(fēng)險(xiǎn)識別與評估綜合報(bào)告
- 2025-2030年中國洛葉項(xiàng)目投資可行性研究分析報(bào)告
- 2025-2030年中國爬蟲食品行業(yè)深度研究分析報(bào)告
- 手推車萬向輪項(xiàng)目投資可行性研究分析報(bào)告(2024-2030版)
- 超市員工勞動(dòng)合同7篇
- 2025年國家海域使用權(quán)租約合同范文
- 復(fù)式店面租賃合同6篇
- 荒山承包合同三篇-承包合同8篇
- 2025年別墅開發(fā)承包合同樣本
- 2025年臨時(shí)物品有償保管合同
- 小學(xué)安全教育四年級
- 2024年上海市中考英語試題和答案
- 開題報(bào)告:實(shí)現(xiàn)綜合育人價(jià)值的中學(xué)勞動(dòng)教育課程體系研究
- 《人工智能:AIGC基礎(chǔ)與應(yīng)用》題庫 填空題
- 文本數(shù)據(jù)質(zhì)量評估標(biāo)準(zhǔn)-洞察分析
- 品管圈PDCA案例-中醫(yī)醫(yī)院減少住院患者艾灸燙傷率醫(yī)院改善成果匯報(bào)
- 血透護(hù)士進(jìn)修匯報(bào)
- Python程序設(shè)計(jì) 課件 第4章 字符串、列表、元組和文件
- 《換床單套被套》(課件)勞動(dòng)四年級上冊
- “學(xué)-訓(xùn)-評”一體化師范生實(shí)踐能力培養(yǎng)模式的探索與實(shí)踐
- 錢三強(qiáng)完整版本
評論
0/150
提交評論