版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式系統(tǒng)開(kāi)發(fā)編撰閩江學(xué)院計(jì)算機(jī)實(shí)驗(yàn)教學(xué)中心印制52目 錄實(shí)驗(yàn)一 linux 常用工具實(shí)驗(yàn) 1實(shí)驗(yàn)二 makefile 實(shí)驗(yàn) 9實(shí)驗(yàn)三 cross-gdb實(shí)驗(yàn) 18實(shí)驗(yàn)四 嵌入式gui 應(yīng)用程序?qū)嶒?yàn) 22實(shí)驗(yàn)五 驅(qū)動(dòng)程序結(jié)構(gòu)實(shí)驗(yàn) 31實(shí)驗(yàn)六 qt/e 移植實(shí)驗(yàn) 37實(shí)驗(yàn)七 串口通訊實(shí)驗(yàn) 42實(shí)驗(yàn)八 webserver 的移植與網(wǎng)絡(luò)通訊實(shí)驗(yàn) 48實(shí)驗(yàn)一 實(shí)驗(yàn)?zāi)康?、了解minicom 配置串口通信參數(shù)的過(guò)程,掌握利用minicom 進(jìn)行傳輸文件方法2、了解網(wǎng)絡(luò)文件系統(tǒng)nfs 的配置,掌握利用nfs 進(jìn)行文件的傳輸和異地運(yùn)行目標(biāo)板程序3、掌握f(shuō)tp 的使用方法實(shí)驗(yàn)環(huán)境1、裝有l(wèi)inux 操作系統(tǒng)的
2、pc 機(jī)一臺(tái);2、xsbase270 或xsbase255 arm 實(shí)驗(yàn)開(kāi)發(fā)平臺(tái)一套實(shí)驗(yàn)內(nèi)容閱讀相關(guān)知識(shí),完成以下實(shí)驗(yàn):一、minicom 的使用實(shí)驗(yàn)內(nèi)容1、將目標(biāo)機(jī)與pc 機(jī)相連,利用minicom s 正確設(shè)置串口的參數(shù),啟動(dòng)目標(biāo)機(jī),記錄pc機(jī)顯示的內(nèi)容2、關(guān)閉目標(biāo)板,利用minicom s 重新設(shè)置串口參數(shù),啟動(dòng)目標(biāo)機(jī),記錄pc 機(jī)顯示的現(xiàn)象3、利用串口通信向目標(biāo)機(jī)下載光盤中example 目錄下的hello 應(yīng)用程序,同時(shí)運(yùn)行該應(yīng)用程序。記錄文件下載在目標(biāo)板目錄和下載文件的基本步驟。二、網(wǎng)絡(luò)文件系統(tǒng)nfs 的配置及應(yīng)用實(shí)驗(yàn)內(nèi)容1、通過(guò)網(wǎng)絡(luò)文件系統(tǒng)的配置將主機(jī)的其他目錄(如/root/e
3、mdoor 目錄),并掛載到目標(biāo)機(jī)上,記錄設(shè)置的步驟。2、將主機(jī)example 目錄下的arm 程序hello 復(fù)制到主機(jī)的網(wǎng)絡(luò)文件系統(tǒng)目錄上,在目標(biāo)機(jī)的掛載目錄運(yùn)行該程序,記錄運(yùn)行結(jié)果并寫(xiě)出你的結(jié)論3、將目標(biāo)機(jī)其他目錄上的文件復(fù)制到網(wǎng)絡(luò)文件系統(tǒng)掛載的目錄上,然后到主機(jī)上查看文件是否完成傳輸。4、將主機(jī)上其他目錄上的文件復(fù)制到網(wǎng)絡(luò)文件系統(tǒng)掛載的目錄上,然后到目標(biāo)機(jī)掛載網(wǎng)絡(luò)文件系統(tǒng)的目錄中將該文件復(fù)制到目標(biāo)機(jī)其他目錄上,重新啟動(dòng)目標(biāo)機(jī)系統(tǒng)查看文件是否復(fù)制成功。最后寫(xiě)出你的結(jié)論。三、ftp 實(shí)驗(yàn)內(nèi)容1、將example 目錄下的文件cxcore.lib 文件通過(guò)ftp 直接傳輸?shù)侥繕?biāo)板的/usr/
4、lib 目錄下,記錄通過(guò)ftp 傳輸文件的基本步驟,并與通過(guò)串口傳輸文件進(jìn)行比較,寫(xiě)下你的結(jié)論。2、將目標(biāo)板中/usr/lib 目錄下的一個(gè)文件傳輸?shù)街鳈C(jī)上,記錄傳輸?shù)幕静襟E和文件傳輸所在的目錄。相關(guān)練習(xí)1、一目標(biāo)平臺(tái)通過(guò)串口與pc 機(jī)連接后,用戶啟動(dòng)目標(biāo)平臺(tái)時(shí)發(fā)現(xiàn)串口終端出現(xiàn)亂碼,請(qǐng)分析串口終端產(chǎn)生亂碼的原因。2、某同學(xué)想利用ftp 進(jìn)行文件傳輸,他已經(jīng)設(shè)定主機(jī)平臺(tái)的ip 地址為00,可在串口終端輸入ftp 00 時(shí),出現(xiàn)ftp:connect:connection refused 錯(cuò)誤,請(qǐng)分析產(chǎn)生錯(cuò)誤的原因。3、參考ftp 適應(yīng)文檔,分析在ft
5、p 方式下如何使用linux 下如mkdir 等常用命令。相關(guān)知識(shí)一、minicom 的使用1、串口通信參數(shù)的設(shè)置首先運(yùn)行minicom,由于minicom 是通過(guò)串口來(lái)工作的,所以要通過(guò)minicom 程序來(lái)對(duì)串口通信參數(shù)進(jìn)行設(shè)置。啟動(dòng)minicom 的設(shè)置窗口:在linux 的終端中輸入“minicom s”,然后,按下回車鍵。rootlocalhost root# minicom s“-s”選項(xiàng)調(diào)出配置信息。下面顯示的就是配置的菜單。有關(guān)串口通信選項(xiàng)的含義:filenames and paths:選擇需要傳輸?shù)奈募吐窂絝ile transfer protocols:選擇傳輸文件的通信協(xié)
6、議serial port setup:設(shè)置串口通信參數(shù)save setup as dfl:將設(shè)置好的各項(xiàng)參數(shù)保存為dflsave setup as:將設(shè)置好的各項(xiàng)參數(shù)保存為自定義的文件名exit:退出返回到minicom 設(shè)置好后的終端exit from minicom:從minicom 命令中退出返回linux 終端將光標(biāo)移到serial port setup,按回車鍵會(huì)彈出串口通信參數(shù)的配置菜單。(1)、串口通信口的選擇:(a - serial device)接a鍵把光標(biāo)移動(dòng)到serial device。如果串口線連在pc 機(jī)的串口1 上,則把serialdevice 設(shè)置為/dev/tt
7、ys0。如果連在串口2 上,則把serial device 設(shè)置為/dev/ttys1,然后按下回車鍵。(2)、串口參數(shù)的設(shè)置(e - bps/par/bits)按e鍵來(lái)設(shè)置通信波特率、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位。可以通過(guò)按下不同的鍵來(lái)設(shè)置通信參數(shù)。例如xsbase270 平臺(tái)需要把波特率設(shè)為115200,數(shù)據(jù)位設(shè)為8,奇偶校驗(yàn)位設(shè)為無(wú),停止位設(shè)為1??梢苑謩e通過(guò)按i、v、l、w鍵設(shè)置波特率、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位。設(shè)置完后按esc返回。(3)、數(shù)據(jù)流的控制選擇(f - hardware flow control、g - software flow control)按f鍵可以完成硬件流控制
8、切換,即完成yes與no之間的切換。按g鍵完成軟件流控制切換,即完成yes與no之間的切換。下圖顯示的是串口配置好的后完整信息。(4)、設(shè)置參數(shù)的保存與退出配置完成后,按下“esc”鍵,將會(huì)出現(xiàn)下圖的配置菜單。選擇“save setup as dfl”按enter 鍵來(lái)保存,當(dāng)配置保存后,按下“esc”鍵完成設(shè)置。當(dāng)minicom 窗口出現(xiàn)后,重起xsbase270 將會(huì)看到啟動(dòng)信息。如果沒(méi)有出現(xiàn)啟動(dòng)信息,請(qǐng)檢查mincom 的設(shè)置和線纜連接是否有錯(cuò)。2、利用串口通信文件傳輸在與目標(biāo)板連接后,可以通過(guò)串口下傳一些文件到目標(biāo)板,具體操作步驟如下:(1)、在與目標(biāo)正確連接后,進(jìn)入root51boa
9、rd,按下ctrla 鍵后,再按z 鍵,系統(tǒng)調(diào)出minicom 的命令選項(xiàng)菜單;其中send files 和receive files 兩項(xiàng)負(fù)責(zé)文件數(shù)據(jù)的傳輸,所用命令使用熱鍵進(jìn)行激活。如上傳文件只需按s 鍵。(2)、當(dāng)向目標(biāo)板上傳文件時(shí),按s 鍵,系統(tǒng)彈出串口通信協(xié)議選項(xiàng),利用方向鍵選中zmodem傳輸協(xié)議,按回車鍵,進(jìn)入文件選擇菜單。(3)、文件傳輸文件選擇菜單彈出后,利用空格鍵選中需要上傳的文件,一次可以選擇多個(gè)文件,選好需要傳輸?shù)奈募蟀椿剀囨I,便可以進(jìn)行文件數(shù)據(jù)傳輸。當(dāng)數(shù)據(jù)傳輸完畢,系統(tǒng)會(huì)彈出傳輸完畢提示菜單(如下圖所示)。二、網(wǎng)絡(luò)文件系統(tǒng)nfs 的配置網(wǎng)絡(luò)文件系統(tǒng)nfs 可以將pc
10、 機(jī)上的一部分文件系統(tǒng)作為目標(biāo)機(jī)的資源,這樣可以彌補(bǔ)目標(biāo)機(jī)存儲(chǔ)空間的不足。在使用網(wǎng)絡(luò)文件之時(shí),應(yīng)對(duì)網(wǎng)絡(luò)文件配置進(jìn)行一定的設(shè)置。1、主機(jī)(host)的設(shè)置:在主機(jī)/mnt 目錄下創(chuàng)建nfs 目錄,并利用文本編輯器編輯修改/etc/exports 文件,增加如下內(nèi)容:/mnt/nfs (rw,no_root_squash)將主機(jī)的/mnt/nfs 目錄設(shè)置為能夠通過(guò)網(wǎng)絡(luò)文件系統(tǒng)訪問(wèn)可讀寫(xiě)的目標(biāo),2、重新啟動(dòng)nfsrootlocal$ /etc/rc.d/init.d/nfs stoprootlocal$ /etc/rc.d/init.d/nfs start3、目標(biāo)機(jī)設(shè)置(假設(shè)主機(jī)的ip 地址為19
11、2)root51board$ portmaproot51board$ mount t nfs 2:/mnt/nfs /mnt上述設(shè)置實(shí)現(xiàn)將主機(jī)上的/mnt/nfs 目錄掛載到目標(biāo)機(jī)的/mnt 目錄下,并作為目標(biāo)機(jī)文件系統(tǒng)的一部分。這時(shí),可以將需要傳輸?shù)奈募蛐枰\(yùn)行的程序保存在主機(jī)的/mnt/nfs 目錄下,然后在目標(biāo)機(jī)對(duì)主機(jī)/mnt/nfs 上的文件進(jìn)行運(yùn)行或復(fù)制等相應(yīng)的處理。三、ftp 文件傳輸文件傳輸協(xié)議ftp(file transimit protocol)利用以太網(wǎng)實(shí)現(xiàn)文件的傳輸。ftp 相對(duì)于串口傳輸文件來(lái)說(shuō),傳輸速度快,所以上傳比較大的文件
12、一般采用ftp 來(lái)實(shí)現(xiàn),需要上傳的文件應(yīng)保存到主機(jī)的/var/ftp/pub 目錄下。下面具體介紹ftp 文件傳輸過(guò)程(假設(shè)主機(jī)的ip 地址為00)。(ftp 的具體其他用法可以在linux 終端提示符輸入man ftp 查看)1、在目標(biāo)板的調(diào)試終端輸入ftp 命令root51board$ ftp 002、輸入用戶名和密碼:用戶采用匿名登陸網(wǎng)絡(luò)(anonymous),無(wú)需輸入密碼。如果用戶需要采用其他的用戶名登陸,必須修改(腳本)3、當(dāng)用戶名和密碼都正確后,在調(diào)試終端顯示登陸成功信息和ftp 提示符,如圖所示。4、文件傳輸:ftp 提示符下利用cd
13、命令轉(zhuǎn)到主機(jī)的pub 目錄下,利用get 命令上傳需要傳輸?shù)奈募<僭O(shè)需要上傳的文件為facedect(確保文件保存在主機(jī)的/var/ftp/pub 目錄下)ftpget facedect文件傳輸完畢后,ftp 輸出成功信息和被傳輸文件的字節(jié)數(shù)。(如圖所示)實(shí)驗(yàn)二 makefile 實(shí)驗(yàn) 實(shí)驗(yàn)?zāi)康?、了解makefile 的基本概念和基本結(jié)構(gòu)2、初步掌握編寫(xiě)簡(jiǎn)單makefile 的方法3、了解遞歸make 的編譯過(guò)程4、初步掌握利用gnu make 編譯應(yīng)用程序的方法實(shí)驗(yàn)環(huán)境1、裝有l(wèi)inux 操作系統(tǒng)的pc 機(jī)一臺(tái);2、xsbase270 或xsbase255 arm 實(shí)驗(yàn)開(kāi)發(fā)平臺(tái)一套實(shí)驗(yàn)內(nèi)
14、容閱讀相關(guān)知識(shí),完成以下實(shí)驗(yàn):一、使用命令行的方式手動(dòng)編譯程序方法1、利用文本編輯器創(chuàng)建hello.c 文件/hello.c/written by emdoor#include int main()printf(welcome emdoor!n);return 1;2、手動(dòng)編譯hello 應(yīng)用程序在hello.c 的目錄的終端下輸入:rootlocal$ arm-linux-gcc c hello.crootlocal$ arm-linux-gcc hello.o o hello通過(guò)ls 命令查看當(dāng)前目錄下是否生成源代碼hello.c 的object 文件hello.o 和可執(zhí)行文件hello
15、,運(yùn)行可執(zhí)行文件hello。查看一下運(yùn)行結(jié)果。root51board $./hello3、修改hello.c 文件,重新手動(dòng)編譯應(yīng)用程序。4、刪除hello.o 和hello 文件rootlocal$rm f hello.orootlocal$rm f hello二、利用gnu make 自動(dòng)編譯應(yīng)用程序方法1、利用文本編輯器創(chuàng)建一個(gè)makefile 文件,并將其保存到與hello.c 相同的目錄下。# makefile test for hello program#written by emdoorcc= arm-linux-gcccflags=all: hellohello: hello.
16、o$(cc) $(cflags) hello.o o hellohello.o: hello.c$(cc) $(cflags) c hello.c o hello.oclean:rm rf hello *.o2、先后執(zhí)行如下命令rootlocal$makerootlocal$lsroot51board $./hello查看并記錄所生成的文件和運(yùn)行的結(jié)果。3、執(zhí)行make clean 命令:rootlocal$make clean4、修改hello.c 文件,重復(fù)第2、3 步操作,查看并記錄所生成的文件和運(yùn)行結(jié)果,并與手動(dòng)編譯進(jìn)行比較,寫(xiě)出你的結(jié)論。5、重新編輯makefile 文件(斜黑體表示
17、修改部分)# makefile test for hello program#written by emdoorcc= arm-linux-gcccflags=objs=hello.oall: hellohello: $(objs)$(cc) $(cflags) $ -o $hello.o: hello.c$(cc) $(cflags) c $ -o $clean:rm rf hello *.o6、重復(fù)第2,3 步操作,查看并記錄所生成的文件和運(yùn)行的結(jié)果。比較這兩種操作,寫(xiě)出你的結(jié)論。同時(shí)指出$ 、$、$在上述makefile 中的含義。三、多個(gè).c 文件的編譯1、創(chuàng)建文件hello1.c、h
18、ello2.c、hello.h 和makefile/hello1.c/written by emdoor#include int main()printf(welcome emdoor!n);test2();return 1;/hello2.c/written by emdoorinclude hello2.h#include void test2(void)printf(welcome emdoor! hello2n);/hello2.h/written by emdoorvoid test2(void);# makefile test for multi files program#wri
19、tten by emdoorcc= arm-linux-gcccflags=objs=hello1.o hello2.oall: hellohello: $(objs)$(cc) $(cflags) $ -o $hello1.o: hello1.c$(cc) $(cflags) c $ -o $hello2.o: hello2.c$(cc) $(cflags) c $ -o $clean:rm rf hello *.o2、先后執(zhí)行如下命令 rootlocal$makerootlocal$lsroot51board $./hello查看并記錄所生成的文件和運(yùn)行的結(jié)果, 寫(xiě)出你的結(jié)論。3、修改ma
20、kefile 文件(斜黑體表示修改部分)# makefile test for multi files program#written by emdoorcc= arm-linux-gcccflags=cfiles=$(wildcard *.c)objs=$(cfiles:%.c=%.o)all: hellohello: $(objs)$(cc) $(cflags) o hello $(objs).c.o:$(cc) c $clean:rm rf hello *.o4、重復(fù)第2 步操作,查看并記錄所生成的文件和運(yùn)行的結(jié)果, 寫(xiě)出你的結(jié)論。并指出wildcard、.c.o 的含義和變量cfile
21、s 代表的內(nèi)容。*四、利用autoconf和automake工具包,將作業(yè)2的程序代碼交叉編譯后下載或用nfs在開(kāi)發(fā)系統(tǒng)中運(yùn)行。相關(guān)練習(xí)1、根據(jù)提供的linux 操作系統(tǒng)源碼中得makefile 結(jié)構(gòu),分析在工程中多級(jí)目錄中存在著多個(gè)makefile 時(shí),編譯的順序如何?2、根據(jù)makefile 中變量定義規(guī)則,如果實(shí)驗(yàn)中的hello.c 文件編譯到目標(biāo)平臺(tái)中運(yùn)行,應(yīng)該怎樣修改makefile 中變量參數(shù)?相關(guān)知識(shí)在linux 或unix 環(huán)境下,對(duì)于只含有幾個(gè)源代碼文件的小程序(如hello.c)的編譯,可以手工鍵入gcc 命令對(duì)源代碼文件逐個(gè)進(jìn)行編譯;然而在大型的項(xiàng)目開(kāi)發(fā)中,可能涉及幾十到
22、幾百個(gè)源文件,采用手工鍵入的方式進(jìn)行編譯,則非常不方便,而且一旦修改了源代碼,尤其頭文件發(fā)生了的修改,采用手工方式進(jìn)行編譯和維護(hù)的工作量相當(dāng)大,而且容易出錯(cuò)。所以在linux 或unix 環(huán)境下,人們通常利用gnu make 工具來(lái)自動(dòng)完成應(yīng)用程序的維護(hù)和編譯工作。實(shí)際上,gnu make 工具通過(guò)一個(gè)稱為makefile 的文件來(lái)完成對(duì)應(yīng)用程序的自動(dòng)維護(hù)和編譯工作。makefile 是按照某種腳本語(yǔ)法編寫(xiě)的文本文件,而gnu make 能夠?qū)akefile 中指令進(jìn)行解釋并執(zhí)行編譯操作。makefile 文件定義了一系列的規(guī)則來(lái)指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編
23、譯,甚至于進(jìn)行更復(fù)雜的功能操作。gnu make 工作時(shí)的執(zhí)行步驟如下:1、讀入所有的makefile。2、讀入被include 的其它makefile。3、初始化文件中的變量。4、推導(dǎo)隱晦規(guī)則,并分析所有規(guī)則。5、為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系鏈。6、根據(jù)依賴關(guān)系,決定哪些目標(biāo)要重新生成。7、執(zhí)行生成命令。1-5 步為第一個(gè)階段,6-7 為第二個(gè)階段。第一個(gè)階段中,如果定義的變量被使用了,那么,make 會(huì)把其展開(kāi)在使用的位置。但make 并不會(huì)完全馬上展開(kāi),make 使用的是拖延戰(zhàn)術(shù),如果變量出現(xiàn)在依賴關(guān)系的規(guī)則中,那么僅當(dāng)這條依賴被決定要使用了,變量才會(huì)在其內(nèi)部展開(kāi)。下面對(duì)makefile
24、 的相關(guān)問(wèn)題進(jìn)行簡(jiǎn)單介紹:1、makefile 的基本結(jié)構(gòu)makefile 的一般結(jié)構(gòu):target :dependency command 結(jié)構(gòu)中各部分的含義:(1)、target(目標(biāo)):一個(gè)目標(biāo)文件,可以是object 文件,也可以是執(zhí)行文件。還可以是一個(gè)標(biāo)簽(label)。(2)、dependency(依賴):要生成目標(biāo)文件(target)所依賴哪些文件(3)、command(命令):創(chuàng)建項(xiàng)目時(shí)需要運(yùn)行的shell 命令(注:命令(command)部分的每行的縮進(jìn)必須要使用tab 而不能使用多個(gè)空格)。makefile 實(shí)際上是一個(gè)文件的依賴關(guān)系,也就是說(shuō), target 這一個(gè)或多個(gè)
25、的目標(biāo)文件依賴于dependency 中的文件,其生成規(guī)則定義在命令command 中。如果依賴文件(dependency)中有一個(gè)以上的文件比目標(biāo)(target)文件要新的話,shell 命令(command)所定義的命令就會(huì)被執(zhí)行。這就是makefile 的規(guī)則。也就是makefile 中最核心的內(nèi)容。例如,假設(shè)有一個(gè)c 源文件test.c,該源文件包含有自定義的頭文件test.h,則目標(biāo)文件test.o 明確依賴于兩個(gè)源文件:test.c 和test.h。如果只希望利用gcc 命令來(lái)生成test.o 目標(biāo)文件,這時(shí),就可以利用如下的makefile 來(lái)定義test.o 的創(chuàng)建規(guī)則:#th
26、is makefile just is a example.test.o: test.c test.hgcc c test.c從上面的例子注意到,第一個(gè)字符為#的行表示注釋行。第一個(gè)非注釋行指定test.o 為目標(biāo),并且依賴于test.c 和test.h 文件。隨后的行指定了如何從目標(biāo)所依賴的文件建立目標(biāo)。當(dāng)test.c 或test.h 文件在編譯之后又被修改,則make 工具可自動(dòng)重新編譯test.o,如果在前后兩次編譯之間,test.c 和test.h 均沒(méi)有被修改,而且test.o 還存在的話,就沒(méi)有必要重新編譯。這種依賴關(guān)系在多源文件的程序編譯中尤其重要。通過(guò)這種依賴關(guān)系的定義,mak
27、e工具可避免許多不必要的編譯工作。一個(gè)makefile 文件中可定義多個(gè)目標(biāo),利用make target 命令可指定要編譯的目標(biāo),如果不指定目標(biāo),則使用第一個(gè)目標(biāo)。通常,makefile 中定義有clean 目標(biāo),可用來(lái)清除編譯過(guò)程中的中間文件# this makefile just is a example.test.o: test.c test.hgcc -c test.cclean:rm -f *.o運(yùn)行make clean 時(shí),執(zhí)行rm f *.o 命令,刪除編譯過(guò)程中生成的所有中間文件。2、makefile 的基本內(nèi)容makefile 一般包括包含:顯式規(guī)則、隱晦規(guī)則、變量定義、文件
28、指示和注釋等五個(gè)內(nèi)容。(1)、顯式規(guī)則:顯式規(guī)則說(shuō)明如何生成一個(gè)或多個(gè)的目標(biāo)文件。這是由makefile 的書(shū)寫(xiě)者明顯指出,要生成的文件,文件的依賴文件,生成的命令。(2)、變量定義。在makefile 中可以定義一系列的變量,變量一般都是字符串,當(dāng)makefile被執(zhí)行時(shí),變量的值會(huì)被擴(kuò)展到相應(yīng)的引用位置上。(3)、隱含規(guī)則:由于gnu make 具有自動(dòng)推導(dǎo)功能,所以隱晦規(guī)則可以比較粗糙地簡(jiǎn)略地書(shū)寫(xiě)makefile,然后由gnu make 的自動(dòng)推導(dǎo)功能完成隱晦規(guī)則的內(nèi)容。(4)、文件指示。其包括了三個(gè)部分,一個(gè)是在一個(gè)makefile 中引用另一個(gè)makefile,就像c 語(yǔ)言中的inc
29、lude 一樣;另一個(gè)是指根據(jù)某些情況指定makefile 中的有效部分,就像c 語(yǔ)言中的預(yù)編譯#if 一樣;還有就是定義一個(gè)多行的命令。(5)、注釋。makefile 中只有行注釋,和unix 的shell 腳本一樣,其注釋是用“#”字符,如果你要在你的makefile 中使用“#”字符,可以用反斜框進(jìn)行轉(zhuǎn)義,如:“#”。2.1 makefile 中的變量(1)、makefile 中定義的變量,與c/c+語(yǔ)言中的宏一樣,代表一個(gè)文本字串,在makefile被執(zhí)行時(shí)候變量會(huì)自動(dòng)地展開(kāi)在所使用的地方。makefile 中的變量可以使用在“目標(biāo)”,“依賴目標(biāo)”,“命令”或makefile 的其它部
30、分中。(2)、makefile 中變量的命名字可以包含字符、數(shù)字,下劃線(可以是數(shù)字開(kāi)頭),但不應(yīng)該含有“:”、“#”、“=”或是空字符(空格、回車等)。(3)、makefile 中變量是大小寫(xiě)敏感的,“foo”、“foo”和“foo”是三個(gè)不同的變量名。傳統(tǒng)的makefile 的變量名是全大寫(xiě)的命名方式(4)、變量在聲明時(shí)需要給予初值,而在使用時(shí),需要在變量名前加上“$”符號(hào)# makefile test for hello program#written by emdoorcc=gcccflags=objs=hello.oall: hellohello: $(objs)$(cc) $(cf
31、lags) $(objs) o hellohello.o: hello.c$(cc) $(cflags) c hello.c o $(objs)clean:rm rf hello *.o上面自定義變量objs 表示hello.o,當(dāng)makefile 被執(zhí)行時(shí),變量會(huì)在使用它的地方精確地展開(kāi),就像c/c+中的宏一樣。上述makfile 變量展開(kāi)后的形式為:# makefile test for hello program#written by emdoorcc=gcccflags=objs=hello.oall: hellohello: hello.ogcc hello.o o hellohel
32、lo.o: hello.cgcc c hello.c o hello.oclean:rm rf hello *.ognu make 的主要預(yù)定義變量gnu make 有許多預(yù)定義的變量,這些變量具有特殊的含義,可在規(guī)則中使用。以下給出了一些主要的預(yù)定義變量,除這些變量外,gnu make 還將所有的環(huán)境變量作為自己的預(yù)定義變量。$ 表示規(guī)則中的目標(biāo)文件集。在模式規(guī)則中,如果有多個(gè)目標(biāo),那么,$就是匹配于目標(biāo)中模式定義的集合。$% 僅當(dāng)目標(biāo)是函數(shù)庫(kù)文件中,表示規(guī)則中的目標(biāo)成員名。例如,如果一個(gè)目標(biāo)是foo.a(bar.o),那么,$%就是bar.o,$就是foo.a。如果目標(biāo)不是函數(shù)庫(kù)文件(un
33、ix下是.a,windows 下是.lib),那么,其值為空。$ 依賴目標(biāo)中的第一個(gè)目標(biāo)名字。如果依賴目標(biāo)是以模式(即%)定義的,那么$將是符合模式的一系列的文件集。注意,其是一個(gè)一個(gè)取出來(lái)的。$? 所有比目標(biāo)新的依賴目標(biāo)的集合。以空格分隔。$ 所有的依賴目標(biāo)的集合。以空格分隔。如果在依賴目標(biāo)中有多個(gè)重復(fù)的,那個(gè)這個(gè)變量會(huì)去除重復(fù)的依賴目標(biāo),只保留一份。$+ 這個(gè)變量很像$,也是所有依賴目標(biāo)的集合。只是它不去除重復(fù)的依賴目標(biāo)。命令的變量。ar 函數(shù)庫(kù)打包程序。默認(rèn)命令是“ar”。as 匯編語(yǔ)言編譯程序。默認(rèn)命令是“as”。cc c 語(yǔ)言編譯程序。默認(rèn)命令是“cc”。cxx c+語(yǔ)言編譯程序。默
34、認(rèn)命令是“g+”。co 從rcs 文件中擴(kuò)展文件程序。默認(rèn)命令是“co”。cpp c 程序的預(yù)處理器(輸出是標(biāo)準(zhǔn)輸出設(shè)備)。默認(rèn)命令是“$(cc) e”。fc fortran 和ratfor 的編譯器和預(yù)處理程序。默認(rèn)命令是“f77”。get 從sccs 文件中擴(kuò)展文件的程序。默認(rèn)命令是“get”。lex lex 方法分析器程序(針對(duì)于c 或ratfor)。默認(rèn)命令是“l(fā)ex”。pc pascal 語(yǔ)言編譯程序。默認(rèn)命令是“pc”。yacc yacc 文法分析器(針對(duì)于c 程序)。默認(rèn)命令是“yacc”。yaccr yacc 文法分析器(針對(duì)于ratfor 程序)。默認(rèn)命令是“yacc r”。
35、makeinfo 轉(zhuǎn)換texinfo 源文件(.texi)到info 文件程序。默認(rèn)命令是“makeinfo”。tex 從tex 源文件創(chuàng)建tex dvi 文件的程序。默認(rèn)命令是“tex”。texi2dvi 從texinfo 源文件創(chuàng)建軍tex dvi 文件的程序。默認(rèn)命令是“texi2dvi”。weave 轉(zhuǎn)換web 到tex 的程序。默認(rèn)命令是“weave”。cweave 轉(zhuǎn)換cweb 到tex 的程序。默認(rèn)命令是“cweave”。tangle 轉(zhuǎn)換web 到pascal 語(yǔ)言的程序。默認(rèn)命令是“tangle”。ctangle 轉(zhuǎn)換cweb 到c。默認(rèn)命令是“ctangle”。rm 刪除文
36、件命令。默認(rèn)命令是“rm f”。命令參數(shù)變量:下面的這些變量都是相關(guān)上面的命令的參數(shù)。如果沒(méi)有指明其默認(rèn)值,那么其默認(rèn)值都是空。arflags 函數(shù)庫(kù)打包程序ar 命令的參數(shù)。默認(rèn)值是“rv”。asflags 匯編語(yǔ)言編譯器參數(shù)。(當(dāng)明顯地調(diào)用“.s”或“.s”文件時(shí))。cflags c 語(yǔ)言編譯器參數(shù)。cxxflags c+語(yǔ)言編譯器參數(shù)。coflags rcs 命令參數(shù)。cppflags c 預(yù)處理器參數(shù)。( c 和fortran 編譯器也會(huì)用到)。fflags fortran 語(yǔ)言編譯器參數(shù)。gflags sccs “get”程序參數(shù)。ldflags 鏈接器參數(shù)。(如:“l(fā)d”)lfla
37、gs lex 文法分析器參數(shù)。pflags pascal 語(yǔ)言編譯器參數(shù)。rflags ratfor 程序的fortran 編譯器參數(shù)。yflags yacc 文法分析器參數(shù)。2.2 隱含規(guī)則gnu make 包含有一些內(nèi)置的或隱含的規(guī)則,這些規(guī)則定義了如何從不同的依賴文件建立特定類型的目標(biāo)。gnu make 支持兩種類型的隱含規(guī)則:(1)、后綴規(guī)則(suffix rule)。后綴規(guī)則是定義隱含規(guī)則的老風(fēng)格方法。后綴規(guī)則定義了將一個(gè)具有某個(gè)后綴的文件(例如,.c 文件)轉(zhuǎn)換為具有另外一種后綴的文件(例如,.o 文件)的方法。每個(gè)后綴規(guī)則以兩個(gè)成對(duì)出現(xiàn)的后綴名定義,例如,將.c 文件轉(zhuǎn)換為.o
38、文件的后綴規(guī)則可定義為:.c.o:$(cc) $(ccflags) $(cppflags) -c -o $ $(2)、模式規(guī)則(pattern rules)。這種規(guī)則更加通用,因?yàn)榭梢岳媚J揭?guī)則定義更加復(fù)雜的依賴性規(guī)則。模式規(guī)則看起來(lái)非常類似于正則規(guī)則,但在目標(biāo)名稱的前面多了一個(gè)% 號(hào),同時(shí)可用來(lái)定義目標(biāo)和依賴文件之間的關(guān)系,例如下面的模式規(guī)則定義了如何將任意一個(gè)x.c 文件轉(zhuǎn)換為x.o 文件:%.c:%.o$(cc) $(ccflags) $(cppflags) -c -o $ $2.3 文件引用在makefile 使用include 關(guān)鍵字可以把別的makefile 包含進(jìn)來(lái),這很像c
39、語(yǔ)言的#include,被包含的文件會(huì)原模原樣的放在當(dāng)前文件的包含位置。例如:有這樣幾個(gè)makefile:a.mk、b.mk、c.mk,還有一個(gè)文件叫foo.make,以及一個(gè)變量$(bar),其包含了e.mk 和f.mk,那么,下面的語(yǔ)句:include foo.make *.mk $(bar)等價(jià)于:include foo.make a.mk b.mk c.mk e.mk f.mkmake 命令開(kāi)始時(shí),會(huì)把找尋include 所指出的其它makefile,并把其內(nèi)容安置在當(dāng)前的位置。如果文件都沒(méi)有指定絕對(duì)路徑或是相對(duì)路徑的話,make 首先會(huì)在當(dāng)前目錄下尋找,如果當(dāng)前目錄下沒(méi)有找到,那么,
40、make 還會(huì)在下面的幾個(gè)目錄下找:(1)如果make 執(zhí)行時(shí),有“-i”或“-include-dir”參數(shù),那么make 就會(huì)在這個(gè)參數(shù)所指定的目錄下去尋找。(2)、如果目錄/include(一般是:/usr/local/bin 或/usr/include)存在的話,make 也會(huì)去找。如果有文件沒(méi)有找到的話,make 會(huì)生成一條警告信息,但不會(huì)馬上出現(xiàn)致命錯(cuò)誤。它會(huì)繼續(xù)載入其它的文件,一旦完成makefile 的讀取,make 會(huì)再重試這些沒(méi)有找到,或是不能讀取的文件,如果還是不行,make 才會(huì)出現(xiàn)一條致命信息。2.4 makefile 中的函數(shù)在makefile 中可以使用函數(shù)來(lái)處理變
41、量,從而讓命令或規(guī)則更為的靈活和具有智能,函數(shù)調(diào)用,很像變量的使用,也是以“$”來(lái)標(biāo)識(shí)的,函數(shù)調(diào)用后,函數(shù)的返回值可以當(dāng)做變量來(lái)使用。例如:wildcard 的函數(shù),可以展開(kāi)成一列所有符合由其參數(shù)描述的文件名。文件間以空格間隔。語(yǔ)法如下:$(wildcard pattern.)用wildcard 函數(shù)找出目錄中所有的.c文件:sources = $(wildcard *.c)。實(shí)際上,gnu make 還是許多如字符串處理函數(shù)、文件名操作函數(shù)等其他函數(shù)3、運(yùn)行make3.1 make 的執(zhí)行一般來(lái)說(shuō),最簡(jiǎn)單的就是直接在命令行下輸入make 命令,gnu make 找尋默認(rèn)的makefile 的
42、規(guī)則是在當(dāng)前目錄下依次找三個(gè)文件 “gnumakefile”、“makefile”和“makefile”。其按順序找這三個(gè)文件,一旦找到,就開(kāi)始讀取這個(gè)文件并執(zhí)行,也可以給make命令指定一個(gè)特殊名字的makefile。要達(dá)到這個(gè)功能,要求使用make 的“-f”或是“-file”參數(shù),例如:make f hello.makefile3.2 嵌套執(zhí)行make在一些大的工程中,不同模塊或是不同功能的源文件放在不同的目錄中,可以在每個(gè)目錄中都書(shū)寫(xiě)一個(gè)該目錄的makefile,這有利于makefile 變得更加地簡(jiǎn)潔,而不至于把所有的東西全部寫(xiě)在一個(gè)makefile 中,這個(gè)技術(shù)對(duì)于進(jìn)行模塊編譯和分
43、段編譯有著非常大的好處。例如,有一個(gè)子目錄叫subdir,這個(gè)目錄下有個(gè)makefile 文件指明了這個(gè)目錄下文件的編譯規(guī)則。那么總控的makefile 可以書(shū)寫(xiě):subsystem:cd subdir & $(make)如果要傳遞變量到下級(jí)makefile 中,那么可以使用export 來(lái)聲明。3.3 gnu make 命令選項(xiàng)gnu make 命令還有一些其他選項(xiàng),下面給出了這些選項(xiàng)。命令行選項(xiàng)含義-c dir 在讀取makefile 之前改變到指定的目錄dir。-f file 以指定的file 文件作為makefile。-h 顯示所有的make 選項(xiàng)。-i 忽略所有的命令執(zhí)行錯(cuò)誤。-i
44、dir 當(dāng)包含其他makefile 文件時(shí),可利用該選項(xiàng)指定搜索目錄。-n 只打印要執(zhí)行的命令,但不執(zhí)行這些命令。-p 顯示make 變量數(shù)據(jù)庫(kù)和隱含規(guī)則。-s 在執(zhí)行命令時(shí)不顯示命令。-w 在處理makefile 之前和之后,顯示工作目錄。-w file 假定文件file 已經(jīng)被修改。實(shí)驗(yàn)三 cross-gdb實(shí)驗(yàn) 實(shí)驗(yàn)?zāi)康?、充分了解在嵌入式系統(tǒng)的開(kāi)發(fā)過(guò)程中,為什么需要交叉調(diào)試,及交叉調(diào)試所扮演的角色。2、掌握利用cross-gdb,構(gòu)建交叉調(diào)試環(huán)境的方法;3、掌握通過(guò)串行口與tcp/ip,使用cross-gdb,實(shí)現(xiàn)嵌入式linux應(yīng)用程序的遠(yuǎn)程調(diào)試。實(shí)驗(yàn)環(huán)境1、裝有l(wèi)inux 操作系統(tǒng)
45、的pc 機(jī)一臺(tái);2、xsbase270 或xsbase255 arm 實(shí)驗(yàn)開(kāi)發(fā)平臺(tái)一套3、redhat9.0實(shí)驗(yàn)內(nèi)容閱讀相關(guān)知識(shí),完成以下實(shí)驗(yàn):使用cross-gdb調(diào)試程序的第一步是編譯安裝cross-gdb和gdbserver,按以下步驟完成。一、編譯gdb客戶端:從/gnu/gdb/下載源代碼,然后gdb編譯成支持arm結(jié)構(gòu)的版本。當(dāng)編譯客戶端(cross-gdb)時(shí),configure的target參數(shù)為arm-linux,host參數(shù)為arm-linux,這樣客戶端才能和arm的服務(wù)端進(jìn)行通信,調(diào)試應(yīng)用程序。root $ xmu home # tar
46、 xvfj gdb-6.1.tar.bz2root $ xmu home # cd gdb-6.1root $ xmu gdb-6.1# ./configure -target=arm-linux -prefix=/usr/local/arm-gdb vroot $ xmu gdb-6.1# makeroot $ xmu gdb-6.1# make install如果編譯過(guò)程沒(méi)有錯(cuò)誤,arm-linux-gdb會(huì)在/usr/local/arm-gdb/bin目錄中生成。為了在任何目錄下都能使用cross-gdb,必須對(duì)路徑進(jìn)行設(shè)置。打開(kāi)/root/.bash_profile文件設(shè)置路徑。roo
47、t $ xmu gdb-6.1# vi /root/.bash_profile 在文件中添加以下一行:path=$path:/usr/local/arm-gdb/bin保存并退出該文件,使用source命令使路徑生效。二、編譯gdbserver1、先在主機(jī)上編譯生成gdbserver程序進(jìn)入gdb源碼目錄編譯gdbserver:root $ xmu home # cd gdb-6.1root $ xmu gdb-6.1# ./configure -target=arm-linux -host= arm-linux進(jìn)入生成的gdbserver目錄,將該目錄下的configure屬性該為可執(zhí)行,并
48、運(yùn)行該配置文件:root $ xmu gdb-6.1# cd gdb/gdbserverroot $ xmu gdbserver# chmod 755 configureroot $ xmu gdbserver# ./configure -target=arm-linux -host= arm-linux修改gdb/gdbserver/config.hroot $ xmu gdbserver# vi config.h將文件中的 #define have_sys_reg_h 1 改為 / #define have_sys_reg_h 1編譯gdbserver:root $ xmu gdbserv
49、er# make cc=arm-linux-gcc2、將編譯好的gdbserver用以下三種方法之一下載到開(kāi)發(fā)板上的/usr/bin目錄中(1)通過(guò)nfs掛載后復(fù)制nfs的具體配置參見(jiàn)實(shí)驗(yàn)1。設(shè)主機(jī)的ip為00,gdbserver已拷貝到主機(jī)的/mnt/nfs目錄下,將掛載到目標(biāo)機(jī)的/mnt/nfs51下,再下載到開(kāi)發(fā)板上的/usr/bin目錄中。在minicom中對(duì)目標(biāo)機(jī)進(jìn)行操作如下:root51board$ mount t nfs 00:/mnt/nfs /mnt/nfs51root51board$ cp a /mnt/nfs51/gdbserv
50、er /usr/bin(2)通過(guò)串口下載在目標(biāo)板的minicom終端中切換到/usr/bin目錄后下載。(3)通過(guò)ftp下載將編譯好的gdbserver復(fù)制到宿主機(jī)的/var/pub目錄下,在目標(biāo)板的minicom終端中用ftp命令連接到宿主機(jī)下載。三、使用cross-gdb遠(yuǎn)程調(diào)試程序1、在主機(jī)上編寫(xiě)測(cè)試代碼,并交叉編譯。測(cè)試代碼hello.c如下: 這個(gè)程序模擬使用空指針產(chǎn)生的錯(cuò)誤。交叉編譯這段代碼:root$xmu temp# arm-linux-gcc g hello.c o hello2、將交叉編譯好的hello文件下載到目標(biāo)板上的root目錄下??捎胢inicom的文件發(fā)送功能,或
51、nfs文件傳輸,具體步驟參見(jiàn)實(shí)驗(yàn)1。3、進(jìn)入/root目錄,啟動(dòng)開(kāi)發(fā)板上的gdbserver來(lái)調(diào)試hello:(設(shè)主機(jī)的ip為00,開(kāi)發(fā)板的ip為0)這個(gè)命令使gdbserver在1234端口監(jiān)聽(tīng)。4、然后在pc機(jī)上運(yùn)行arm-linux-gdb,并通過(guò)tcp/ip鏈接到gdbserver運(yùn)行arm-linux-gdb,結(jié)果如下:此時(shí),處在gdb的命令行調(diào)試狀態(tài)下。通過(guò)tcp/ip鏈接到開(kāi)發(fā)板的gdbserver。如果鏈接成功,開(kāi)發(fā)板的串口終端(minicom)上會(huì)顯示以下信息:5、接下來(lái)開(kāi)始在主機(jī)上調(diào)試程序此處的hello為pc機(jī)上hello所在的
52、路徑,如果不對(duì),可在gdb命令行狀態(tài)下用cd命令切換。為了調(diào)試空指針引起的錯(cuò)誤,在第6行設(shè)置斷點(diǎn):執(zhí)行代碼并單步跟蹤:可以看到程序的第6行執(zhí)行時(shí)出現(xiàn)了一個(gè)段錯(cuò)誤,段錯(cuò)誤通常是由內(nèi)存的非法訪問(wèn)引起的。在此程序中,指針str未初始化為有效存儲(chǔ)空間,因而出現(xiàn)段錯(cuò)誤。從調(diào)試過(guò)程可以看出,通過(guò)聯(lián)合使用gdb/gdbserver可以快速定位嵌入式程序中的錯(cuò)誤,提高了編程效率。6、退出gdb調(diào)試可用quit命令在目標(biāo)板的串口終端(minicom)上會(huì)顯示四、用cross-gdb調(diào)試作業(yè)31、將程序設(shè)計(jì)作業(yè)用交叉編譯器編譯后下載到目標(biāo)板的/root目錄下。2、按本次實(shí)驗(yàn)中第三部分的介紹調(diào)試它。3、注意由于被調(diào)試程序是由gdbserver啟動(dòng)的,所以應(yīng)該在啟動(dòng)時(shí)添加命令行參數(shù)。相關(guān)練習(xí)1、 cross-gdb與gdb在用法上有何不同?2、 如何修改實(shí)驗(yàn)程序hello.c中空指針的錯(cuò)誤?相關(guān)知識(shí)1、cross-gdb 簡(jiǎn)介嵌入式應(yīng)用軟件的開(kāi)發(fā),除了基本cross compiler(交叉編譯)與cross assembler/linker之外,程序開(kāi)發(fā)過(guò)程中的測(cè)試與除錯(cuò)是另一個(gè)重要的部分,提供使用者方便、易使用的source-level debugger,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工春節(jié)慰問(wèn)信15篇
- 總裝技能提升專項(xiàng)測(cè)試題有答案(一)
- 高考數(shù)學(xué)復(fù)習(xí)解答題提高第一輪專題復(fù)習(xí)專題08數(shù)列求和(奇偶項(xiàng)討論求和)(典型題型歸類訓(xùn)練)(學(xué)生版+解析)
- 高一語(yǔ)文語(yǔ)法鞏固作業(yè)短語(yǔ)
- 第1章 現(xiàn)代物流概述 課件
- 2024屆上海市豐華中學(xué)高三暑期作業(yè)反饋(開(kāi)學(xué)考試)數(shù)學(xué)試題
- DB11-T 2069-2022 生產(chǎn)安全事故調(diào)查與分析技術(shù)規(guī)范
- 5年中考3年模擬試卷初中道德與法治七年級(jí)下冊(cè)01期中素養(yǎng)綜合測(cè)試
- 高三年級(jí)摸底考試語(yǔ)文試題及參考答案
- 2019春人教版音樂(lè)二年級(jí)下冊(cè)全冊(cè)教案
- 中醫(yī)活動(dòng)文案策劃方案
- 孕產(chǎn)婦健康知識(shí)宣教講座
- 蘑菇種植基地可行性方案
- 國(guó)開(kāi)電大《員工招聘與配置》形考冊(cè)第一次形考答案
- 初中物理電學(xué)全能突破秘籍
- 醫(yī)療垃圾分類與處理的原則與標(biāo)準(zhǔn)
- 培養(yǎng)小學(xué)生的閱讀興趣和閱讀習(xí)慣
- 急診科醫(yī)療質(zhì)量評(píng)估與改進(jìn)
- 電容器的充放電過(guò)程與應(yīng)用研究
- 自由貿(mào)易2024年全球經(jīng)濟(jì)的新趨勢(shì)
- 《麻醉輔助用藥》課件
評(píng)論
0/150
提交評(píng)論