嵌入式編程基礎(chǔ)_第1頁
嵌入式編程基礎(chǔ)_第2頁
嵌入式編程基礎(chǔ)_第3頁
嵌入式編程基礎(chǔ)_第4頁
嵌入式編程基礎(chǔ)_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、嵌入式編程基礎(chǔ)嵌入式編程基礎(chǔ)嵌入式編程基礎(chǔ)linux 平臺(tái)下的應(yīng)用程序類型nlinux 下的應(yīng)用程序主要有兩種特殊的文件來代表:可執(zhí)行文件和腳本程序。n可執(zhí)行文件是能夠被計(jì)算機(jī)直接執(zhí)行的程序,相當(dāng)于win平臺(tái)下exe文件。n腳本程序則是一組指令,這些指令將由另外一個(gè)程序(一般來說是shell 解釋器)來執(zhí)行,相當(dāng)于dos下的bat文件。嵌入式編程基礎(chǔ)Shell如何解釋執(zhí)行命令n內(nèi)置命令-直接執(zhí)行n實(shí)例程序(用戶給出路徑的)-按照用戶給出的路徑執(zhí)行n實(shí)例程序(用戶未給出路徑)-按照PATH變量給出的路徑執(zhí)行嵌入式編程基礎(chǔ)n將被搜索的那些子目錄都被保存到一個(gè)名字為PATH的shell變量里面,和d

2、os下的情況差不多。PATH 是由系統(tǒng)管理員預(yù)先配置好了的,通常包括/bin,/usr/bin,/usr/local/bin,你可以使用echo$PATH來顯示。如果你是使用的root登陸系統(tǒng),則還會(huì)多包括/sbin,/usr/sbin目錄。嵌入式編程基礎(chǔ)應(yīng)用程序開發(fā)流程n編寫應(yīng)用程序(vi編輯器)n編譯應(yīng)用程序(編譯器)n調(diào)試運(yùn)行應(yīng)用程序(調(diào)試器)n執(zhí)行(直接輸入程序命令運(yùn)行)嵌入式編程基礎(chǔ)應(yīng)用程序開發(fā)流程(實(shí)例)應(yīng)用程序開發(fā)流程(實(shí)例)n為了快速獲得對(duì)linux 平臺(tái)下應(yīng)用程序設(shè)計(jì)的體驗(yàn),我們首先編寫經(jīng)典的hello world程序。 下面的代碼來自 c programming langu

3、age第一章 #include main() printf(hello, worldn); 嵌入式編程基礎(chǔ)利用vi進(jìn)行編輯n首先,進(jìn)入linux的控制臺(tái)界面。然后,在某個(gè)目錄建立一個(gè)空的c程序文件,比如利用touch /home/zhaohui/linuxApp/hello.c命令 然后cd到當(dāng)前目錄,調(diào)用vi編輯器對(duì)這個(gè)空文件進(jìn)行編輯,輸入這個(gè)程序的源代碼,(利用vihello.c命令,進(jìn)入vi編輯器,然后進(jìn)入vi 的編輯狀態(tài),然后輸入程序,然后進(jìn)入vi的命令狀態(tài),進(jìn)行源程序的保存和vi 的退出,回到shell 提示符。)n-hello.c-n#include nint main()nnpr

4、intf(Hello, Linux programmingnworld!n);nreturn 0;nn-嵌入式編程基礎(chǔ)gcc 編譯和程序運(yùn)行n然后在當(dāng)前目錄輸入編譯這個(gè)程序的命令,在程序沒有錯(cuò)誤的情況下,會(huì)在當(dāng)前目錄得到一個(gè)可執(zhí)行文件hello。n程序的運(yùn)行如圖所示。n注意:如果你只是輸入 gcc hello.c則生成的可執(zhí)行文件的名字是a.out嵌入式編程基礎(chǔ)過程總結(jié)n這個(gè)命令會(huì)依次調(diào)用gcc的預(yù)編譯器(cpp),匯編器(生成.s文件),編譯器(生成.o文件)和鏈接器程序(ld)。n$ gcc -E hello.c -o hello.cppn$ gcc -x cpp-output -c he

5、llo.cpp -o hello.on$ gcc hello.o -o hellon提示:命令$ gcc O2 -S hello.c 可以得到.s匯編文件。如果打算學(xué)習(xí)某個(gè)c語言程序所對(duì)應(yīng)的匯編代碼??梢詤⒖糲sapp的第三章。諸如變量、數(shù)組、指針、控制流、子程序等。n當(dāng)然也可以使用objdump d hello來查看匯編代碼。諸如objdump等這些命令稱為binutils,是非常強(qiáng)大的代碼分析工具。比如addr2line,ar,as,gprof,ld,nm,objcopy,objdump,ranlib,size,strings,strip等。具體可以參考其man命令手冊(cè)。嵌入式編程基礎(chǔ)文件

6、I/O編程n文件描述符n文件I/O相關(guān)操作函數(shù)nopen函數(shù)nclose函數(shù)nlseek函數(shù)nread函數(shù)nwrite函數(shù)ndup和dup2函數(shù)nfcntl函數(shù)嵌入式編程基礎(chǔ)文件描述符n文件描述符定義 linux中每打開一個(gè)文件都有一個(gè)文件描述符與之對(duì)應(yīng)。該描述符是一個(gè)非負(fù)整數(shù)。取值0對(duì)應(yīng)標(biāo)準(zhǔn)輸入,表示鍵盤1對(duì)應(yīng)標(biāo)準(zhǔn)輸出,一般屏幕2表示出錯(cuò)輸出,一般到屏幕嵌入式編程基礎(chǔ)文件I/O操作函數(shù)-open、close函數(shù)nOpen函數(shù)可以打開一個(gè)文件,也可以創(chuàng)建并打開文件;調(diào)用方式: #include #include #include Int open(const char pathname,int

7、 flag) 調(diào)用成功返回文件描述符,失敗返回-1nClose函數(shù)-關(guān)閉一個(gè)文件,釋放該文件上的記錄鎖調(diào)用方法:#includeInt close (int )返回成功0,出錯(cuò)-1嵌入式編程基礎(chǔ)文件I/O操作函數(shù)-read函數(shù)nRead函數(shù)用來讀取打開文件的數(shù)據(jù)n用法: #include ssize_t read (int * buf,size_t nbytes)n函數(shù)作用: 所代表的文件的當(dāng)前位移量處讀取nbytes個(gè)字節(jié)的數(shù)據(jù)到buf中,size_t是一個(gè)無符號(hào)整數(shù),返回類型ssize_t是帶符號(hào)整數(shù)。 返回值:成功,返回讀到的字節(jié)數(shù),到文件結(jié)尾返回0;錯(cuò)返回-1嵌入式編程基礎(chǔ)文件I/O讀

8、寫-程序示例nLED燈-GPIO實(shí)驗(yàn)程序嵌入式編程基礎(chǔ)文件I/O操作函數(shù)-dup函數(shù)n復(fù)制一個(gè)現(xiàn)存的文件描述符用法:#include int dup(int );int dup2(int );返回值:成功,返回新的文件描述符;失敗,返回-1嵌入式編程基礎(chǔ)文件I/O操作函數(shù)-lseeknLseek函數(shù)-每個(gè)打開的文件都關(guān)聯(lián)著一個(gè)文件位移量,用來標(biāo)識(shí)讀或?qū)懳募r(shí)的起始位置,lseek重新設(shè)置文件位移量。嵌入式編程基礎(chǔ)進(jìn)程控制開發(fā)n進(jìn)程控制開發(fā)n進(jìn)程的幾個(gè)基本概念n進(jìn)程相關(guān)幾個(gè)函數(shù)n進(jìn)程間通信n網(wǎng)絡(luò)編程嵌入式編程基礎(chǔ)進(jìn)程控制開發(fā)-基本概念 n進(jìn)程幾個(gè)基本概念n進(jìn)程-程序的執(zhí)行 進(jìn)程是一個(gè)具有獨(dú)立功能

9、的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。它可以申請(qǐng)和擁有系統(tǒng)資源,是一個(gè)動(dòng)態(tài)的概念,是一個(gè)活動(dòng)的實(shí)體。它不只是程序的代碼,還包括當(dāng)前的活動(dòng),通過程序計(jì)數(shù)器的值和處理寄存器的內(nèi)容來表示。n父子進(jìn)程 由于linux是一個(gè)多用戶的操作系統(tǒng),在同一時(shí)間可能會(huì)有多個(gè)用戶爭(zhēng)奪系統(tǒng)資源,進(jìn)程為了及時(shí),及早的完成任務(wù)(得到系統(tǒng)資源)就創(chuàng)建了子進(jìn)程來爭(zhēng)奪系統(tǒng)資源。一旦子進(jìn)程創(chuàng)建成功,父子進(jìn)程就會(huì)一起從創(chuàng)建處繼續(xù)執(zhí)行,兩個(gè)進(jìn)程相互爭(zhēng)奪系統(tǒng)資源。嵌入式編程基礎(chǔ)進(jìn)程開發(fā)控制-創(chuàng)建進(jìn)程函數(shù)nfork和vfork函數(shù)作用:創(chuàng)建進(jìn)程特點(diǎn):調(diào)用一次,返回兩次;子進(jìn)程中執(zhí)行返回值為0,父進(jìn)程中執(zhí)行,返回值為子進(jìn)程ID。調(diào)用方法:

10、#include #include Pid_t fork(void);Pid_t vfork(void);嵌入式編程基礎(chǔ)n#includen#includen#includenInt main(void)n pid_t pid;n if (pid=fork()0)n err_sys(“fork errorn”);nElsen if(pid=0)n printf(“this is process of child!n”);nElsen printf(“parent process pid=%d! n”,getpid();嵌入式編程基礎(chǔ)進(jìn)程控制開發(fā)-退出進(jìn)程函數(shù)nExit函數(shù)和_exit函數(shù) 作用

11、:停止進(jìn)程的執(zhí)行,進(jìn)程停下剩下的所有操作,清楚進(jìn)程中包括PCB在內(nèi)的各種數(shù)據(jù)結(jié)構(gòu),并終止本進(jìn)程的運(yùn)行。 區(qū)別: exit()函數(shù)退出前會(huì)保證緩沖區(qū)的數(shù)據(jù)不丟失 _exit()函數(shù)退出前丟失緩沖區(qū)數(shù)據(jù)嵌入式編程基礎(chǔ)進(jìn)程控制開發(fā)-等待函數(shù)nWait和waitpid函數(shù)作用:等待子進(jìn)程終止函數(shù)區(qū)別:waitpid與wait的作用相同,waitpid多了兩個(gè)參數(shù)調(diào)用方法:#include#includepid_t wait(int* statloc)pid_t waitpid(pid_t pid, int* staloc, int option);嵌入式編程基礎(chǔ)進(jìn)程控制開發(fā)-競(jìng)態(tài)條件n競(jìng)態(tài)條件 當(dāng)多個(gè)

12、進(jìn)程都對(duì)某個(gè)共享數(shù)據(jù)進(jìn)行處理,但最后的結(jié)果取決于進(jìn)程的運(yùn)行順序,則發(fā)生競(jìng)態(tài)條件(race condition)。嵌入式編程基礎(chǔ)進(jìn)程控制開發(fā)nExec函數(shù)作用:通過系統(tǒng)調(diào)用函數(shù),可以根據(jù)指定的文件名找到可執(zhí)行文件,并用它來取代調(diào)用進(jìn)程的內(nèi)容,換句話說,就是在調(diào)用進(jìn)程內(nèi)部執(zhí)行一個(gè)可執(zhí)行文件。嵌入式編程基礎(chǔ)進(jìn)程間通信n管道 管道pipe用于親緣進(jìn)程間的通信,fd0管道讀,fd1管道寫;半雙工通信,可看成一個(gè)文件,只是只存在于內(nèi)存中,可以通過read、write進(jìn)行讀寫;每次寫的內(nèi)容都放在管道緩沖區(qū)末尾,讀取都從緩沖區(qū)頭部;嵌入式編程基礎(chǔ)n有名管道FIFO 管道有名,兩個(gè)不相關(guān)的進(jìn)程也可以通過它交換數(shù)

13、據(jù)。原型:#include#includeInt mkfifo(const char* pathname, mode_t mode);嵌入式編程基礎(chǔ)n消息隊(duì)列n創(chuàng)建或連接消息隊(duì)列n int msgget(key_t key int msgflg);nKey的產(chǎn)生n key_t ftok(const char* path, int id);n發(fā)送消息nint msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);n接收消息nint msgrcv(int msqid,void *msqp,size_t msgsz,long msgty

14、p,int msgflg);n銷毀消息隊(duì)列nint msgctl(int msqid,int cmd,struct msqid_ds *buf);嵌入式編程基礎(chǔ)n信號(hào)量 信號(hào)量是一種linux資源,它可以讓不同的進(jìn)程間進(jìn)行相互通信,因此它也被看做成IPC集中的一員。信號(hào)量的作用是在兩個(gè)或多個(gè)進(jìn)程訪問公共資源集時(shí)保持同步n表示方法:struct semaphore 該結(jié)構(gòu)包含一個(gè)指向等待隊(duì)列的指針和一個(gè)整數(shù)計(jì)數(shù)器嵌入式編程基礎(chǔ)n信號(hào)量相關(guān)函數(shù)創(chuàng)建信號(hào)量 int semget(key_t key,int nsems,int semflg);信號(hào)量初始化 int semctl(int semid,i

15、nt semnum,int cmd,)嵌入式編程基礎(chǔ)n共享內(nèi)存nMmap()系統(tǒng)調(diào)用n使得進(jìn)程之間通過映射一個(gè)普通文件來實(shí)現(xiàn)共享內(nèi)存。普通文件被映射到進(jìn)程地址空間以后,進(jìn)程可以像訪問普通內(nèi)存一樣對(duì)文件進(jìn)行訪問n系統(tǒng)V共享內(nèi)存n系統(tǒng)V共享內(nèi)存和mmap()的實(shí)現(xiàn)不太一樣。系統(tǒng)V的共享內(nèi)存只存在于內(nèi)存中,所以當(dāng)一個(gè)進(jìn)程終止時(shí),需要繼續(xù)保留著共享內(nèi)存,一旦共享內(nèi)存被刪除,就再也找不到了,但是共享內(nèi)存需要被注銷時(shí),也有編程者來實(shí)現(xiàn)。嵌入式編程基礎(chǔ)nMmap()函數(shù)代碼:#include#includeVoid* mmap(void* start, size_t length, int prot, in

16、t flags, int fd, off_t offset);嵌入式編程基礎(chǔ)n系統(tǒng)V的共享內(nèi)存n創(chuàng)建共享內(nèi)存 要?jiǎng)?chuàng)建共享內(nèi)存,可使用shmget函數(shù) 調(diào)用方法:int shmget(key_t key, int size, int shmflg)n使用共享內(nèi)存 創(chuàng)建內(nèi)存,有了共享內(nèi)存ID,然后進(jìn)行映射,映射到具體的地址空間,利用shmat函數(shù)嵌入式編程基礎(chǔ)網(wǎng)絡(luò)編程n網(wǎng)絡(luò)編程的基本概念nTCP/IP協(xié)議n常用的網(wǎng)絡(luò)編程函數(shù)嵌入式編程基礎(chǔ)網(wǎng)絡(luò)編程基本概念n客戶端與服務(wù)器端客戶端:客戶程序,這個(gè)方法通過不同的途徑應(yīng)用于很多不同類型的應(yīng)用程序,最常見就是目前在因特網(wǎng)上用的網(wǎng)頁。 服務(wù)器:被動(dòng)的角色(從)。 等待來自客戶端的要求。 處理要求并傳回結(jié)果。 先啟動(dòng)服務(wù)器端,等待客戶端的程序運(yùn)行并建立連接。服務(wù)器端的程序負(fù)責(zé)監(jiān)聽,等待有一個(gè)客戶端的程序發(fā)來請(qǐng)求。嵌入式編程基礎(chǔ)TCP/IP協(xié)議n協(xié)議模型nSocket編程 根據(jù)系統(tǒng)實(shí)現(xiàn)了TCP/UDP或者IP層的接口,調(diào)用該接口進(jìn)行網(wǎng)絡(luò)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論