版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章嵌入式Linux編程開(kāi)發(fā)
根底知識(shí)目錄3.1Linux環(huán)境下相關(guān)工具的使用介紹3.2交叉編譯工具鏈的使用3.3Makefile工程管理器Linux環(huán)境下相關(guān)工具的使用介紹VI兩種模式的實(shí)例VI進(jìn)入/退出輸入模式進(jìn)入和退出vi刪除和修改文本光標(biāo)移動(dòng)光標(biāo)按行移動(dòng)光標(biāo)按單詞移動(dòng)文本編輯文本編輯文本替換文本刪除與替換比照加密/解密復(fù)制和移動(dòng)文本塊.表示當(dāng)前行,0表示文件頭,$表示文件尾文件保存GDB四大功能啟動(dòng)、加載、退出GDBGDB的操作GDB的操作GDB的操作GDB的操作GDB的操作GDB的操作GDB的操作GDB遠(yuǎn)程調(diào)試功能本地主機(jī)Xwindow環(huán)境GDB/XGDB遠(yuǎn)程主機(jī)Stub程序內(nèi)核應(yīng)用程序串口或TCP/IP連接SourceInsight的使用方法目錄3.1Linux環(huán)境下相關(guān)工具的使用介紹3.2交叉編譯工具鏈的使用3.3Makefile工程管理器3.4“文件包含〞處理gcc、arm-linux-gcc介紹GCC(GNUCompilerCollection)執(zhí)行編譯的過(guò)程arm-linux-gcc的執(zhí)行過(guò)程與gcc一致gcc、arm-linux-gcc介紹gcc、arm-linux-gcc的用法gcc[options][filenames]arm-linux-gcc使用參數(shù)與gcc一致交叉工具鏈常用工具介紹arm-linux-ld鏈接工具的選項(xiàng)介紹ld將目標(biāo)文件跟檔案文件連接起來(lái)并重定位它們的數(shù)據(jù)連接、符號(hào)引用arm-linux-ld鏈接工具作用ld鏈接器的優(yōu)勢(shì)在遇到錯(cuò)誤的時(shí)候ld鏈接器能繼續(xù)執(zhí)行以便于發(fā)現(xiàn)其他其他錯(cuò)誤并且能提供診斷信息arm-linux-ld鏈接工具的選項(xiàng)介紹ld-oOUTPUT/lib/crt0.ohello.o-lc鏈接實(shí)例分析鏈接器輸出文件名鏈接文件鏈接文件對(duì)庫(kù)libc.a的搜索輸出參數(shù)arm-linux-ld鏈接工具的選項(xiàng)介紹交叉編譯工具的制作需要的壓縮包:
crosstool-0.43.tar.gzbinutils-2.16.1.tar.bz2gcc-4.0.2.tar.gzglibc-2.3.6.tar.gzglibc-linuxthreads-2.3.6.tar.gzlinux-2.6.26.tar.gzlinux-libc-headers-2.6.12.0.tar.bz2準(zhǔn)備工具包交叉編譯工具的制作在登錄的用戶目錄下面建立cross目錄mkdir/home/jameszhang/cross交叉編譯工具的制作將crosstool-0.43.tar.gz復(fù)制到cross目錄并解壓
cpcrosstool-0.43.tar.gz/home/jameszhang/crosscd/home/jameszhang/cross交叉編譯工具的制作將其他文件一起復(fù)制到cross目錄下cpbinutils-2.16.1.tar.bz2/home/jameszhang/crosscpgcc-4.0.2.tar.gz/home/jameszhang/crosscpglibc-2.3.6.tar.gz/home/jameszhang/crosscpglibc-linuxthreads-2.3.6.tar.gz/home/jameszhang/crosscplinux-2.6.26.tar.gz/home/jameszhang/crosscplinux-libc-headers-2.6.12.0.tar.bz2/home/jameszhang/cross交叉編譯工具的制作進(jìn)入crosstool-0.43目錄對(duì)相關(guān)文件進(jìn)行修改修改arm.dat KERNELCONFIG=`pwd`/arm.config TARGET=arm-linux TARGET_CFLAGS="-O"交叉編譯工具的制作進(jìn)入crosstool-0.43目錄對(duì)相關(guān)文件進(jìn)行修改修改demo-arm.sh將第7、8行改為如下:TARBALLS_DIR=/home/jameszhang/cross /*下載的源碼包存放
的路徑*/RESULT_TOP=/home/jameszhang/crosstool /*交叉編譯工具鏈安
裝的路徑*/屏蔽第44行在44行下添加:eval`catarm.datgcc-4.0.2-glibc-2.3.6.dat`shall.sh--notestt交叉編譯工具的制作修改gcc-4.0.2-glibc-2.3.6.dat進(jìn)入crosstool-0.43目錄對(duì)相關(guān)文件進(jìn)行修改修改成如下:BINUTILS_DIR=binutils-2.16.1GCC_DIR=gcc-4.0.2GLIBC_DIR=glibc-2.3.6LINUX_DIR=linux-2.6.26LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6交叉編譯工具的制作生成交叉編譯工具執(zhí)行./demo-arm.sh即可生成我們需要的交叉編譯工具(半小時(shí)左右)最終生成交叉編譯工具的位置:/home/jameszhang/crosstool目錄3.1Linux環(huán)境下相關(guān)工具的使用介紹3.2交叉編譯工具鏈的使用3.3Makefile工程管理器3.4“文件包含〞處理Makefile工程管理器什么是makefile項(xiàng)目中的源文件不計(jì)數(shù),按類型、功能、模塊分別放在若干目錄中,makefile定義了一系列的規(guī)則來(lái)指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,makefile就像一個(gè)Shell腳本一樣,也可以執(zhí)行操作系統(tǒng)的命令。makefile的好處make是一個(gè)命令工具,是一個(gè)解釋makefile中指令的命令工具??梢赃M(jìn)行“自動(dòng)化編譯”,一旦寫(xiě)好只需要一個(gè)make命令,整個(gè)工程完全自動(dòng)編譯,極大的提高了軟件開(kāi)發(fā)的效率。Makefile工程管理器makefile的基本結(jié)構(gòu)target……:dependency……
command……target(目標(biāo)):一個(gè)目標(biāo)文件,可以是Object文件,也可以可執(zhí)行文件,還可以是一個(gè)標(biāo)簽(Label)dependency(依賴):要生成目標(biāo)文件(target)所依賴哪些文件command(命令):創(chuàng)立工程時(shí)需要運(yùn)行的shell命令【注:命令(command)局部的每行的縮進(jìn)必須要使用Tab而不能使用多個(gè)空格】Makefile工程管理器makefile實(shí)例假設(shè)有一個(gè)C源文件test.c,該源文件含有自定義的頭文件test.h,則目標(biāo)文件test.o依賴于兩個(gè)源文件:test.c和test.h。如果希望利用gcc命令來(lái)生成test.o目標(biāo)文件。則可以利用如下的makefile來(lái)定義test.o的創(chuàng)建規(guī)則:#Thismakefilejustisaexample. //注釋行
test.o:test.ctest.h gcc–ctest.cclean: //清除編譯中的中間文件 rm
-f
*.oMakefile工程管理器makefile實(shí)例edit
:
main.o
kbd.o
command.o
display.o
\
cc
-o
edit
main.o
kbd.o
command.o
display.o
\
main.o
:
main.c
defs.h
cc
-c
main.c
kbd.o
:
kbd.c
defs.h
command.h
cc
-c
kbd.c
command.o
:
command.c
defs.h
command.h
cc
-c
command.c
display.o
:
display.c
defs.h
buffer.h
cc
-c
display.c
clean
:
rm
edit
main.o
kbd.o
command.o
display.o
\
“\〞為換行符方便閱讀Makefile工程管理器make命令編譯鏈接文件的過(guò)程Makefile工程管理器makefile的基本內(nèi)容Makefile工程管理器makefile-隱晦規(guī)則實(shí)例objects
=
main.o
kbd.o
command.o
display.o
\
edit:$(objects)
cc
-o
edit
$(objects)
main.o
:
defs.h
kbd.o
:
defs.h
command.h
command.o
:
defs.h
command.h
display.o
:
defs.h
buffer.h
clean
:
rm
edit
$(objects)
Makefile工程管理器makefile-清空目標(biāo)文件規(guī)則實(shí)例一般風(fēng)格
clean:
rm
edit
$(objects)
更為穩(wěn)健的做法
.PHONY
:
clean
clean
:
-rm
edit
$(objects)表示clean是偽目標(biāo)“-〞表示如果某些文件出現(xiàn)問(wèn)題,但不馬上處理,先繼續(xù)做后面的事Makefile工程管理器GNUmake工作時(shí)的執(zhí)行步驟Makefile工程管理器makefile中的變量Makefile工程管理器makefile變量舉例#makefiletestforhelloprogram#writtenbyEmdoorCC=gccCFLAGS=OBJS=hello.oall:hellohello:$(OBJS) $(CC)$(CFLAGS)$(OBJS)–ohellohello.o:hello.c $(CC)$(CFLAGS)–chello.c–o$(OBJS)clean: rm–rfhello*.o使用自定義變量OBJS表示hello.oMakefile工程管理器makefile變量舉例#makefiletestforhelloprogram#writtenbyEmdoorCC=gccCFLAGS=OBJS=hello.oall:hellohello:hello.o gcchello.o–ohellohello.o:hello.c gcc–chello.c–ohello.oclean: rm–rfhello*.omakefile執(zhí)行展開(kāi)后的形式Makefile工程管理器GNUmake主要預(yù)定義變量Makefile工程管理器GNU
make
的隱含規(guī)則Makefile工程管理器文件引用在makefile使用include關(guān)鍵字可以把別的makefile包含進(jìn)來(lái),這很像C語(yǔ)言的#include,被包含的文件會(huì)原模原樣的放在當(dāng)前文件的包含位置。有三個(gè)makefile:a.mk、b.mk、c.mk,還有一個(gè)為foo.make,以及一個(gè)變量$(bar),其包含了e.mk和f.mk,那么,下面的語(yǔ)句:
includefoo.make*.mk$(bar)
等價(jià)于:
includefoo.makea.mkb.mkc.mke.mkf.mkMakefile工程管理器文件引用make命令開(kāi)始時(shí),會(huì)把找尋include所指出的其它Makefile,并把其內(nèi)容安置在當(dāng)前的位置。如果文件都沒(méi)有指定絕對(duì)路徑或是相對(duì)路徑的話,make首先會(huì)在當(dāng)前目錄下尋找,如果當(dāng)前目錄下沒(méi)有找到。那么,make還會(huì)在下面的幾個(gè)目錄下找:如果make執(zhí)行時(shí)有-I或--include-dir參數(shù)make就會(huì)在這個(gè)參數(shù)所指定的目錄下去尋找如果目錄<prefix>/include(一般是/usr/include)存在make也會(huì)去找如果有文件沒(méi)有找到的話,make會(huì)生成一條警告信息,但不會(huì)馬上出現(xiàn)致命錯(cuò)誤。它會(huì)繼續(xù)載入其它的文件,一旦完成makefile的讀取,make會(huì)再重試這些沒(méi)有找到,如果還是不行make才會(huì)出現(xiàn)一條致命信息Makefile工程管理器makefile中的函數(shù)在makefile中可以使用函數(shù)來(lái)處理變量,從而讓命令或規(guī)則更為靈活和智能,函數(shù)調(diào)用很像變量的使用,是以“$”來(lái)標(biāo)識(shí)的,函數(shù)調(diào)用后,返回值可以當(dāng)做變量來(lái)使用如最常見(jiàn)的wildcard的函數(shù),可以展開(kāi)成一列所有符合由其參數(shù)描述的文件名。文件間以空格間隔。語(yǔ)法如下:$(wildcardPATTERN...)例:用'wildcard'函數(shù)找出目錄中所有的".c"文件:SOURCES=$(wildcard*.c)Makefile工程管理器make的執(zhí)行make找尋默認(rèn)的makefile的規(guī)則是在當(dāng)前目錄下依次找三個(gè)文件按順序找這三個(gè)文件,一旦找到,就開(kāi)始讀取該文件并執(zhí)行Makefile工程管理器嵌套執(zhí)行make在大工程中,經(jīng)常按功能模塊存放源文件,為了讓程序結(jié)構(gòu)清晰所以經(jīng)常在每個(gè)目錄都存放該目錄的makefile,這種方式對(duì)于分模塊和分段編譯帶來(lái)便利例:一個(gè)子目錄叫subdir,該目錄下有makefile文件,來(lái)指明了這個(gè)目錄下文件的編譯規(guī)則。那么我們父目錄的makefile可以這樣書(shū)寫(xiě):
subsystem:
cd
subdir
&&
$(MAKE)
等價(jià)于:
subsystem:
$(MAKE)
-C
subdir
先進(jìn)入subdir目錄然后執(zhí)行make命令定義成變量容易維護(hù)Makefile工程管理器makefile傳遞變量父makefile的變量可以傳遞到子makefile中(如果你顯示的聲明),但是不會(huì)覆蓋子Makefile中所定義的變量,除非指定“-e”參數(shù)傳遞變量到子makefile中通過(guò)export
<variable
...>;進(jìn)行申明
例、完成子目錄make后,離開(kāi)目錄時(shí)我們可以看到如下:
make:
Leaving
directory
`/EELiod/Kernel/linux-2.4.21-51Board_EDR/arch/arm/boot`變量傳遞完成退出makeMakefile工程管理器makefile變量定義變量的值使用=號(hào),在=左側(cè)是變量,右側(cè)是變量的值,右側(cè)變量的值可以定義在文件的任何一處。(注:右側(cè)中的變量不一定非要是已定義好的值,其也可以使用后面定義的值)例:
A
=
$(B)
B
=
$(A)
這會(huì)讓make陷入無(wú)限的變量展開(kāi)過(guò)程中去使用:=操作符,右側(cè)是變量的值,右側(cè)變量的值,右側(cè)變量的值只能定義在使用變量之前。(注:前面的變量不能使用后面的變量,只能使用前面已定義好了的變量)例:
x
:=
foo
y
:=
$(x)
bar
x
:=
later
其等價(jià)于:
y
:=
foo
bar
x
:=
laterMakefile工程管理器makefile條件判斷
ifeq
(,)
$(CC)
-o
......
else
$(CC)
-o
......
endif表示條件語(yǔ)句開(kāi)始,并指定一個(gè)條件表達(dá)式,表達(dá)式包含兩個(gè)參數(shù)以逗號(hào)分隔,表達(dá)式以圓括號(hào)括起表示條件表達(dá)式為假的情況表示一個(gè)條件語(yǔ)句的結(jié)束,任何一個(gè)條件表達(dá)式都以endif結(jié)束Makefile工程管理器makefile條件表達(dá)式<conditional-directive>;
<text-if-true>;
else
<text-if-false>;
endif
1、頭文件在C語(yǔ)言中,需要利用頭文件來(lái)定義結(jié)構(gòu)、常量以及聲明函數(shù)的原型。大多數(shù)C的頭文件都存放在/usr/include及其子目錄下。引用以上目錄中的頭文件在編譯的時(shí)候無(wú)需加上路徑,但如果程序中引用了其他路徑的頭文件,需要在編譯的時(shí)候用–I參數(shù)。3.4“文件包含〞處理2、“文件包含〞處理“文件包含〞處理,意思是把另外一個(gè)源文件的內(nèi)容包含到本程序中來(lái)。其作用是減少編寫(xiě)程序的重復(fù)勞動(dòng),即把一些要重復(fù)使用的東西,編寫(xiě)到一個(gè)“頭文件〞〔*.h〕中,然后在程序中用#include命令來(lái)實(shí)現(xiàn)“文件包含〞的操作。例如:∑n=1+2+3+……+100求和運(yùn)算。1
#include<stdio.h>2
intmain(){3
intx=100,s=0,i=1;5
while(i<=x)
{6
s=s+i;7
i++;8
}9
printf("sum=%d\n",s);10
return0;11
}為了讓加法局部能重復(fù)使用,將加法局部寫(xiě)成一個(gè)函數(shù)intsum(intn)。intmysum(intn)
{
inti=1,ss=0;
while(i<=n){
ss=ss+i;
i++;
}
return(ss);
}再在主函數(shù)中調(diào)用它1
#include<stdio.h>2
intmysum(intn);3
intmain()4
{5
intx=100;6
ints=0;7
s=mysum(x);8
printf("sum=%d\n",s);9
return0;10
}注意:上述程序中的第2行語(yǔ)句intmysum(intn);是必不可少的。由于mysum(intn)函數(shù)的定義是從第11行語(yǔ)句開(kāi)始,而調(diào)用mysum(intn)函數(shù)的語(yǔ)句在第7行。因此,要在調(diào)用之前聲明這個(gè)函數(shù)。下面進(jìn)一步將程序中具有獨(dú)立功能的mysum()函數(shù)分割出來(lái)。該程序可分割為以下3個(gè)程序:mysum.h、mysum.c和ex_sum.c?!?〕程序mysum.h:1/*mysum.h*/2intmysum(intn);〔2〕程序mysum.c:1./*mysum.c*/2.intmysum(intn)3.{4. inti=1,ss=0;5. while(i<=n){6. ss=ss+i;7. i++;8.
}9. return(ss);10.}〔3〕主程序ex_sum.c:1./*ex_sum.c*/2.#include<stdio.h>3.#include"mysum.h"4.intmain()5.{6. intx=100;7. ints=0;8. s=mysum(x);9. printf("sum=%d\n",s);10. return0;11.}在Linux環(huán)境下,執(zhí)行編譯程序命令:
gccex_sum.cmysum.c-osum此命令將ex_sum.c和mysum.c編譯成一個(gè)在Linux環(huán)境下的可執(zhí)行文件sum。在Linux環(huán)境下運(yùn)行可執(zhí)行文件sum,
./sum結(jié)果如下:
sum=5050位運(yùn)算符C語(yǔ)言提供了六種位運(yùn)算符:
&〔按位與〕、|〔按位或〕、^〔按位異或〕、~〔取反〕、<<〔左移〕、>>〔右移〕。3.5位運(yùn)算1、按位與運(yùn)算按位與運(yùn)算:只有對(duì)應(yīng)的兩個(gè)二進(jìn)位均為1時(shí),結(jié)果位才為1,否那么為0。參與運(yùn)算的數(shù)以補(bǔ)碼方式出現(xiàn)。
例如:9&5可寫(xiě)成算式如下:可見(jiàn)9&5=1。按位與運(yùn)算通常用來(lái)對(duì)某些位清0或保存某些位。例如把a(bǔ)的高八位清0,保存低八位,可作a&0x00ff運(yùn)算〔0x00ff的二進(jìn)制數(shù)為0000000011111111〕。
main(){
inta=9,b=5,c;
c=a&b;
printf("a=%d/nb=%d/nc=%d/n",a,
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 職業(yè)健康與心理健康的整合服務(wù)策略
- 金華浙江金華永康市疾病預(yù)防控制中心工作人員招聘筆試歷年參考題庫(kù)附帶答案詳解
- 荊門(mén)2025年湖北荊門(mén)市人民醫(yī)院招聘護(hù)理人員30人筆試歷年參考題庫(kù)附帶答案詳解
- 海南2025年中國(guó)熱帶農(nóng)業(yè)科學(xué)院椰子研究所高層次人才招聘筆試歷年參考題庫(kù)附帶答案詳解
- 沈陽(yáng)2025年遼寧沈陽(yáng)藥科大學(xué)招聘高層次和急需緊缺人才70人筆試歷年參考題庫(kù)附帶答案詳解
- 廣州廣東廣州市女子強(qiáng)制隔離戒毒所招聘編外人員5人筆試歷年參考題庫(kù)附帶答案詳解
- 宜賓四川宜賓珙縣各機(jī)關(guān)事業(yè)單位招聘派遣工作人員10人筆試歷年參考題庫(kù)附帶答案詳解
- 大理2025年秋季學(xué)期云南大理洱源縣教育體育局招募基礎(chǔ)教育銀齡教師筆試歷年參考題庫(kù)附帶答案詳解
- 吉安2025年江西吉安市萬(wàn)安縣城區(qū)學(xué)校選調(diào)教師78人筆試歷年參考題庫(kù)附帶答案詳解
- 職業(yè)人群健康教育轉(zhuǎn)化實(shí)踐
- 系統(tǒng)性紅斑狼瘡的飲食護(hù)理
- 電氣試驗(yàn)報(bào)告模板
- 重慶市沙坪壩小學(xué)小學(xué)語(yǔ)文五年級(jí)上冊(cè)期末試卷
- 陶瓷巖板應(yīng)用技術(shù)規(guī)程
- 中藥制劑技術(shù)中職PPT完整全套教學(xué)課件
- 龍虎山正一日誦早晚課
- WORD版A4橫版密封條打印模板(可編輯)
- 1比較思想政治教育
- 藝術(shù)課程標(biāo)準(zhǔn)(2022年版)
- JJF 1654-2017平板電泳儀校準(zhǔn)規(guī)范
- 上海市工業(yè)用水技術(shù)中心-工業(yè)用水及廢水處理課件
評(píng)論
0/150
提交評(píng)論