版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、嵌入式軟件開發(fā)簡介以linux為例,a,2,2,課程安排,嵌入式Linux開發(fā)環(huán)境搭建 嵌入式Linux概述 Linux快速入門 熟悉嵌入式開發(fā)平臺 熟悉引導(dǎo)啟動代碼和內(nèi)核的燒寫 NFS環(huán)境構(gòu)建,a,3,3,課程安排,嵌入式Linux下的應(yīng)用程序開發(fā) 嵌入式Linux開發(fā)工具與開發(fā)流程 理解交叉編譯 嵌入式Linux下的應(yīng)用程序調(diào)試技巧 Make工程管理器,a,4,4,嵌入式系統(tǒng)的特點(diǎn),嵌入式系統(tǒng)低功耗、體積小,專用性強(qiáng)。嵌入式系統(tǒng)與PC機(jī)的最大不同就是嵌入式CPU大多工作在為特定用戶群設(shè)計(jì)的系統(tǒng)中,能夠把PC機(jī)中許多由板卡完成的任務(wù)集成在芯片內(nèi)部,從而有利于嵌入式系統(tǒng)設(shè)計(jì)趨于小型化。 為了提
2、高執(zhí)行速度和系統(tǒng)可靠性,嵌入式系統(tǒng)中的軟件一般都固化在存儲器芯片或單片機(jī)本身中,而不是存貯于磁盤等載體中。 嵌入式系統(tǒng)的硬件和軟件都必須高效率地設(shè)計(jì),系統(tǒng)要精簡。操作系統(tǒng)一般和應(yīng)用軟件集成在一起。 對軟件代碼質(zhì)量要求很高。應(yīng)該盡最大可能避免死機(jī)的情況發(fā)生。 嵌入式系統(tǒng)開發(fā)需要專門的開發(fā)工具和開發(fā)環(huán)境,a,5,5,如何選擇嵌入式CPU,ARM PowerPC MIPS Xscale DSP X86,a,6,6,典型的嵌入式操作系統(tǒng),Linux uC/OS Windows CE VxWorks Palm OS Symbian,a,7,7,嵌入式系統(tǒng)開發(fā)流程,a,8,8,嵌入式系統(tǒng)開發(fā)的內(nèi)容,a,9
3、,9,嵌入式Linux開發(fā)模式,Linux,JTAG,CPU CORE,Flash,Target,Host,串口,網(wǎng)口,NFS模式,Root fs,a,10,10,Linux快速入門,a,11,11,Linux簡介,Linus Torvalds于1991編寫 Linux是一個Unix兼容的系統(tǒng),大部分通用的Unix工具和程序都可以在Linux系統(tǒng)下運(yùn)行。UNIX-堂兄 Linux表弟 使用GNU工具開發(fā): gcc,glibc,binutils,make等 GNU = GNU is Not Unix GPL = General Public License,a,12,12,一些發(fā)行版,RedHa
4、t Fedora Core Suse Debian Ubuntu Cent OS Aisanux,a,13,13,認(rèn)識Linux內(nèi)核版本,主版本 1.02.0 2,3年更新 穩(wěn)定版 2.0.402.2.12 2.4.18 2.6.7 2.6.30 1,2月更新 穩(wěn)定版更新 1,2周更新,a,14,14,Linux體系結(jié)構(gòu),用戶空間,內(nèi)核空間,shell,命令、程序或shell腳本,文件 系統(tǒng),I/O,中斷 異常 處理,內(nèi)存 管理,Cache,調(diào)度,系統(tǒng)調(diào)用(system calls,內(nèi)核,a,15,15,內(nèi)核結(jié)構(gòu),a,16,16,Linux
5、優(yōu)點(diǎn),提供了先進(jìn)的網(wǎng)絡(luò)支持 多任務(wù)、多用戶 符合IEEE POSIX標(biāo)準(zhǔn) 核心能仿真FPU 支持?jǐn)?shù)十種文件系統(tǒng)格式 完全運(yùn)行于保護(hù)模式 開放源代碼 采用先進(jìn)的內(nèi)存管理機(jī)制,更加有效地利用物理內(nèi)存,a,17,17,Linux分區(qū),Linux分區(qū)的形式 Swap分區(qū) 根分區(qū)/ Boot分區(qū) 其他,a,18,18,Linux的基本命令,Shell命令行使用技巧 :Tab自動補(bǔ)齊、 ctrl+a+e等 cd:轉(zhuǎn)換目錄 ls:列出文件名(根目錄瀏覽) ll:查看文件屬性(文件屬性與權(quán)限 ) cp:復(fù)制文件(cp /mnt/hgfs/share/*.* /root/) mv:移動文件(可用于文件或目錄的改
6、名) rm:刪除文件(rm rf (目標(biāo))) mkdir:創(chuàng)建目錄 rmdir:刪除目錄,a,19,19,Linux的基本命令(2,cat:顯示文本文件 less/more:分屏顯示文件 grep:查找字符串(ls all | grep *) head:顯示文件開頭 tail:顯示文件結(jié)尾 sort:按次序顯示文件 uniq:去掉文件中重復(fù)的行 diff:比較兩個文件 file:測試文件內(nèi)容,a,20,20,Linux的基本命令(3,echo:顯示文本 date:顯示時間和日期 gzip:壓縮文件 gunzip:解壓縮文件 bzip2:壓縮文件 tar:打包和解包文件 whereis:查找命令
7、 which:查找實(shí)用程序,a,21,21,Linux的基本命令(4,ps:列出進(jìn)程 df :檢查文件系統(tǒng)空間占用情況 du:顯示磁盤空間的使用情況 kill:殺死進(jìn)程 chmod :改變文件或目錄的訪問權(quán)限 chown:改變文件或目錄的屬主和組 chgrp:改變文件或目錄所屬的組 info:獲得幫助,a,22,22,Linux的基本命令(5,pwd:顯示當(dāng)前工作目錄的絕對路徑 rpm:文件包管理 clear:清屏 ln:創(chuàng)建文件鏈接 who:列出系統(tǒng)上的用戶名單 write:發(fā)送消息 talk:與其他用戶通信 man:獲取幫助,a,23,23,熟悉嵌入式開發(fā)平臺 熟悉引導(dǎo)啟動代碼和內(nèi)核的燒寫
8、,a,24,24,需要熟悉的內(nèi)容,開發(fā)板硬件基本配置 開發(fā)板與PC機(jī)連接方式 PC機(jī)相關(guān)配置 熟悉bootloader的使用 深入理解開發(fā)內(nèi)容 鞏固開發(fā)流程,a,25,25,Bootloader燒寫示范,Linux環(huán)境(虛擬機(jī))簡介 超級終端和DNW的配置 Bootloader的顯示信息簡介(標(biāo)準(zhǔn)BIOS) 內(nèi)核、文件系統(tǒng)的演示,a,26,26,嵌入式Linux下的應(yīng)用程序開發(fā),a,27,27,開發(fā)工具-編輯器vi,vi的基本使用方法,輸入模式,命令模式,a,28,28,vi-開始編輯,新增 (append)- a 從 光 標(biāo) 所 在 位 置 後 面 開 始 新 增 資 料, 光 標(biāo) 後 的
9、資 料 隨 新 增 資 料 向 後 移 動。- A 從 光 標(biāo) 所 在 列 最 後 面 的 地 方 開 始 新 增 資 料。 插 入 (insert) - i 從 光 標(biāo) 所 在 位 置 前 面 開 始 插 入 資 料, 光 標(biāo) 後 的 資 料 隨 新 增 資 料 向 後 移 動。- I 從 光 標(biāo)列 的 第 一 個 非 空 白 字 符 前 面 開 始 插 入 資 料。 開 始 (open)- o 在 光 標(biāo) 所 在 列 下 新 增 一 列 并 進(jìn) 入 輸 入 模 式。- O 在 光 標(biāo) 所 在 列 上 方 新 增 一 列 并 進(jìn) 入 輸 入 模 式,a,29,29,vi-刪除與修改,x 刪除
10、光標(biāo)所在字符。 dd 刪除光標(biāo)所在的列。 r 修改光標(biāo)所在字符,r後接著要修正的字符 R進(jìn)入取代狀態(tài),新增資料會覆改原先資料, 直到按ESC回到指令模式下為止。 s 刪除光標(biāo)所在字符,并進(jìn)入輸入模式。 S 刪除光標(biāo)所在的列,并進(jìn)入輸入模式,a,30,30,vi-退出命令,不保存退出 不保存強(qiáng)制性退出 保存編輯 存入文件filename 中 強(qiáng)制性存入文件filename 中 ()保存并退出(shift+zz,a,31,31,vi-光標(biāo)移動命令,移動到當(dāng)前單詞的開始 移動到當(dāng)前單詞的結(jié)尾 向前移動一個單詞 向前移動一個字符 向上移動一行 向下移動一行 向后移動一個字符,a,32,32,vi-改變
11、與替換操作命令,替換光標(biāo)所在的字符 替換字符序列 替換一個單詞 同 替換光標(biāo)所在的前一字符 替換自光標(biāo)位置至行尾的所有字符 同 替換當(dāng)前行,a,33,33,vi-拷貝與粘貼命令,將光標(biāo)所在單詞拷入剪貼板 將光標(biāo)至行尾的字符拷入剪貼板 同 將當(dāng)前行拷入剪貼板 將剪貼板中的內(nèi)容粘貼在光標(biāo)后 將剪貼板中的內(nèi)容粘貼在光標(biāo)前,利用Vi編寫一個helloworld程序,a,34,34,a,35,35,開發(fā)工具 -編譯器GCC,全稱為GNU CC ,GNU項(xiàng)目中符合ANSI C標(biāo)準(zhǔn)的編譯系統(tǒng) 編譯如C、C+、Object C、Java、Fortran、Pascal、Modula-3和Ada等多種語言 一個交
12、叉平臺編譯器 ,適合在嵌入式領(lǐng)域的開發(fā)編譯,a,36,36,GCC編譯器,GNU Compiler Collection C, C+, Objective-C, Fortran, Java, Ada ,GCC 4.2.2,GCC 2.95,July 31, 1999,GCC 3.0,June 18, 2001,GCC 3.2,August 14, 2002,GCC 3.3,May 13, 2003,Oct 9, 2007,December 3, 1997,a,37,37,GCC簡介,gcc所支持后綴名解釋 .cC原始程序 .C/.cc/.cxxC+原始程序 .
13、mObjective-C原始程序 .i已經(jīng)過預(yù)處理的C原始程序 .ii已經(jīng)過預(yù)處理的C+原始程序 .s/.S 匯編語言原始程序 .h預(yù)處理文件(頭文件) .o目標(biāo)文件 .a/.so編譯后的庫文件,a,38,38,編譯器的作用,Gcc的編譯流程分為四個步驟 預(yù)處理(Pre-Processing) 編譯(Compiling) 匯編(Assembling) 鏈接(Linking,a,39,39,hello”的演變歷程,a,40,40,理解交叉編譯及環(huán)境建立,a,41,41,GCC 交叉編譯器,GNU Binutils GNU Binutils 的主要工具有兩個,一個是連接程序ld,另外一個是匯編程序
14、as。其主要目的是為GNU 系統(tǒng),提供匯編和連接工具。 GNU GCC GNU GCC 就是上面提到的GCC,GCC 主要是為GNU 系統(tǒng)提供C 編譯器。現(xiàn)在支持多種語言,這其中包括C/C+、Fortran、Java、Objective-C、甚至還有Ada。 GNU GLibc 用于定義系統(tǒng)調(diào)用和其它一些基本的函數(shù)調(diào)用,a,42,42,GCC交叉編譯器的生成,第1步,取得Binutils、GCC、Glibc 源碼。 第2步,配置并編譯Binutils 取得我們所需要的匯編和連接程序。 第3步,配置并編譯GCC 源碼生成GCC 編譯器。一般是C 編譯器首先生成,然后以這個為基礎(chǔ)在結(jié)合下一步生成的
15、Glibc 的C 函數(shù)庫,再編譯生成其它編譯器。 第4步,配置Glibc 并編譯生成Glibc 的C 函數(shù)庫。 第5步,再次配置和編譯GCC 源碼,生成其它語言的編譯器,如C+編譯器等,a,43,43,工具鏈代碼結(jié)構(gòu),a,44,44,TARGET常用的值,a,45,45,交叉編譯流程,a,46,crosstool介紹,crosstool是由Dan Kegel開發(fā)的一套腳本程序,可以自動編譯不同版本的gcc、glibc,并做出測試。 在crosstool軟件包中,提供了從互聯(lián)網(wǎng)下載軟件包的腳本,例如glibc-get.sh腳本可以下載glibc軟件包。 有關(guān)crosstool的詳細(xì)信息,讀者可以
16、訪問其官方網(wǎng)站和其他一些網(wǎng)絡(luò)資源: http:/ http:/ /doc/debian-policy,46,,a,47,47,環(huán)境變量,Linux環(huán)境變量PATH 有關(guān)配置文件 etc/profile .bashrc,a,48,48,設(shè)置交叉編譯器的環(huán)境變量,etc/profile文件中的PATH定義了找存放命令的路徑,若把交叉編譯器的路徑在PATH中進(jìn)行定義,則執(zhí)行命令時就可以找到對應(yīng)的命令。 示例:使用2.95.3版本的交叉編譯器 將usr/local/arm/2.95.3/bin路徑添加到etc/profile文件中,并
17、用將原來的3.4.4的屏蔽(如果有的話),然后在etc路徑下執(zhí)行source profile。然后arm-linux-gcc v,如果顯示是2.9.53。則說明環(huán)境配置成功。 更改環(huán)境變量有幾種方法,其中之一是更改etc/profile文件(開機(jī)啟動時配置)中的PATH,將相沖突的屏蔽掉。 另一種方法是重新定義PATH,然后用export導(dǎo)出(export命令可以修改,但重啟之后?):可編輯/etc/bashrc文件,在最后增加路徑 export PATH=/usr/local/arm/2.95.3/bin:|$PATH,則以后編譯內(nèi)核或其它程序均可用arm-linux- 來制定交叉編譯器,a
18、,49,49,嵌入式Linux下的 應(yīng)用程序調(diào)試技巧,a,50,50,調(diào)試器-Gdb調(diào)試流程,首先使用gcc對test.c進(jìn)行編譯,注意一定要加上選項(xiàng)-g # gcc -g test.c -o test # gdb test GNU gdb Red Hat Linux (-1.21rh) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/
19、or distribute copies of it under certain conditions. Type show copying to see the conditions. There is absolutely no warranty for GDB. Type show warranty for details. This GDB was configured as i386-redhat-linux-gnu.Using host libthread_db library /lib/libthread_db.so.1. (gdb,a,51,51,Gdb調(diào)試流程,查看文件 (g
20、db) l 設(shè)置斷點(diǎn) (gdb) b 6 查看斷點(diǎn)情況 (gdb) info b 運(yùn)行代碼 (gdb) r,查看變量值 (gdb) p n 單步運(yùn)行 (gdb) n (gdb) s 恢復(fù)程序運(yùn)行 (gdb) c 幫助 (gdb) help command,a,52,52,Gdb的使用切記點(diǎn),在Gcc編譯選項(xiàng)中一定要加入-g。 只有在代碼處于“運(yùn)行”或“暫停”狀態(tài)時才能查看變量值。 設(shè)置斷點(diǎn)后程序在指定行之前停止,a,53,53,Gdb調(diào)試,運(yùn)行被調(diào)試程序,設(shè)置所有的能影響該程序的參數(shù)和變量。 保證被調(diào)試程序在指定的條件下停止運(yùn)行。 當(dāng)被調(diào)試程序停止時,讓開發(fā)工程師檢查發(fā)生了什么。 根據(jù)每次調(diào)試
21、器的提示信息來做響應(yīng)的改變,以便修正某個錯誤引起的問題,a,54,54,嵌入式程序調(diào)試-NFS,熟悉Uboot的燒寫方法和使用 按照實(shí)驗(yàn)指導(dǎo)配置tftp服務(wù) 按照實(shí)驗(yàn)指導(dǎo)配置NFS服務(wù) 利用NFS調(diào)試經(jīng)交叉編譯后的程序,a,55,55,Makefile簡介,a,56,56,工程管理器-Make,工程管理器,顧名思義,是指管理較多的文件 Make工程管理器也就是個“自動編譯管理器”,這里的“自動”是指它能構(gòu)根據(jù)文件時間戳自動發(fā)現(xiàn)更新過的文件而減少編譯的工作量,同時,它通過讀入Makefile文件文件的內(nèi)容來執(zhí)行大量的編譯工作 Make將只編譯改動的代碼文件,而不用完全編譯,a,57,57,Mak
22、efile基本結(jié)構(gòu),Makefile是Make讀入的唯一配置文件 由make工具創(chuàng)建的目標(biāo)體(target),通常是目標(biāo)文件或可執(zhí)行文件 要創(chuàng)建的目標(biāo)體所依賴的文件(dependency_file) 創(chuàng)建每個目標(biāo)體時需要運(yùn)行的命令(command) Makefile格式 target: dependency_files command 例子 hello.o: hello.c hello.h gcc c hello.c o hello.o,a,58,58,Makefile規(guī)則,隱式規(guī)則 隱含規(guī)則能夠告訴make怎樣使用傳統(tǒng)的技術(shù)完成任務(wù),這樣,當(dāng)用戶使用它們時就不必詳細(xì)指定編譯的具體細(xì)節(jié),而只需
23、把目標(biāo)文件列出即可 C編譯:.c變?yōu)?o $(CC) c $(CPPFLAGS) $(CFLAGS) C+編譯:.cc或.C變?yōu)?o $(CXX) -c $(CPPFLAGS) $(CXXFLAGS,a,59,59,Makefile規(guī)則,模式規(guī)則 模式規(guī)則是用來定義相同處理規(guī)則的多個文件的。它不同于隱式規(guī)則,隱式規(guī)則僅僅能夠用make默認(rèn)的變量來進(jìn)行操作,而模式規(guī)則還能引入用戶自定義變量,為多個文件建立相同的規(guī)則,從而簡化了Makefile的編寫 模式規(guī)則的格式類似于普通規(guī)則,這個規(guī)則中的相關(guān)文件前必須用“%”標(biāo)明,a,60,60,Make使用,直接運(yùn)行make 選項(xiàng) -C dir讀入指定目錄
24、下的Makefile-f file讀入當(dāng)前目錄下的file文件作為Makefile -i忽略所有的命令執(zhí)行錯誤 -I dir指定被包含的Makefile所在目錄 -n只打印要執(zhí)行的命令,但不執(zhí)行這些命令 -p顯示make變量數(shù)據(jù)庫和隱含規(guī)則 -s在執(zhí)行命令時不顯示命令 -w如果make在執(zhí)行過程中改變目錄,打印當(dāng)前目錄名,a,61,61,Autotools簡介,對于一個較大的項(xiàng)目而言編寫Makefile難度較大 autotools系列工具只需用戶輸入簡單的目標(biāo)文件、依賴文件、文件目錄等就可以輕松地生成Makefile autotools工具還可以完成系統(tǒng)配置信息的收集,從而可以方便地處理各種移
25、植性的問題 Linux上的軟件開發(fā)一般都用autotools來制作Makefile,a,62,62,autotools使用流程,a,63,63,使用Makefile,make 鍵入make默認(rèn)執(zhí)行make all命令,即目標(biāo)體為all make install 把該程序安裝到系統(tǒng)目錄中去 make clean 清除之前所編譯的可執(zhí)行文件及目標(biāo)文件(object file, *.o) make dist 將程序和相關(guān)的文檔打包為一個壓縮文檔以供發(fā)布,a,64,Shell腳本簡介,a,65,Shell腳本的本質(zhì),編譯型語言 解釋型語言 Shell腳本語言是解釋型語言 Shell腳本的本質(zhì): She
26、ll命令的有序集合,a,66,shell 編程的基本過程,基本過程分為三步,Step1. 建立 shell 文件 包含任意多行操作系統(tǒng)命令或shell命令的文本文件,Step2. 賦予shell文件執(zhí)行權(quán)限 用chmod命令修改權(quán)限,Step3. 執(zhí)行shell文件 直接在命令行上調(diào)用shell程序,a,67,Step1: 建立shell文件 (可用任何建立文本文件的方法) $ cat prog1 who | grep $1,Step2: 賦予執(zhí)行權(quán)限: (初始文本文件無執(zhí)行權(quán)限) $ chmod 740 prog1,Step3: 執(zhí)行該shell程序 $ prog1 wdl prog1: n
27、ot found (shell在標(biāo)準(zhǔn)搜索目錄中找不到prog1命令,Step4: 指定路徑或修改環(huán)境變量PATH后執(zhí)行shell程序 $ ./prog1 wdl wdl tty06 Feb 8 09:12,實(shí)例,a,68,Shell變量,Shell允許用戶建立變量存儲數(shù)據(jù),但不支持?jǐn)?shù)據(jù)類型(整型、字符、浮點(diǎn)型),將任何賦給變量的值都解釋為一串字符 Variable=value 命名規(guī)則同C+中的命名規(guī)則 count=1 Echo $count DATE=date Echo $DATE,a,69,shell變量,Bourne Shell主要有如下三種變量: 用戶自定義變量 位置變量即 shell
28、 script之參數(shù) 環(huán)境變量,a,70,用戶自定義變量,在shell編程中通常使用全大寫變量,方便識別 $ COUNT=1 變量的調(diào)用:在變量前加$ $ echo $HOME Linux Shell/bash從右向左賦值 $Y=y $ X=$Y $ echo $X y 使用unset命令刪除變量的賦值 $ Z=hello $ echo $Z hello $ unset Z $ echo $Z,a,71,位置變量,0 與鍵入的命令行一樣,包含腳本文件名 $1,$2,$9 分別包含第一個到第九個命令行參數(shù) $# 包含命令行參數(shù)的個數(shù) $ 包含所有命令行參數(shù):“$1,$2,$9” $? 包含前一個
29、命令的退出狀態(tài) $* 包含所有命令行參數(shù):“$1,$2,$9” $ 包含正在執(zhí)行進(jìn)程的ID號,a,72,shell環(huán)境變量,CDPATH:用于cd命令的查找路徑 HOME: /etc/passwd文件中列出的用戶主目錄 IFS:Internal Field Separator,默認(rèn)為空格,tab及換行符 MAIL:/var/mail/$USERNAME mail等程序使用 PATH :路徑 PS1,PS2:默認(rèn)提示符($)及換行提示符() TERM:終端類型,常用的有vt100,ansi,vt200,xterm等,a,73,文件測試,d name 測試name 是否為一個目錄 -f name
30、測試name 是否為普通文件 -L name測試name 是否為符號鏈接 -r name 測試name 文件是否存在且為可讀 -w name 測試name 文件是否存在且為可寫 -x name 測試name 文件是否存在且為可執(zhí)行 -s name 測試name 文件是否存在且其長度不為0 f1 -nt f2 測試f1 是否比f2 更新 f1 -ot f2 測試f1 是否比f2 更舊,a,74,ifthenfi 語法結(jié)構(gòu): if 表達(dá)式 then 命令表 fi 如果表達(dá)式為真, 則執(zhí)行命令表中的命令; 否則退出if語句, 即執(zhí)行fi后面的語句. if和fi是條件語句的語句括號, 必須成對使用;命
31、令表中的命令可以是一條, 也可以是若干條,條件語句,a,75,caseesac 多路分支語句case用于多重條件測試, 語法結(jié)構(gòu)清晰自然. 其語法結(jié)構(gòu)為: case 字符串變量 in 模式1) 命令表1 ; 模式2) 命令表2 ; 模式n) 命令表n ; esac,case語句只能檢測字符串變量,各模式中可用文件名元字符,以右括號結(jié)束,命令表以單獨(dú)的雙分號行結(jié)束,退出case語句,模式 n常寫為字符* 表示所有其它模式,最后一個雙分號行可以省略,多路分支語句,a,76,fordodone 當(dāng)循環(huán)次數(shù)已知或確定時, 使用for循環(huán)語句來多次執(zhí)行一條或一組命令。 循環(huán)體由語句括號do和done來限
32、定。格式為: for 變量名 in 單詞表 do 命令表 done 變量依次取單詞表中的各個單詞, 每取一次單詞, 就執(zhí)行一次循環(huán)體中的命令. 循環(huán)次數(shù)由單詞表中的單詞數(shù)確定. 命令表中的命令可以是一條, 也可以是由分號或換行符分開的多條。 如果單詞表是命令行上的所有位置參數(shù)時, 可以在for語句中省略 “in 單詞表” 部分,循環(huán)語句,a,77,whiledodone 語法結(jié)構(gòu)為: while 命令或表達(dá)式 do 命令表 done while語句首先測試其后的命令或表達(dá)式的值,如果為真,就執(zhí)行一次循環(huán)體中的命令,然后再測試該命令或表達(dá)式的值,執(zhí)行循環(huán)體,直到該命令或表達(dá)式為假時退出循環(huán)。 w
33、hile語句的退出狀態(tài)為命令表中被執(zhí)行的最后一條命令的退出狀態(tài),循環(huán)語句,a,78,78,實(shí)驗(yàn)內(nèi)容,熟悉開發(fā)環(huán)境的搭建 熟悉BIOS、Uboot的使用,NFS的配置 編寫簡單的C程序 使用GDB調(diào)試有問題的C代碼 編寫簡單的Makefile 編寫簡單的SHELL腳步,Bootloader,a,80,,80,內(nèi)容提綱,a,81,什么是Bootloader,Bootloader是硬件啟動的引導(dǎo)程序,是啟動操作系統(tǒng)的根本; 是在操作系統(tǒng)內(nèi)核或用戶應(yīng)用程序運(yùn)行之前運(yùn)行的一段小程序。通過這段小程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的
34、狀態(tài),以便為最終調(diào)用準(zhǔn)備好環(huán)境; 在一般典型的系統(tǒng)中,整個系統(tǒng)的加載啟動任務(wù)就完全由Bootloader來完成,,81,a,82,Bootloader不屬于操作系統(tǒng)內(nèi)核,采用匯編語言編寫,因此針對不同的CPU體系結(jié)構(gòu),這一部分代碼不具有可移植性; 在移植操作系統(tǒng)時,這部分代碼必須加以改寫。 Bootloader不但依賴于CPU的體系結(jié)構(gòu),而且依賴于嵌入式系統(tǒng)板級設(shè)備的配置,Bootloader的特點(diǎn),a,83,啟動加載模式:在這種模式下,Bootloader從目標(biāo)機(jī)上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個過程并沒有用戶的介入。 下載模式:在這種模式下
35、,目標(biāo)機(jī)上的Bootloader將通過串口或網(wǎng)絡(luò)等通信手段從開發(fā)主機(jī)(Host)上下載內(nèi)核映像和根文件系統(tǒng)映像等到RAM中。然后可以再被 Bootloader寫到目標(biāo)機(jī)上的固態(tài)存儲媒質(zhì)中,或者直接進(jìn)行系統(tǒng)的引導(dǎo),Bootloader的操作模式,a,84,初始化硬件 將操作系統(tǒng)內(nèi)核從Flash拷貝到SDRAM中,如果是壓縮格式的內(nèi)核,還要解壓縮 改寫系統(tǒng)的內(nèi)存映射,原先Flash起始地址映射為0地址,這時需要將RAM的起始地址映射為0 提供Linux內(nèi)核的啟動參數(shù) 啟動Linux內(nèi)核 設(shè)置堆棧指針并將bss段清零將來執(zhí)行C語言程序和調(diào)用子函數(shù)時要用到 改變pc值,使得CPU開始執(zhí)行真正的操作系統(tǒng)
36、內(nèi)核,Bootloader的特征,a,85,Bootloader的啟動,系統(tǒng)加電或復(fù)位后,所有CPU都會從某個地址開始執(zhí)行 嵌入式系統(tǒng)的開發(fā)板都要把板上ROM或FLASH映射到這個地址。因此,必須把Bootloader程序存儲在相應(yīng)的FLASH位置。系統(tǒng)加電后,CPU將首先執(zhí)行它,,85,a,86,屏蔽所有的中斷。為中斷提供服務(wù)通常是 OS 設(shè)備驅(qū)動程序的責(zé)任,因此在 Boot Loader 的執(zhí)行全過程中可以不必響應(yīng)任何中斷 設(shè)置 CPU 的速度和時鐘頻率 RAM 初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存庫控制寄存器等 初始化 LED。其目的是
37、表明系統(tǒng)的狀態(tài)。如果板子上沒有 LED,可以通過初始化 UART 向串口打印 Bootloader 的 Logo 字符信息來完成這一點(diǎn) 關(guān)閉CPU內(nèi)部I/D cache 為加載 stage2 準(zhǔn)備 RAM 空間,跳轉(zhuǎn)到 stage2的C入口點(diǎn),Bootloader的第一階段,a,87,初始化本階段要使用到的硬件設(shè)備; 檢測系統(tǒng)內(nèi)存映射; 將內(nèi)核映像和根文件系統(tǒng)映像從Flash讀到RAM; 為內(nèi)核設(shè)置啟動參數(shù); 調(diào)用內(nèi)核,Bootloader的第二階段,a,88,一些bootloader介紹,a,89,Configuration file /boot/grub/menu.lst /boot/gr
38、ub/grub.conf default=0 timeout=10 splashimage=(hd0,1)/boot/grub/splash.xpm.gz title MicroSoft Windows XP rootnoverify (hd0,0) chainloader +1 title Red Hat Linux (2.4.20-8) root (hd0,1) kernel /boot/vmlinuz-2.4.20-8 ro root=LABEL=/ initrd /boot/initrd-2.4.20-8.img,配置GRUB,a,90,U-Boot是ARM bootloader標(biāo)準(zhǔn)
39、armboot 加入到 ppcboot 形成了 u-boot 支持arm720, arm920, arm926, sa1100, xscale http:/ Blob blob是LART工程使用的bootloader 移植到多個ARM平臺上 http:/www.lart.tudelft.nl/lartware/blob Redboot,ARM Bootloaders,a,91,FS2410開發(fā)板提供的BIOS,,91,a,92,DRAM控制器,DRAM芯片不能向其它微處理器總線資源那樣直接讀寫,它們需要特殊的硬件控制器使能讀寫循環(huán)。 設(shè)置DRAM控制器需要詳細(xì)了解D
40、RAM體系結(jié)構(gòu)、控制器本身、 DRAM芯片使用的規(guī)范和全面的硬件設(shè)計(jì)。 Bootloader首先要完成的就是使能內(nèi)存子系統(tǒng)。初始化內(nèi)存以后,內(nèi)存可以作為一種資源進(jìn)行使用,,92,a,93,,93,內(nèi)容提綱,a,94,u-boot(Universal Boot Loader)是德國DENX小組的開發(fā)用于多種嵌入式CPU的bootloader程序。遵循GPL條款; 從FADSROM、8xxROM 、PPCBOOT逐步發(fā)展演化而來; 當(dāng)前版本號:見include/version.h中的定義,U-boot介紹,a,95,平臺相關(guān) board, c
41、pu, lib_ppc, lib_arm, include 平臺無關(guān) common, net, fs, drivers 工具和文檔 tools, doc,U-Boot程序結(jié)構(gòu),a,96,U-Boot程序結(jié)構(gòu),a,97,U-Boot程序結(jié)構(gòu),a,98,在 Flash 中運(yùn)行匯編程序,將 Flash 中的啟動代碼部分復(fù)制到 SDRAM 中,同時創(chuàng)造環(huán)境準(zhǔn)備運(yùn)行 C 程序; 在 SDRAM 中執(zhí)行,對硬件進(jìn)行初始化; 設(shè)置內(nèi)核參數(shù)的標(biāo)記列表,復(fù)制鏡像文件,進(jìn)入內(nèi)核的入口函數(shù),U-Boot 啟動過程的幾個階段,a,99,99,初始化硬件 設(shè)置UART 設(shè)置網(wǎng)口 設(shè)置USB 檢測存儲器 設(shè)置啟動參數(shù) 內(nèi)
42、核硬件信息 波特率 跳轉(zhuǎn)到Linux內(nèi)核的首地址 消亡,BootLoader的生命周期,a,100,設(shè)置異常的入口地址和異常處理函數(shù); 配置 PLLCON 寄存器,確定系統(tǒng)的主頻; 屏蔽看門狗和中斷;初始化 I/O 寄存器; 關(guān)閉 MMU 功能; 調(diào)用 /board/smdk2410 中的lowlevel_init.S ,初始化存儲器空間,設(shè)置刷新頻率; 將 U-Boot 的內(nèi)容復(fù)制到 SDRAM 中; 設(shè)置堆棧的大?。?ldr pc, _start_armboot ) ; 設(shè)置程序編譯連接的起始地址( config.mk: TEXT_BASE = 0 x33F80000,U-Boot入口函數(shù)
43、start.S,a,101,系統(tǒng)復(fù)位代碼 ldr pc, _start_armboot _start_armboot: .word start_armboot 表示u-boot完成cpu初始化,將跳轉(zhuǎn)到C程序中間。 start_armboot完成設(shè)備初始化過程,進(jìn)入main_loop循環(huán)。 start_armboot - lib_arm/board.c,cpu/arm920t/start.S,a,102,mrsr0,cpsr bicr0,r0,#0 x1f ; 位清零 orrr0,r0,#0 xd3 ; 邏輯或0 xd3= 1101 0011 msrcpsr,r0,復(fù)位,a,103,模式位含義
44、,a,104,ldr r0, =pWTCON mov r1, #0 x0 str r1, r0,關(guān)閉看門狗,a,105,movr1, #0 xffffffff ldrr0, =INTMR strr1, r0,關(guān)閉中斷,a,106,movr0, #0 mcrp15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ mcrp15, 0, r0, c8, c7, 0 /* flush v4 TLB *,刷新指令/數(shù)據(jù)緩存,a,107,mrcp15, 0, r0, c1, c0, 0 bicr0, r0, #0 x00002300 clear bits 13, 9:8
45、 (-V- -RS) bicr0, r0, #0 x00000087 clear bits 7, 2:0 (B- -CAM orrr0, r0, #0 x00000002 set bit 2 (A) Align orrr0, r0, #0 x00001000 set bit 12 (I) I-Cache mcrp15, 0, r0, c1, c0, 0,禁用MMU和緩存,a,108,板級相關(guān),/board/lowlevel_init.S movip, lr bllowlevel_init movlr, ip movpc, lr,設(shè)置RAM,a,109,globl lowlevel_initlo
46、wlevel_init: ldr r0, =SMRDATA ldrr1, _TEXT_BASE subr0, r0, r1 ldrr1, =BWSCON add r2, r0, #13*40: ldr r3, r0, #4 str r3, r1, #4 cmp r2, r0 bne 0b,lowlevel_init,a,110,調(diào)試u-boot時,開始一般是讓它在RAM中運(yùn)行,當(dāng)RAM運(yùn)行通過后才將其固化到FLASH中;這樣如果我們當(dāng)前的代碼是通過BDI2000等Load到內(nèi)存直接運(yùn)行的話,u-boot就不需要去將自己從Flash搬移到內(nèi)存了;而如果u-boot是固化在Flash中在CPU復(fù)位
47、后由第一個片選信號指向開始執(zhí)行的話,則有一個從Flash搬移到內(nèi)存的過程,重定位(Relocate)的概念,a,111,relocate:/* relocate U-Boot to RAM */ adrr0, _start/*當(dāng)前代碼的地址信息 */ ldrr1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* dont reloc during debug */ beq stack_setup ldrr2, _armboot_start ldrr3, _armboot_end subr2, r3, r2/* r2
48、 - size of armboot */ addr2, r0, r2/* r2 - source end address */ copy_loop: ldmiar0!, r3-r10/* copy from source address r0 */ stmiar1!, r3-r10/* copy to target address r1 */ cmpr0, r2/* until source end addreee r2 */ blecopy_loop,重定位的實(shí)現(xiàn),a,112,lib_arm/board.c void start_armboot (void) size = flash_in
49、it (); display_flash_config (size); for (;) main_loop ();,start_armboot,a,113,系統(tǒng)調(diào)用 memcpy() 函數(shù)將內(nèi)核從 flash 和 ramdisk 復(fù)制到 SDRAM 中,具體如下: memcpy(void *)0 x30008000, (void *)0 x40000, 0 x100000) ; / 復(fù)制數(shù)據(jù)塊 memcpy(void *)0 x30800000, (void *)0 x140000, 0 x440000) ; / 復(fù)制數(shù)據(jù)塊,調(diào)用內(nèi)核啟動函數(shù) do_bootm_linux(,0 x300080
50、00 是內(nèi)核在 SDRAM 中的起始地址 0 x40000 是內(nèi)核在 Flash 中的位置 0 x100000 是數(shù)據(jù)塊的大小,a,114,編譯U-boot,U-boot的源碼是通過gcc和Makefile組織編譯的。頂層目錄下的Makefile首先可以設(shè)置開發(fā)板的定義,然后遞歸地調(diào)用各級子目錄下的Makefile,最后把編譯過的程序鏈接成u-boot映像。 頂層目錄下的Makefile 它負(fù)責(zé)u-boot整體配置編譯。每一種開發(fā)板在Makefile都需要有板子配置的定義。 配置u-boot: make smdk2410_config 編譯: make,,114,a
51、,115,U-BOOT編譯生成的映像文件,,115,a,116,U-boot命令介紹,Printenv 打印環(huán)境變量。 Uboot printenvbaudrate=115200ipaddr=ethaddr=12:34:56:78:9A:BCserverip=,,116,a,117,U-boot命令介紹,setenv 設(shè)置新的變量 Uboot setenv myboard AT91RM9200DKUboot printenvbaudrate=115200ipaddr=eth
52、addr=12:34:56:78:9A:BCserverip=myboard=AT91RM9200DKEnvironment size: 102/8188 bytes saveenv 將當(dāng)前定義的所有的變量及其值存入flash中,,117,a,118,U-boot命令介紹,tftp 通過網(wǎng)絡(luò)下載程序 Uboot setenv ethaddr 12:34:56:78:9A:BCUboot setenv ipaddr Uboot setenv serverip 54Uboot tftp 20000000
53、application.bin Uboot tftp 30200000 zImage Loadb 通過串口Kermit協(xié)議下載二進(jìn)制數(shù)據(jù),,118,a,119,U-boot命令介紹,md 顯示內(nèi)存區(qū)的內(nèi)容。 mm 修改內(nèi)存,地址自動遞增。 nm 修改內(nèi)存,地址不自動遞增。 mw 填充內(nèi)存。 mtest 測試內(nèi)存。 cp 拷貝一塊內(nèi)存到另一塊。 cmp 比較兩塊內(nèi)存區(qū)。 mw 0 x32000000 ff 0 x10000,,119,a,120,U-boot命令介紹,Protect 寫保護(hù)操作 protect on 1:0-3(就是對第一塊
54、FLASH的0-3扇區(qū)進(jìn)行保護(hù)) protect off 1:0-3取消寫保護(hù) erase 擦除扇區(qū) erase: 刪除FLASH的扇區(qū) erase 1:0-2(就是對每一塊FLASH的0-2扇區(qū)進(jìn)行刪除,,120,a,121,U-boot命令介紹,run 執(zhí)行設(shè)置好的腳本 Uboot setenv flashit tftp 20000000 mycode.bin; erase 10020000 1002FFFF;cp.b 20000000 10020000 8000 Uboot saveenv Uboot run flashit bootcmd 保留的環(huán)境變量 如
55、果定義了該變量,在autoboot模式下,將會執(zhí)行該腳本的內(nèi)容,,121,a,122,U-boot命令介紹,go 執(zhí)行內(nèi)存中的二進(jìn)制代碼,一個簡單的跳轉(zhuǎn)到指定地址 bootm 執(zhí)行內(nèi)存中的二進(jìn)制代碼 要求二進(jìn)制代碼為制定格式的。通常為mkimage處理過的二進(jìn)制文件。啟動Uboot工具制作的壓縮Linux內(nèi)核 bootp 通過網(wǎng)絡(luò)啟動,需要提前設(shè)置好硬件地址,,122,a,123,U-boot命令介紹,usb reset 復(fù)位(rescan) USB 控制器 usb stop f - 停止USB usb tree - 顯示USB 設(shè)備樹
56、usb info dev 顯示可用的USB設(shè)備 usb storage - 顯示USB存儲設(shè)備詳細(xì)信息 usb dev dev - show or set current USB storage device usb part dev - print partition table of one or all USB storage devices usb read addr blk# cnt - read cnt blocks starting at block blk# to memory address addr,,123,a,124,U-boot命令介紹,n
57、and info: 顯示NAND 設(shè)備 nand device dev:顯示或設(shè)置當(dāng)前設(shè)備 nand bad 顯示壞塊 nand read.jffs2s addr off size nand write.jffs2 addr off size nand erase clean off size nand read.oob addr off size nand write.oob addr off size,,124,a,125,U-boot命令介紹,nfs nfs 32000000 :aa.txt 把中的NFS文件系統(tǒng)中的
58、aa.txt 讀入內(nèi)存0 x32000000處,,125,配置編譯LINUX內(nèi)核,a,127,內(nèi)容提綱,a,128, wget /pub/linux/kernel/. wget /././linux-*.bz2.sign gpg verify linux-2.xx.tar.bz2.sign tar jxvf linux-2.xx.tar.bz2,下載內(nèi)核,a,129,內(nèi)核配置與編譯,使用補(bǔ)丁升級 如果你有一個版本可以到下載相應(yīng)的升級補(bǔ)丁 如果想從2.4
59、.26 升級到 2.4.27 則可以 wget -c /pub/linux/kernel/v2.4/patch-2.4.27.bz2 wget /pub/linux/kernel/v2.4/patch-2.4.27.bz2.sign 如果想從 2.6.11 升級到 2 則可以 wget /pub/linux/kernel/v2.6/patch-2.bz2 wget /pub/linux/kernel/v2.6/patch-2.bz2.sign 確認(rèn)下載的補(bǔ)丁是否正確 gpg verify patch-2.4.27.bz2.sign 為內(nèi)核代碼打補(bǔ)丁 cd linux2.4.26/ bzcat ./patch-2.4.27.bz2 | patch -p1 cd . mv linux-2.4.26 linux-2.4.27,a,130,init kernel mm ipc lib fs net drivers,Linux內(nèi)核結(jié)構(gòu),arch,i386 arm ppc m68k sh,include,a,131,查看完整命令行 make V = 1 刪除生成的文件 make clea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度二零二五年度新型環(huán)保肥料研發(fā)與應(yīng)用協(xié)議4篇
- 《現(xiàn)代企業(yè)與組織》課件
- 二零二五年度足浴店員工勞動合同與職業(yè)素養(yǎng)培訓(xùn)
- 2025年度銷售人員銷售區(qū)域管理合同范本
- 二零二五飯店短期客房清潔工勞務(wù)服務(wù)合同
- 水庫水面環(huán)境保護(hù)與美化2025年度承包合同2篇
- 2025年度租房意外責(zé)任賠償及責(zé)任分擔(dān)協(xié)議
- 2025年銀行貸款居間中介服務(wù)合同規(guī)范文本
- 2025年度電商直播帶貨合作推廣合同
- 二零二五年度電梯維保與電梯安全責(zé)任保險合同
- 獅子王影視鑒賞
- 一年級數(shù)學(xué)加減法口算題每日一練(25套打印版)
- 2024年甘肅省武威市、嘉峪關(guān)市、臨夏州中考英語真題
- DL-T573-2021電力變壓器檢修導(dǎo)則
- 繪本《圖書館獅子》原文
- 安全使用公共WiFi網(wǎng)絡(luò)的方法
- 2023年管理學(xué)原理考試題庫附答案
- 【可行性報告】2023年電動自行車相關(guān)項(xiàng)目可行性研究報告
- 歐洲食品與飲料行業(yè)數(shù)據(jù)與趨勢
- 放療科室規(guī)章制度(二篇)
- 中高職貫通培養(yǎng)三二分段(中職階段)新能源汽車檢測與維修專業(yè)課程體系
評論
0/150
提交評論