《嵌入式系統(tǒng)開發(fā)》實(shí)驗(yàn)指導(dǎo)書_第1頁
《嵌入式系統(tǒng)開發(fā)》實(shí)驗(yàn)指導(dǎo)書_第2頁
《嵌入式系統(tǒng)開發(fā)》實(shí)驗(yàn)指導(dǎo)書_第3頁
《嵌入式系統(tǒng)開發(fā)》實(shí)驗(yàn)指導(dǎo)書_第4頁
《嵌入式系統(tǒng)開發(fā)》實(shí)驗(yàn)指導(dǎo)書_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、?嵌入式系統(tǒng)開發(fā)?編撰閩江學(xué)院計(jì)算機(jī)實(shí)驗(yàn)教學(xué)中心印制目 錄實(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ū)動程序結(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ù)的過程,掌握利用minicom 進(jìn)行傳輸文件方法2、了解網(wǎng)絡(luò)文件系統(tǒng)nfs 的配置,掌握利用nfs 進(jìn)行文件的傳輸和異地運(yùn)行目標(biāo)板程序3、掌握ftp 的使用方法實(shí)驗(yàn)環(huán)境1、裝有Linux 操作系統(tǒng)的

2、PC 機(jī)一臺;2、XSBase270 或XSBase255 ARM 實(shí)驗(yàn)開發(fā)平臺一套實(shí)驗(yàn)內(nèi)容閱讀相關(guān)知識,完成以下實(shí)驗(yàn):一、minicom 的使用實(shí)驗(yàn)內(nèi)容1、將目標(biāo)機(jī)與PC 機(jī)相連,利用minicom s 正確設(shè)置串口的參數(shù),啟動目標(biāo)機(jī),記錄PC機(jī)顯示的內(nèi)容2、關(guān)閉目標(biāo)板,利用minicom s 重新設(shè)置串口參數(shù),啟動目標(biāo)機(jī),記錄PC 機(jī)顯示的現(xiàn)象3、利用串口通信向目標(biāo)機(jī)下載光盤中example 目錄下的hello 應(yīng)用程序,同時運(yùn)行該應(yīng)用程序。記錄文件下載在目標(biāo)板目錄和下載文件的根本步驟。二、網(wǎng)絡(luò)文件系統(tǒng)nfs 的配置及應(yīng)用實(shí)驗(yàn)內(nèi)容1、通過網(wǎng)絡(luò)文件系統(tǒng)的配置將主機(jī)的其他目錄如/root/Em

3、door 目錄,并掛載到目標(biāo)機(jī)上,記錄設(shè)置的步驟。2、將主機(jī)example 目錄下的ARM 程序hello 復(fù)制到主機(jī)的網(wǎng)絡(luò)文件系統(tǒng)目錄上,在目標(biāo)機(jī)的掛載目錄運(yùn)行該程序,記錄運(yùn)行結(jié)果并寫出你的結(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ī)其他目錄上,重新啟動目標(biāo)機(jī)系統(tǒng)查看文件是否復(fù)制成功。最后寫出你的結(jié)論。三、ftp 實(shí)驗(yàn)內(nèi)容1、將example 目錄下的文件cxcore.lib 文件通過ftp 直接傳輸?shù)侥繕?biāo)板的/usr/li

4、b 目錄下,記錄通過ftp 傳輸文件的根本步驟,并與通過串口傳輸文件進(jìn)行比擬,寫下你的結(jié)論。2、將目標(biāo)板中/usr/lib 目錄下的一個文件傳輸?shù)街鳈C(jī)上,記錄傳輸?shù)母静襟E和文件傳輸所在的目錄。相關(guān)練習(xí)1、一目標(biāo)平臺通過串口與PC 機(jī)連接后,用戶啟動目標(biāo)平臺時發(fā)現(xiàn)串口終端出現(xiàn)亂碼,請分析串口終端產(chǎn)生亂碼的原因。2、某同學(xué)想利用ftp 進(jìn)行文件傳輸,他已經(jīng)設(shè)定主機(jī)平臺的IP 地址為,可在串口終端輸入ftp 00 時,出現(xiàn)ftp:connect:Connection refused 錯誤,請分析產(chǎn)生錯誤的原因。3、參考ftp 適應(yīng)文檔,分析在ftp 方式下如何使用linux

5、下如mkdir 等常用命令。相關(guān)知識一、minicom 的使用1、串口通信參數(shù)的設(shè)置首先運(yùn)行minicom,由于minicom 是通過串口來工作的,所以要通過minicom 程序來對串口通信參數(shù)進(jìn)行設(shè)置。啟動minicom 的設(shè)置窗口:在linux 的終端中輸入“minicom s,然后,按下回車鍵。rootlocalhost root# minicom s“-s選項(xiàng)調(diào)出配置信息。下面顯示的就是配置的菜單。有關(guān)串口通信選項(xiàng)的含義:"Filenames and paths":選擇需要傳輸?shù)奈募吐窂?quot;File transfer protocols":選擇傳

6、輸文件的通信協(xié)議"Serial port setup":設(shè)置串口通信參數(shù)"Save setup as dfl":將設(shè)置好的各項(xiàng)參數(shù)保存為dfl"Save setup as":將設(shè)置好的各項(xiàng)參數(shù)保存為自定義的文件名"Exit":退出返回到minicom 設(shè)置好后的終端"Exit from Minicom":從minicom 命令中退出返回Linux 終端將光標(biāo)移到"Serial port setup",按回車鍵會彈出串口通信參數(shù)的配置菜單。1、串口通信口的選擇:A - Seri

7、al Device接"A"鍵把光標(biāo)移動到Serial Device。如果串口線連在PC 機(jī)的串口1 上,那么把Serialdevice 設(shè)置為/dev/ttyS0。如果連在串口2 上,那么把Serial device 設(shè)置為/dev/ttyS1,然后按下回車鍵。2、串口參數(shù)的設(shè)置E - Bps/Par/Bits按"E"鍵來設(shè)置通信波特率、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位。可以通過按下不同的鍵來設(shè)置通信參數(shù)。例如XSBase270 平臺需要把波特率設(shè)為115200,數(shù)據(jù)位設(shè)為8,奇偶校驗(yàn)位設(shè)為無,停止位設(shè)為1??梢苑謩e通過按"I"、"

8、;V"、"L"、"W"鍵設(shè)置波特率、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位。設(shè)置完后按"Esc"返回。3、數(shù)據(jù)流的控制選擇F - Hardware Flow Control、G - Software Flow Control按"F"鍵可以完成硬件流控制切換,即完成"Yes"與"No"之間的切換。按"G"鍵完成軟件流控制切換,即完成"Yes"與"No"之間的切換。以下圖顯示的是串口配置好的后完整信息。4、設(shè)置參數(shù)的保存與

9、退出配置完成后,按下“Esc鍵,將會出現(xiàn)以下圖的配置菜單。選擇“Save setup as dfl按ENTER 鍵來保存,當(dāng)配置保存后,按下“Esc鍵完成設(shè)置。當(dāng)minicom 窗口出現(xiàn)后,重起XSBase270 將會看到啟動信息。如果沒有出現(xiàn)啟動信息,請檢查mincom 的設(shè)置和線纜連接是否有錯。2、利用串口通信文件傳輸在與目標(biāo)板連接后,可以通過串口下傳一些文件到目標(biāo)板,具體操作步驟如下:1、在與目標(biāo)正確連接后,進(jìn)入root51board,按下CTRLA 鍵后,再按Z 鍵,系統(tǒng)調(diào)出minicom 的命令選項(xiàng)菜單;其中Send files 和Receive files 兩項(xiàng)負(fù)責(zé)文件數(shù)據(jù)的傳輸,

10、所用命令使用熱鍵進(jìn)行激活。如上傳文件只需按S 鍵。2、當(dāng)向目標(biāo)板上傳文件時,按S 鍵,系統(tǒng)彈出串口通信協(xié)議選項(xiàng),利用方向鍵選中zmodem傳輸協(xié)議,按回車鍵,進(jìn)入文件選擇菜單。3、文件傳輸文件選擇菜單彈出后,利用空格鍵選中需要上傳的文件,一次可以選擇多個文件,選好需要傳輸?shù)奈募蟀椿剀囨I,便可以進(jìn)行文件數(shù)據(jù)傳輸。當(dāng)數(shù)據(jù)傳輸完畢,系統(tǒng)會彈出傳輸完畢提示菜單如以下圖所示。二、網(wǎng)絡(luò)文件系統(tǒng)nfs 的配置網(wǎng)絡(luò)文件系統(tǒng)nfs 可以將PC 機(jī)上的一局部文件系統(tǒng)作為目標(biāo)機(jī)的資源,這樣可以彌補(bǔ)目標(biāo)機(jī)存儲空間的缺乏。在使用網(wǎng)絡(luò)文件之時,應(yīng)對網(wǎng)絡(luò)文件配置進(jìn)行一定的設(shè)置。1、主機(jī)host的設(shè)置:在主機(jī)/mnt 目錄

11、下創(chuàng)立nfs 目錄,并利用文本編輯器編輯修改/etc/exports 文件,增加如下內(nèi)容:/mnt/nfs (rw,no_root_squash)將主機(jī)的/mnt/nfs 目錄設(shè)置為能夠通過網(wǎng)絡(luò)文件系統(tǒng)訪問可讀寫的目標(biāo),2、重新啟動nfs3、目標(biāo)機(jī)設(shè)置假設(shè)主機(jī)的IP 地址為19root51Board$ 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ù)奈募蛐枰\(yùn)行的程序保存在主機(jī)的/mnt/nfs 目

12、錄下,然后在目標(biāo)機(jī)對主機(jī)/mnt/nfs 上的文件進(jìn)行運(yùn)行或復(fù)制等相應(yīng)的處理。三、ftp 文件傳輸文件傳輸協(xié)議ftpFile Transimit Protocol利用以太網(wǎng)實(shí)現(xiàn)文件的傳輸。ftp 相對于串口傳輸文件來說,傳輸速度快,所以上傳比擬大的文件一般采用ftp 來實(shí)現(xiàn),需要上傳的文件應(yīng)保存到主機(jī)的/var/ftp/pub 目錄下。下面具體介紹ftp 文件傳輸過程假設(shè)主機(jī)的IP 地址為。(ftp 的具體其他用法可以在linux 終端提示符輸入man ftp 查看)1、在目標(biāo)板的調(diào)試終端輸入ftp 命令root51Board$ 2、輸入用戶名和密碼:用戶采用匿名登陸網(wǎng)絡(luò)anonymous,無

13、需輸入密碼。如果用戶需要采用其他的用戶名登陸,必須修改腳本3、當(dāng)用戶名和密碼都正確后,在調(diào)試終端顯示登陸成功信息和ftp 提示符,如下圖。4、文件傳輸:ftp 提示符下利用cd 命令轉(zhuǎn)到主機(jī)的pub 目錄下,利用get 命令上傳需要傳輸?shù)奈募?。假設(shè)需要上傳的文件為facedect確保文件保存在主機(jī)的/var/ftp/pub 目錄下ftp>get facedect文件傳輸完畢后,ftp 輸出成功信息和被傳輸文件的字節(jié)數(shù)。如下圖實(shí)驗(yàn)二 Makefile 實(shí)驗(yàn) 實(shí)驗(yàn)?zāi)康?、了解Makefile 的根本概念和根本結(jié)構(gòu)2、初步掌握編寫簡單Makefile 的方法3、了解遞歸Make 的編譯過程4、

14、初步掌握利用GNU Make 編譯應(yīng)用程序的方法實(shí)驗(yàn)環(huán)境1、裝有Linux 操作系統(tǒng)的PC 機(jī)一臺;2、XSBase270 或XSBase255 ARM 實(shí)驗(yàn)開發(fā)平臺一套實(shí)驗(yàn)內(nèi)容閱讀相關(guān)知識,完成以下實(shí)驗(yàn):一、使用命令行的方式手動編譯程序方法1、利用文本編輯器創(chuàng)立hello.c 文件/written by Emdoor#include <stdio.h>int main()printf("Welcome Emdoor!n");return 1;2、手動編譯hello 應(yīng)用程序在hello.c 的目錄的終端下輸入:rootlocal$ arm-linux-gcc

15、rootlocal$ arm-linux-gcc hello.o o hello通過ls 命令查看當(dāng)前目錄下是否生成源代碼hello.c 的object 文件hello.o 和可執(zhí)行文件hello,運(yùn)行可執(zhí)行文件hello。查看一下運(yùn)行結(jié)果。root51Board $./hello3、修改hello.c 文件,重新手動編譯應(yīng)用程序。4、刪除hello.o 和hello 文件rootlocal$rm rootlocal$rm f hello二、利用GNU make 自動編譯應(yīng)用程序方法1、利用文本編輯器創(chuàng)立一個makefile 文件,并將其保存到與hello.c 相同的目錄下。# makefil

16、e test for hello program#written by EmdoorCC= arm-linux-gccCFLAGS=all: hello$(CC) $(CFLAGS) hello.o o helloclean: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é)果,并與手動編譯進(jìn)行比擬,寫出你的結(jié)論

17、。5、重新編輯makefile 文件斜黑體表示修改局部# makefile test for hello program#written by EmdoorCC= arm-linux-gccCFLAGS=all: hellohello: $(OBJS)$(CC) $(CFLAGS) $ -o $(CC) $(CFLAGS) c $< -o $clean:rm rf hello *.o6、重復(fù)第2,3 步操作,查看并記錄所生成的文件和運(yùn)行的結(jié)果。比擬這兩種操作,寫出你的結(jié)論。同時指出$ 、$、$<在上述Makefile 中的含義。三、多個.c 文件的編譯1、創(chuàng)立文件、hello.h

18、和makefile/written by Emdoor#include <stdio.h>int main()printf("Welcome Emdoor!n");test2();return 1;/written by Emdoorinclude "hello2.h"#include <stdio.h>void test2(void)printf("Welcome Emdoor! hello2n");/written by Emdoorvoid test2(void);# makefile test for

19、multi files program#written by EmdoorCC= arm-linux-gccCFLAGS=all: hellohello: $(OBJS)$(CC) $(CFLAGS) $ -o $(CC) $(CFLAGS) c $< -o $(CC) $(CFLAGS) c $< -o $clean:rm rf hello *.o2、先后執(zhí)行如下命令 rootlocal$makerootlocal$lsroot51Board $./hello查看并記錄所生成的文件和運(yùn)行的結(jié)果, 寫出你的結(jié)論。3、修改makefile 文件斜黑體表示修改局部# makefile

20、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é)果, 寫出你的結(jié)論。并指出wildcard、.c.o 的含義和變量CFILES 代表的內(nèi)容。*四、利用autoconf和autom

21、ake工具包,將作業(yè)2的程序代碼交叉編譯后下載或用NFS在開發(fā)系統(tǒng)中運(yùn)行。相關(guān)練習(xí)1、根據(jù)提供的Linux 操作系統(tǒng)源碼中得Makefile 結(jié)構(gòu),分析在工程中多級目錄中存在著多個makefile 時,編譯的順序如何?2、根據(jù)Makefile 中變量定義規(guī)那么,如果實(shí)驗(yàn)中的hello.c 文件編譯到目標(biāo)平臺中運(yùn)行,應(yīng)該怎樣修改Makefile 中變量參數(shù)?相關(guān)知識在Linux 或Unix 環(huán)境下,對于只含有幾個源代碼文件的小程序如的編譯,可以手工鍵入gcc 命令對源代碼文件逐個進(jìn)行編譯;然而在大型的工程開發(fā)中,可能涉及幾十到幾百個源文件,采用手工鍵入的方式進(jìn)行編譯,那么非常不方便,而且一旦修改

22、了源代碼,尤其頭文件發(fā)生了的修改,采用手工方式進(jìn)行編譯和維護(hù)的工作量相當(dāng)大,而且容易出錯。所以在Linux 或Unix 環(huán)境下,人們通常利用GNU make 工具來自動完成應(yīng)用程序的維護(hù)和編譯工作。實(shí)際上,GNU make 工具通過一個稱為Makefile 的文件來完成對應(yīng)用程序的自動維護(hù)和編譯工作。Makefile 是按照某種腳本語法編寫的文本文件,而GNU make 能夠?qū)akefile 中指令進(jìn)行解釋并執(zhí)行編譯操作。Makefile 文件定義了一系列的規(guī)那么來指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進(jìn)行更復(fù)雜的功能操作。GNU make 工作時的執(zhí)行步驟

23、如下: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 步為第一個階段,6-7 為第二個階段。第一個階段中,如果定義的變量被使用了,那么,make 會把其展開在使用的位置。但make 并不會完全馬上展開,make 使用的是拖延戰(zhàn)術(shù),如果變量出現(xiàn)在依賴關(guān)系的規(guī)那么中,那么僅當(dāng)這條依賴被決定要使用了,變量才會在其內(nèi)部展開。下面對makefile 的相關(guān)問題進(jìn)行簡單介紹:1、Makefile 的根本結(jié)構(gòu)M

24、akefile 的一般結(jié)構(gòu):target :dependency command 結(jié)構(gòu)中各局部的含義:1、target目標(biāo):一個目標(biāo)文件,可以是Object 文件,也可以是執(zhí)行文件。還可以是一個標(biāo)簽Label。2、dependency依賴:要生成目標(biāo)文件target所依賴哪些文件3、command命令:創(chuàng)立工程時需要運(yùn)行的shell 命令注:命令command局部的每行的縮進(jìn)必須要使用Tab 而不能使用多個空格。Makefile 實(shí)際上是一個文件的依賴關(guān)系,也就是說, target 這一個或多個的目標(biāo)文件依賴于dependency 中的文件,其生成規(guī)那么定義在命令command 中。如果依賴文

25、件dependency中有一個以上的文件比目標(biāo)target文件要新的話,shell 命令command所定義的命令就會被執(zhí)行。這就是Makefile 的規(guī)那么。也就是Makefile 中最核心的內(nèi)容。例如,假設(shè)有一個C 源文件,該源文件包含有自定義的頭文件,那么目標(biāo)文件test.o 明確依賴于兩個源文件:test.c 和。如果只希望利用gcc 命令來生成test.o 目標(biāo)文件,這時,就可以利用如下的makefile 來定義test.o 的創(chuàng)立規(guī)那么:#This makefile just is a example.從上面的例子注意到,第一個字符為#的行表示注釋行。第一個非注釋行指定test.o

26、 為目標(biāo),并且依賴于test.c 和test.h 文件。隨后的行指定了如何從目標(biāo)所依賴的文件建立目標(biāo)。當(dāng)test.c 或test.h 文件在編譯之后又被修改,那么make 工具可自動重新編譯,如果在前后兩次編譯之間,test.c 和test.h 均沒有被修改,而且test.o 還存在的話,就沒有必要重新編譯。這種依賴關(guān)系在多源文件的程序編譯中尤其重要。通過這種依賴關(guān)系的定義,make工具可防止許多不必要的編譯工作。一個makefile 文件中可定義多個目標(biāo),利用make target 命令可指定要編譯的目標(biāo),如果不指定目標(biāo),那么使用第一個目標(biāo)。通常,makefile 中定義有clean 目標(biāo),

27、可用來去除編譯過程中的中間文件# This makefile just is a example.clean:rm -f *.o運(yùn)行make clean 時,執(zhí)行rm f *.o 命令,刪除編譯過程中生成的所有中間文件。2、Makefile 的根本內(nèi)容Makefile 一般包括包含:顯式規(guī)那么、隱晦規(guī)那么、變量定義、文件指示和注釋等五個內(nèi)容。1、顯式規(guī)那么:顯式規(guī)那么說明如何生成一個或多個的目標(biāo)文件。這是由Makefile 的書寫者明顯指出,要生成的文件,文件的依賴文件,生成的命令。2、變量定義。在Makefile 中可以定義一系列的變量,變量一般都是字符串,當(dāng)Makefile被執(zhí)行時,變量的

28、值會被擴(kuò)展到相應(yīng)的引用位置上。3、隱含規(guī)那么:由于GNU make 具有自動推導(dǎo)功能,所以隱晦規(guī)那么可以比擬粗糙地簡略地書寫Makefile,然后由GNU make 的自動推導(dǎo)功能完成隱晦規(guī)那么的內(nèi)容。4、文件指示。其包括了三個局部,一個是在一個Makefile 中引用另一個Makefile,就像C 語言中的include 一樣;另一個是指根據(jù)某些情況指定Makefile 中的有效局部,就像C 語言中的預(yù)編譯#if 一樣;還有就是定義一個多行的命令。5、注釋。Makefile 中只有行注釋,和UNIX 的Shell 腳本一樣,其注釋是用“#字符,如果你要在你的Makefile 中使用“#字符,

29、可以用反斜框進(jìn)行轉(zhuǎn)義,如:“#。2.1 Makefile 中的變量1、Makefile 中定義的變量,與C/C+語言中的宏一樣,代表一個文本字串,在Makefile被執(zhí)行時候變量會自動地展開在所使用的地方。Makefile 中的變量可以使用在“目標(biāo),“依賴目標(biāo),“命令或Makefile 的其它局部中。2、Makefile 中變量的命名字可以包含字符、數(shù)字,下劃線可以是數(shù)字開頭,但不應(yīng)該含有“:、“#、“=或是空字符空格、回車等。3、Makefile 中變量是大小寫敏感的,“foo、“Foo和“FOO是三個不同的變量名。傳統(tǒng)的Makefile 的變量名是全大寫的命名方式4、變量在聲明時需要給予初

30、值,而在使用時,需要在變量名前加上“$符號# makefile test for hello program#written by EmdoorCC=gccCFLAGS=all: hellohello: $(OBJS)$(CC) $(CFLAGS) $(OBJS) o hello$(CC) $(CFLAGS) c hello.c o $(OBJS)clean:rm rf hello *.o上面自定義變量OBJS 表示,當(dāng)makefile 被執(zhí)行時,變量會在使用它的地方精確地展開,就像C/C+中的宏一樣。上述makfile 變量展開后的形式為:# makefile test for hello

31、program#written by EmdoorCC=gccCFLAGS=all: hellohello: gcc hello.o o hellohello.gcc c hello.c o clean:rm rf hello *.oGNU make 的主要預(yù)定義變量GNU make 有許多預(yù)定義的變量,這些變量具有特殊的含義,可在規(guī)那么中使用。以下給出了一些主要的預(yù)定義變量,除這些變量外,GNU make 還將所有的環(huán)境變量作為自己的預(yù)定義變量。$ 表示規(guī)那么中的目標(biāo)文件集。在模式規(guī)那么中,如果有多個目標(biāo),那么,"$"就是匹配于目標(biāo)中模式定義的集合。$% 僅當(dāng)目標(biāo)是函數(shù)庫

32、文件中,表示規(guī)那么中的目標(biāo)成員名。例如,如果一個目標(biāo)是"foo.a(bar.o)",那么,"$%"就是"bar.o","$"就是"foo.a"。如果目標(biāo)不是函數(shù)庫文件Unix下是.a,Windows 下是.lib,那么,其值為空。$< 依賴目標(biāo)中的第一個目標(biāo)名字。如果依賴目標(biāo)是以模式即"%"定義的,那么"$<"將是符合模式的一系列的文件集。注意,其是一個一個取出來的。$? 所有比目標(biāo)新的依賴目標(biāo)的集合。以空格分隔。$ 所有的依賴目標(biāo)的集合。以空

33、格分隔。如果在依賴目標(biāo)中有多個重復(fù)的,那個這個變量會去除重復(fù)的依賴目標(biāo),只保存一份。$+ 這個變量很像"$",也是所有依賴目標(biāo)的集合。只是它不去除重復(fù)的依賴目標(biāo)。命令的變量。AR 函數(shù)庫打包程序。默認(rèn)命令是“ar。AS 匯編語言編譯程序。默認(rèn)命令是“as。CC C 語言編譯程序。默認(rèn)命令是“cc。CXX C+語言編譯程序。默認(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ò)

34、展文件的程序。默認(rèn)命令是“get。LEX Lex 方法分析器程序針對于C 或Ratfor。默認(rèn)命令是“l(fā)ex。PC Pascal 語言編譯程序。默認(rèn)命令是“pc。YACC Yacc 文法分析器針對于C 程序。默認(rèn)命令是“yacc。YACCR Yacc 文法分析器針對于Ratfor 程序。默認(rèn)命令是“yacc r。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

35、。WEAVE 轉(zhuǎn)換Web 到TeX 的程序。默認(rèn)命令是“weave。CWEAVE 轉(zhuǎn)換CWeb 到TeX 的程序。默認(rèn)命令是“cweave。TANGLE 轉(zhuǎn)換Web 到Pascal 語言的程序。默認(rèn)命令是“tangle。CTANGLE 轉(zhuǎn)換CWeb 到C。默認(rèn)命令是“ctangle。RM 刪除文件命令。默認(rèn)命令是“rm f。命令參數(shù)變量:下面的這些變量都是相關(guān)上面的命令的參數(shù)。如果沒有指明其默認(rèn)值,那么其默認(rèn)值都是空。ARFLAGS 函數(shù)庫打包程序AR 命令的參數(shù)。默認(rèn)值是“rv。ASFLAGS 匯編語言編譯器參數(shù)。當(dāng)明顯地調(diào)用“.s或“.S文件時。CFLAGS C 語言編譯器參數(shù)。CXXFL

36、AGS C+語言編譯器參數(shù)。COFLAGS RCS 命令參數(shù)。CPPFLAGS C 預(yù)處理器參數(shù)。 C 和Fortran 編譯器也會用到。FFLAGS Fortran 語言編譯器參數(shù)。GFLAGS SCCS “get程序參數(shù)。LDFLAGS 鏈接器參數(shù)。如:“l(fā)dLFLAGS Lex 文法分析器參數(shù)。PFLAGS Pascal 語言編譯器參數(shù)。RFLAGS Ratfor 程序的Fortran 編譯器參數(shù)。YFLAGS Yacc 文法分析器參數(shù)。2.2 隱含規(guī)那么GNU make 包含有一些內(nèi)置的或隱含的規(guī)那么,這些規(guī)那么定義了如何從不同的依賴文件建立特定類型的目標(biāo)。GNU make 支持兩種類

37、型的隱含規(guī)那么:1、后綴規(guī)那么Suffix Rule。后綴規(guī)那么是定義隱含規(guī)那么的老風(fēng)格方法。后綴規(guī)那么定義了將一個具有某個后綴的文件例如,.c 文件轉(zhuǎn)換為具有另外一種后綴的文件例如,.o 文件的方法。每個后綴規(guī)那么以兩個成對出現(xiàn)的后綴名定義,例如,將.c 文件轉(zhuǎn)換為.o 文件的后綴規(guī)那么可定義為:.c.o:$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $ $<2、模式規(guī)那么pattern rules。這種規(guī)那么更加通用,因?yàn)榭梢岳媚J揭?guī)那么定義更加復(fù)雜的依賴性規(guī)那么。模式規(guī)那么看起來非常類似于正那么規(guī)那么,但在目標(biāo)名稱的前面多了一個% 號,同時可用來定義目標(biāo)和

38、依賴文件之間的關(guān)系,例如下面的模式規(guī)那么定義了如何將任意一個X.c 文件轉(zhuǎn)換為X.o 文件:%.c:%.o$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $ $<2.3 文件引用在Makefile 使用include 關(guān)鍵字可以把別的Makefile 包含進(jìn)來,這很像C 語言的#include,被包含的文件會原模原樣的放在當(dāng)前文件的包含位置。例如:有這樣幾個Makefile:、,還有一個文件叫,以及一個變量$(bar),其包含了e.mk 和,那么,下面的語句:include foo.make *.mk $(bar)等價(jià)于:make 命令開始時,會把找尋include

39、 所指出的其它Makefile,并把其內(nèi)容安置在當(dāng)前的位置。如果文件都沒有指定絕對路徑或是相對路徑的話,make 首先會在當(dāng)前目錄下尋找,如果當(dāng)前目錄下沒有找到,那么,make 還會在下面的幾個目錄下找:1如果make 執(zhí)行時,有“-I或“-include-dir參數(shù),那么make 就會在這個參數(shù)所指定的目錄下去尋找。2、如果目錄<prefix>/include一般是:/usr/local/bin 或/usr/include存在的話,make 也會去找。如果有文件沒有找到的話,make 會生成一條警告信息,但不會馬上出現(xiàn)致命錯誤。它會繼續(xù)載入其它的文件,一旦完成makefile 的

40、讀取,make 會再重試這些沒有找到,或是不能讀取的文件,如果還是不行,make 才會出現(xiàn)一條致命信息。2.4 Makefile 中的函數(shù)在Makefile 中可以使用函數(shù)來處理變量,從而讓命令或規(guī)那么更為的靈活和具有智能,函數(shù)調(diào)用,很像變量的使用,也是以“$來標(biāo)識的,函數(shù)調(diào)用后,函數(shù)的返回值可以當(dāng)做變量來使用。例如:'wildcard' 的函數(shù),可以展開成一列所有符合由其參數(shù)描述的文件名。文件間以空格間隔。語法如下:$(wildcard PATTERN.)用'wildcard' 函數(shù)找出目錄中所有的".c"文件:SOURCES = $(wi

41、ldcard *.c)。實(shí)際上,GNU make 還是許多如字符串處理函數(shù)、文件名操作函數(shù)等其他函數(shù)3、運(yùn)行make3.1 Make 的執(zhí)行一般來說,最簡單的就是直接在命令行下輸入make 命令,GNU make 找尋默認(rèn)的Makefile 的規(guī)那么是在當(dāng)前目錄下依次找三個文件 “GNUmakefile、“makefile和“Makefile。其按順序找這三個文件,一旦找到,就開始讀取這個文件并執(zhí)行,也可以給make命令指定一個特殊名字的Makefile。要到達(dá)這個功能,要求使用make 的“-f或是“-file參數(shù),例如:make efile3.2 嵌套執(zhí)行make在一些大的工程中,不同模塊

42、或是不同功能的源文件放在不同的目錄中,可以在每個目錄中都書寫一個該目錄的Makefile,這有利于Makefile 變得更加地簡潔,而不至于把所有的東西全部寫在一個Makefile 中,這個技術(shù)對于進(jìn)行模塊編譯和分段編譯有著非常大的好處。例如,有一個子目錄叫subdir,這個目錄下有個Makefile 文件指明了這個目錄下文件的編譯規(guī)那么。那么總控的Makefile 可以書寫:subsystem:cd subdir && $(MAKE)如果要傳遞變量到下級Makefile 中,那么可以使用export <variable .>來聲明。3.3 GNU make 命令選

43、項(xiàng)GNU make 命令還有一些其他選項(xiàng),下面給出了這些選項(xiàng)。命令行選項(xiàng)含義-C DIR 在讀取makefile 之前改變到指定的目錄DIR。-f FILE 以指定的FILE 文件作為makefile。-h 顯示所有的make 選項(xiàng)。-i 忽略所有的命令執(zhí)行錯誤。-I DIR 當(dāng)包含其他makefile 文件時,可利用該選項(xiàng)指定搜索目錄。-n 只打印要執(zhí)行的命令,但不執(zhí)行這些命令。-p 顯示make 變量數(shù)據(jù)庫和隱含規(guī)那么。-s 在執(zhí)行命令時不顯示命令。-w 在處理makefile 之前和之后,顯示工作目錄。-W FILE 假定文件FILE 已經(jīng)被修改。實(shí)驗(yàn)三 Cross-gdb實(shí)驗(yàn) 實(shí)驗(yàn)?zāi)康?/p>

44、1、充分了解在嵌入式系統(tǒng)的開發(fā)過程中,為什么需要交叉調(diào)試,及交叉調(diào)試所扮演的角色。2、掌握利用Cross-gdb,構(gòu)建交叉調(diào)試環(huán)境的方法;3、掌握通過串行口與TCP/IP,使用Cross-gdb,實(shí)現(xiàn)嵌入式Linux應(yīng)用程序的遠(yuǎn)程調(diào)試。實(shí)驗(yàn)環(huán)境1、裝有Linux 操作系統(tǒng)的PC 機(jī)一臺;2、XSBase270 或XSBase255 ARM 實(shí)驗(yàn)開發(fā)平臺一套3、實(shí)驗(yàn)內(nèi)容閱讀相關(guān)知識,完成以下實(shí)驗(yàn):使用Cross-gdb調(diào)試程序的第一步是編譯安裝Cross-gdb和Gdbserver,按以下步驟完成。一、編譯GDB客戶端:從下載源代碼,然后GDB編譯成支持ARM結(jié)構(gòu)的版本。當(dāng)編譯客戶端Cross-

45、gdb時,configure的target參數(shù)為arm-linux,host參數(shù)為arm-linux,這樣客戶端才能和ARM的效勞端進(jìn)行通信,調(diào)試應(yīng)用程序。   root $ 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如果編譯過程沒有錯誤,arm-linux-gdb會在/usr/local/arm-gdb/bin目錄中生成。為了在任何目錄下都能使用Cros

46、s-gdb,必須對路徑進(jìn)行設(shè)置。翻開/root/.bash_profile文件設(shè)置路徑。root $ 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 gdb-6.1# ./configure -target=arm-linux -host= arm-linux進(jìn)入生成的Gdbserver目錄,將該目錄下

47、的configure屬性該為可執(zhí)行,并運(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/gdbserve將文件中的 #define HAVE_SYS_REG_H 1 改為 / #define HAVE_SYS_REG_H 1編譯Gdbserver:root $ xmu gdbserver# make CC=arm-linux-gc

48、c2、將編譯好的Gdbserver用以下三種方法之一下載到開發(fā)板上的/usr/bin目錄中1通過nfs掛載后復(fù)制nfs的具體配置參見實(shí)驗(yàn)1。設(shè)主機(jī)的IP為00,Gdbserver已拷貝到主機(jī)的/mnt/nfs目錄下,將掛載到目標(biāo)機(jī)的/mnt/nfs51下,再下載到開發(fā)板上的/usr/bin目錄中。在minicom中對目標(biāo)機(jī)進(jìn)行操作如下:root51Board$ mount t nfs 00:/mnt/nfs /mnt/nfs51root51Board$ cp a /mnt/nfs51/gdbserver /usr/bin2通過串口下載在目標(biāo)板的min

49、icom終端中切換到/usr/bin目錄后下載。3通過ftp下載將編譯好的gdbserver復(fù)制到宿主機(jī)的/var/pub目錄下,在目標(biāo)板的minicom終端中用ftp命令連接到宿主機(jī)下載。三、使用Cross-gdb遠(yuǎn)程調(diào)試程序1、在主機(jī)上編寫測試代碼,并交叉編譯。測試代碼hello.c如下: 這個程序模擬使用空指針產(chǎn)生的錯誤。交叉編譯這段代碼:root$xmu temp# arm-linux-gcc g hello.c o hello2、將交叉編譯好的hello文件下載到目標(biāo)板上的root目錄下。可用minicom的文件發(fā)送功能,或nfs文件傳輸,具體步驟參見實(shí)驗(yàn)1。3、進(jìn)入/root目錄,

50、啟動開發(fā)板上的gdbserver來調(diào)試hello:設(shè)主機(jī)的IP為00,開發(fā)板的IP為0這個命令使gdbserver在1234端口監(jiān)聽。4、然后在PC機(jī)上運(yùn)行arm-linux-gdb,并通過TCP/IP鏈接到gdbserver運(yùn)行arm-linux-gdb,結(jié)果如下:此時,處在gdb的命令行調(diào)試狀態(tài)下。通過TCP/IP鏈接到開發(fā)板的gdbserver。如果鏈接成功,開發(fā)板的串口終端minicom上會顯示以下信息:5、接下來開始在主機(jī)上調(diào)試程序此處的hello為PC機(jī)上hello所在的路徑,如果不對,可在gdb命令行狀態(tài)下用cd命令切換。為了調(diào)試空指針

51、引起的錯誤,在第6行設(shè)置斷點(diǎn):執(zhí)行代碼并單步跟蹤:可以看到程序的第6行執(zhí)行時出現(xiàn)了一個段錯誤,段錯誤通常是由內(nèi)存的非法訪問引起的。在此程序中,指針str未初始化為有效存儲空間,因而出現(xiàn)段錯誤。從調(diào)試過程可以看出,通過聯(lián)合使用gdb/gdbserver可以快速定位嵌入式程序中的錯誤,提高了編程效率。6、退出gdb調(diào)試可用quit命令在目標(biāo)板的串口終端minicom上會顯示四、用Cross-gdb調(diào)試作業(yè)31、將程序設(shè)計(jì)作業(yè)用交叉編譯器編譯后下載到目標(biāo)板的/root目錄下。2、按本次實(shí)驗(yàn)中第三局部的介紹調(diào)試它。3、注意由于被調(diào)試程序是由gdbserver啟動的,所以應(yīng)該在啟動時添加命令行參數(shù)。相關(guān)

52、練習(xí)1、 Cross-gdb與gdb在用法上有何不同?2、 如何修改實(shí)驗(yàn)程序hello.c中空指針的錯誤?相關(guān)知識1、Cross-gdb 簡介嵌入式應(yīng)用軟件的開發(fā),除了根本cross compiler交叉編譯與cross assembler/linker之外,程序開發(fā)過程中的測試與除錯是另一個重要的局部,提供使用者方便、易使用的source-level debugger,將可縮短程序開發(fā)的進(jìn)程,同時進(jìn)一步提升軟件的品質(zhì)。GNU debuggerGDB提供了一個開源、高質(zhì)量的調(diào)試器,讓使用者可以由命令行模式、文字視窗模式或圖形模式等方式進(jìn)行應(yīng)用程序的除錯工作。GDB目前所支持的程序語言包含了C、

53、C+、Fortran等。與gcc相似,GDB后端也支持許多不同的處理器系統(tǒng)平臺,可運(yùn)行于主機(jī)上進(jìn)行跨平臺的交叉調(diào)試。除此之外,GDB也支持開展嵌入式系統(tǒng)最需要的remote debug遠(yuǎn)程調(diào)試,需要remote debug的原因是嵌入式系統(tǒng)通常很小,有時并不適合執(zhí)行整個debugger,因此,在主機(jī)上對遠(yuǎn)端的嵌入式系統(tǒng)作remote debug是最適當(dāng)?shù)姆绞?。GDB采用gdbstub或gdbserver,通過serial port或TCP/IP來實(shí)現(xiàn)remote debug。2、實(shí)驗(yàn)原理GDB 是支持遠(yuǎn)程調(diào)試的,可以通過 serial port, tcp, udp 和 pipe 與目標(biāo)機(jī)進(jìn)行交流,使用的語言叫做 RSP(Remote Serial Protocol),同樣這需要目標(biāo)機(jī)使用同樣的語言和它交流,這樣就需要一個翻譯。這個目標(biāo)機(jī)上的翻譯程序就是 stub (裸機(jī)和簡單操作系統(tǒng)) 或者 gdbserver (可以運(yùn)行g(shù)db的操作系統(tǒng))。除此之外,還必須在主機(jī)上創(chuàng)立交叉調(diào)試的環(huán)境,因?yàn)?GDB 必須知道目標(biāo)機(jī)的結(jié)構(gòu)(存放器,字長等等),二進(jìn)制文件的格式(elf,pe,存放器代號),操作指令才可以實(shí)現(xiàn)遠(yuǎn)程調(diào)試,不然它怎么知

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論