嵌入式Linux編程開(kāi)發(fā)基礎(chǔ)知識(shí)_第1頁(yè)
嵌入式Linux編程開(kāi)發(fā)基礎(chǔ)知識(shí)_第2頁(yè)
嵌入式Linux編程開(kāi)發(fā)基礎(chǔ)知識(shí)_第3頁(yè)
嵌入式Linux編程開(kāi)發(fā)基礎(chǔ)知識(shí)_第4頁(yè)
嵌入式Linux編程開(kāi)發(fā)基礎(chǔ)知識(shí)_第5頁(yè)
已閱讀5頁(yè),還剩87頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論