嵌入式Linux應(yīng)用程序開(kāi)發(fā)過(guò)程_第1頁(yè)
嵌入式Linux應(yīng)用程序開(kāi)發(fā)過(guò)程_第2頁(yè)
嵌入式Linux應(yīng)用程序開(kāi)發(fā)過(guò)程_第3頁(yè)
嵌入式Linux應(yīng)用程序開(kāi)發(fā)過(guò)程_第4頁(yè)
嵌入式Linux應(yīng)用程序開(kāi)發(fā)過(guò)程_第5頁(yè)
已閱讀5頁(yè),還剩29頁(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)介

1、嵌入式Linux應(yīng)用程序開(kāi)發(fā)過(guò)程Linux應(yīng)用程序Linux應(yīng)用程序設(shè)計(jì)q編寫(xiě)程序編寫(xiě)程序q編寫(xiě)編寫(xiě)MakefileMakefileq編譯編譯q運(yùn)行運(yùn)行2編寫(xiě)helloworld文件qHelloworldHelloworld程序是一個(gè)只在輸出控制臺(tái)上打印出程序是一個(gè)只在輸出控制臺(tái)上打印出“hellohello,world”world”字串的程序字串的程序q#include qint main()printf(“hello,world!n”);3編寫(xiě)Makefile文件Linux應(yīng)用程序設(shè)計(jì)指定編譯器生成的執(zhí)行文件和鏈接過(guò)程中的目標(biāo)文件 編譯和鏈接的參數(shù) 編譯命令 拷貝helloworld映像文

2、件到/tftpboot/examples中清除4編譯器q 編譯x86平臺(tái)采用的gcc編譯器 #gcc o helloworld helloworld.cq 編譯ARM平臺(tái)采用的arm-linux-gcc編譯器 #arm-linux-gcc o helloworld helloworld.c5編譯q #/usr/local/arm/2.95.3/bin/arm-linux-gcc o helloworld helloworld.cq 如果有Makefile文件 #make6Linux應(yīng)用程序運(yùn)行1Linux應(yīng)用程序設(shè)計(jì)q應(yīng)用程序運(yùn)行可以采用如下兩種方式:應(yīng)用程序運(yùn)行可以采用如下兩種方式:q在在L

3、inuxLinux內(nèi)核啟動(dòng)起來(lái),并且有辦法從主機(jī)獲取文件時(shí),可以在內(nèi)核啟動(dòng)起來(lái),并且有辦法從主機(jī)獲取文件時(shí),可以在LinuxLinux控制臺(tái)直接從主機(jī)獲取編譯后的應(yīng)用程序。可以通過(guò)控制臺(tái)直接從主機(jī)獲取編譯后的應(yīng)用程序??梢酝ㄟ^(guò)ftpftp、nfsnfs、sshssh等方式達(dá)到。等方式達(dá)到。q也可以在編譯應(yīng)用程序后將該應(yīng)用程序拷貝到也可以在編譯應(yīng)用程序后將該應(yīng)用程序拷貝到ramdiskramdisk中,然中,然后重新制作后重新制作ramdiskramdisk,并更新,并更新ramdiskramdisk文件系統(tǒng),此時(shí)新的程序文件系統(tǒng),此時(shí)新的程序?qū)⒃谖募到y(tǒng)中。將在文件系統(tǒng)中。7Linux應(yīng)用程序

4、運(yùn)行2q JXARM9-2410通過(guò)NFS將主機(jī)的/tftpboot/目錄掛接到目標(biāo)機(jī)的/mnt/nfs目錄下q #mount 80:/tftpboot/ /mnt/nfs #cd /mnt/nfs/examples #./helloworld8Linux應(yīng)用程序運(yùn)行3Linux應(yīng)用程序設(shè)計(jì)q重新編譯內(nèi)核時(shí),通常將應(yīng)用程序添加到重新編譯內(nèi)核時(shí),通常將應(yīng)用程序添加到LinuxLinux文件系統(tǒng)的文件系統(tǒng)的binbin目錄,該目錄有全局路徑。且該文件應(yīng)該具有執(zhí)行屬性,可以通過(guò)目錄,該目錄有全局路徑。且該文件應(yīng)該具有執(zhí)行屬性,可以通過(guò)如下命令修改:如下命令修改:chmod 77

5、7 leddemochmod 777 leddemo在新內(nèi)核啟動(dòng)后,直接在命令行輸入文件名即可運(yùn)行。在新內(nèi)核啟動(dòng)后,直接在命令行輸入文件名即可運(yùn)行。q當(dāng)直接在當(dāng)直接在LinuxLinux控制臺(tái)中從主機(jī)上獲取應(yīng)用程序時(shí),必須保存控制臺(tái)中從主機(jī)上獲取應(yīng)用程序時(shí),必須保存到可寫(xiě)的位置,且通過(guò)如下命令執(zhí)行該程序:到可寫(xiě)的位置,且通過(guò)如下命令執(zhí)行該程序:./leddemo./leddemo9配置Linux應(yīng)用程序啟動(dòng)后自動(dòng)運(yùn)行Linux應(yīng)用程序設(shè)計(jì)q如果需要在系統(tǒng)啟動(dòng)以后自動(dòng)運(yùn)行如果需要在系統(tǒng)啟動(dòng)以后自動(dòng)運(yùn)行helloworldhelloworld程序,需要編輯程序,需要編輯ramdiskramdisk

6、中的啟動(dòng)腳本文件,該文件為中的啟動(dòng)腳本文件,該文件為root/rd/etc/init.d/rcSroot/rd/etc/init.d/rcS使用使用vivi編輯器編輯,在該文件最后添加如下腳本:編輯器編輯,在該文件最后添加如下腳本:/bin/helloworld/bin/helloworld該腳本將啟動(dòng)后運(yùn)行該腳本將啟動(dòng)后運(yùn)行helloworld helloworld ,直到程序退出。或,直到程序退出?;?bin/ helloworld &/bin/ helloworld &它將在后臺(tái)運(yùn)行它將在后臺(tái)運(yùn)行helloworldhelloworld,不影響其他的程序運(yùn)行。,不影響其他

7、的程序運(yùn)行。10linux驅(qū)動(dòng)程序Linux驅(qū)動(dòng)程序設(shè)計(jì)qLinuxLinux下對(duì)外設(shè)的訪問(wèn)只能通過(guò)驅(qū)動(dòng)程序進(jìn)行下對(duì)外設(shè)的訪問(wèn)只能通過(guò)驅(qū)動(dòng)程序進(jìn)行qLinuxLinux具有統(tǒng)一的驅(qū)動(dòng)程序接口,以文件操作的方式管理驅(qū)動(dòng)程序,如:具有統(tǒng)一的驅(qū)動(dòng)程序接口,以文件操作的方式管理驅(qū)動(dòng)程序,如:openopen、readread、writewrite、ioctlioctlq驅(qū)動(dòng)程序是內(nèi)核的一部分,可以使用中斷、驅(qū)動(dòng)程序是內(nèi)核的一部分,可以使用中斷、DMADMA等操作等操作q驅(qū)動(dòng)程序需要在用戶態(tài)和內(nèi)核態(tài)之間傳遞數(shù)據(jù)驅(qū)動(dòng)程序需要在用戶態(tài)和內(nèi)核態(tài)之間傳遞數(shù)據(jù)11設(shè)備驅(qū)動(dòng)程序的概念q 對(duì)硬件的控制涉及寄存器中各位

8、的操作,通常這些操作與設(shè)備直接相關(guān)并且對(duì)時(shí)序的要求非常嚴(yán)格,如果這些工作都交由應(yīng)用程序員來(lái)負(fù)責(zé),那么對(duì)硬件設(shè)備的編程將變得異常復(fù)雜而困難。 驅(qū)動(dòng)程序的作用正是要屏蔽硬件的這些底層細(xì)節(jié),從而簡(jiǎn)化應(yīng)用程序的編寫(xiě)。q 操作系統(tǒng)一般提供設(shè)備驅(qū)動(dòng)程序來(lái)完成對(duì)特定硬件的控制,以建立應(yīng)用程序和設(shè)備之間的抽象接口,而不是應(yīng)用程序直接操作硬件。12設(shè)備驅(qū)動(dòng)程序的概念q 設(shè)備驅(qū)動(dòng)程序?qū)嶋H是處理和操作硬件控制器的軟件,從本質(zhì)上講,是內(nèi)核中具有最高特權(quán)級(jí)的、駐留內(nèi)存的、可共享的底層硬件處理例程。q Linux 操作系統(tǒng)將所有的設(shè)備全部看成文件,都納入文件系統(tǒng)的范疇,并通過(guò)文件的操作界面進(jìn)行操作。 一般來(lái)說(shuō),是把設(shè)備映

9、射為一個(gè)特殊的設(shè)備文件,用戶程序可以像對(duì)其他文件一樣對(duì)此設(shè)備文件進(jìn)行操作。 設(shè)備文件的屬性由三部分信息組成:文件的類型,主設(shè)備號(hào),次設(shè)備號(hào)13設(shè)備驅(qū)動(dòng)程序的概念q 驅(qū)動(dòng)程序是內(nèi)核的一部分,是操作系統(tǒng)內(nèi)核與硬件設(shè)備的直接接口,驅(qū)動(dòng)程序屏蔽了硬件的細(xì)節(jié),完成以下功能:q 對(duì)設(shè)備初始化和釋放q 對(duì)設(shè)備進(jìn)行管理,包括實(shí)時(shí)參數(shù)設(shè)置,以及提供對(duì)設(shè)備的操作接口q 讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)或回送應(yīng)用程序請(qǐng)求的數(shù)據(jù)q 檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤14Linux驅(qū)動(dòng)程序Linux驅(qū)動(dòng)程序設(shè)計(jì)qLinuxLinux屏蔽了應(yīng)用層對(duì)外設(shè)的直接訪問(wèn),不能在用戶態(tài)直接進(jìn)行如下操屏蔽了應(yīng)用層對(duì)外設(shè)的直接訪問(wèn),不能在用戶態(tài)

10、直接進(jìn)行如下操作:作:* *(unsigned char (unsigned char * *)0 x02000006) =0 x3e;)0 x02000006) =0 x3e;qLinuxLinux下用戶態(tài)無(wú)法處理中斷下用戶態(tài)無(wú)法處理中斷qLinuxLinux下對(duì)外設(shè)的訪問(wèn)推薦采用驅(qū)動(dòng)程序進(jìn)行,在內(nèi)核態(tài)編寫(xiě)驅(qū)動(dòng)程序下對(duì)外設(shè)的訪問(wèn)推薦采用驅(qū)動(dòng)程序進(jìn)行,在內(nèi)核態(tài)編寫(xiě)驅(qū)動(dòng)程序(包括直接對(duì)外設(shè)操作、處理中斷等),用戶態(tài)通過(guò)標(biāo)準(zhǔn)驅(qū)動(dòng)程序調(diào)用方法(包括直接對(duì)外設(shè)操作、處理中斷等),用戶態(tài)通過(guò)標(biāo)準(zhǔn)驅(qū)動(dòng)程序調(diào)用方法進(jìn)行操作。進(jìn)行操作。15Linux驅(qū)動(dòng)程序編譯方式Linux驅(qū)動(dòng)程序設(shè)計(jì)qLinuxLinux

11、中驅(qū)動(dòng)程序的使用可以按照兩種方式編譯:中驅(qū)動(dòng)程序的使用可以按照兩種方式編譯:q一種是靜態(tài)編譯進(jìn)內(nèi)核一種是靜態(tài)編譯進(jìn)內(nèi)核q另一種是編譯成模塊以供動(dòng)態(tài)加載另一種是編譯成模塊以供動(dòng)態(tài)加載q由于由于LinuxLinux不支持模塊動(dòng)態(tài)加載,而且嵌入式不支持模塊動(dòng)態(tài)加載,而且嵌入式LinuxLinux不能夠象不能夠象桌面桌面LinuxLinux那樣靈活的使用那樣靈活的使用insmod/rmmodinsmod/rmmod加載卸載設(shè)備驅(qū)動(dòng)程序,加載卸載設(shè)備驅(qū)動(dòng)程序,因而通常在因而通常在LinuxLinux中將設(shè)備驅(qū)動(dòng)程序靜態(tài)編譯進(jìn)內(nèi)核。中將設(shè)備驅(qū)動(dòng)程序靜態(tài)編譯進(jìn)內(nèi)核。16Linux下設(shè)備驅(qū)動(dòng)程序分類Linux

12、驅(qū)動(dòng)程序設(shè)計(jì)q字符設(shè)備:是指存取時(shí)沒(méi)有緩存的設(shè)備。典型的字符設(shè)備包括鼠標(biāo),字符設(shè)備:是指存取時(shí)沒(méi)有緩存的設(shè)備。典型的字符設(shè)備包括鼠標(biāo),鍵盤(pán),串行口等。鍵盤(pán),串行口等。q塊設(shè)備:塊設(shè)備的讀寫(xiě)都有緩存來(lái)支持,并且塊設(shè)備必須能夠隨機(jī)塊設(shè)備:塊設(shè)備的讀寫(xiě)都有緩存來(lái)支持,并且塊設(shè)備必須能夠隨機(jī)存取存取(random(randomaccess) access) 。典型的塊設(shè)備主要包括硬盤(pán)軟盤(pán)設(shè)備,。典型的塊設(shè)備主要包括硬盤(pán)軟盤(pán)設(shè)備,CD-ROMCD-ROM等。等。q網(wǎng)絡(luò)設(shè)備:網(wǎng)絡(luò)設(shè)備:LinuxLinux的網(wǎng)絡(luò)系統(tǒng)主要是基于的網(wǎng)絡(luò)系統(tǒng)主要是基于BSDBSDunixunix的的socketsocket機(jī)制。

13、在機(jī)制。在系統(tǒng)和驅(qū)動(dòng)程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)系統(tǒng)和驅(qū)動(dòng)程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)(sk_buff)(sk_buff)進(jìn)行數(shù)據(jù)的傳遞。系進(jìn)行數(shù)據(jù)的傳遞。系統(tǒng)里支持對(duì)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機(jī)制,提供對(duì)多協(xié)議統(tǒng)里支持對(duì)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機(jī)制,提供對(duì)多協(xié)議的支持。的支持。17Linux下設(shè)備驅(qū)動(dòng)程序組成Linux驅(qū)動(dòng)程序設(shè)計(jì)q自動(dòng)配置和初始化子程序:自動(dòng)配置和初始化子程序:負(fù)責(zé)檢測(cè)所要驅(qū)動(dòng)的硬件設(shè)備是否存在和是否能正常工作。負(fù)責(zé)檢測(cè)所要驅(qū)動(dòng)的硬件設(shè)備是否存在和是否能正常工作。如果該設(shè)備正常,則對(duì)這個(gè)設(shè)備及其相關(guān)的、設(shè)備驅(qū)動(dòng)程序如果該設(shè)備正常,則對(duì)這個(gè)設(shè)備及其相

14、關(guān)的、設(shè)備驅(qū)動(dòng)程序需要的軟件狀態(tài)進(jìn)行初始化。這部分驅(qū)動(dòng)程序僅在初始化的需要的軟件狀態(tài)進(jìn)行初始化。這部分驅(qū)動(dòng)程序僅在初始化的時(shí)候被調(diào)用一次。時(shí)候被調(diào)用一次。q服務(wù)于服務(wù)于I/OI/O請(qǐng)求的子程序:請(qǐng)求的子程序:調(diào)用這部分是由于系統(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行的時(shí)候,調(diào)用這部分是由于系統(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行的時(shí)候,系統(tǒng)仍認(rèn)為是和進(jìn)行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)程,只是由用戶態(tài)系統(tǒng)仍認(rèn)為是和進(jìn)行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)程,只是由用戶態(tài)變成了核心態(tài),具有進(jìn)行此系統(tǒng)調(diào)用的用戶程序的運(yùn)行環(huán)境,因變成了核心態(tài),具有進(jìn)行此系統(tǒng)調(diào)用的用戶程序的運(yùn)行環(huán)境,因此可以在其中調(diào)用此可以在其中調(diào)用sleep()sleep

15、()等與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。等與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。q中斷服務(wù)子程序:中斷服務(wù)子程序:18Linux下設(shè)備驅(qū)動(dòng)程序I/O設(shè)備入口點(diǎn)1Linux驅(qū)動(dòng)程序設(shè)計(jì)q在系統(tǒng)內(nèi)部,在系統(tǒng)內(nèi)部,I/OI/O設(shè)備的存取通過(guò)一組固定的入口點(diǎn)來(lái)進(jìn)行,這設(shè)備的存取通過(guò)一組固定的入口點(diǎn)來(lái)進(jìn)行,這組入口點(diǎn)是由每個(gè)設(shè)備的設(shè)備驅(qū)動(dòng)程序提供的。而入口點(diǎn)由一個(gè)文件組入口點(diǎn)是由每個(gè)設(shè)備的設(shè)備驅(qū)動(dòng)程序提供的。而入口點(diǎn)由一個(gè)文件操作結(jié)構(gòu)操作結(jié)構(gòu)(file_operations)(file_operations)向系統(tǒng)進(jìn)行說(shuō)明。一般來(lái)說(shuō),字符型設(shè)向系統(tǒng)進(jìn)行說(shuō)明。一般來(lái)說(shuō),字符型設(shè)備驅(qū)動(dòng)程序能夠提供如下幾個(gè)入口點(diǎn):備驅(qū)動(dòng)程序能夠

16、提供如下幾個(gè)入口點(diǎn):qopenopen:打開(kāi)設(shè)備準(zhǔn)備:打開(kāi)設(shè)備準(zhǔn)備I/OI/O操作。對(duì)字符特別設(shè)備文件進(jìn)行打開(kāi)操作。對(duì)字符特別設(shè)備文件進(jìn)行打開(kāi)操作,都會(huì)調(diào)用設(shè)備的操作,都會(huì)調(diào)用設(shè)備的openopen入口點(diǎn)。入口點(diǎn)。openopen子程序必須對(duì)將要進(jìn)行子程序必須對(duì)將要進(jìn)行的的I/OI/O操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。如果設(shè)備是獨(dú)操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。如果設(shè)備是獨(dú)占的,即同一時(shí)刻只能有一個(gè)程序訪問(wèn)此設(shè)備,則占的,即同一時(shí)刻只能有一個(gè)程序訪問(wèn)此設(shè)備,則openopen子程序必子程序必須設(shè)置一些標(biāo)志以表示設(shè)備處于忙狀態(tài)。須設(shè)置一些標(biāo)志以表示設(shè)備處于忙狀態(tài)。qcloseclo

17、se:關(guān)閉一個(gè)設(shè)備。當(dāng)最后一次使用設(shè)備終結(jié)后,調(diào)用:關(guān)閉一個(gè)設(shè)備。當(dāng)最后一次使用設(shè)備終結(jié)后,調(diào)用closeclose子程子程序。獨(dú)占設(shè)備必須標(biāo)記設(shè)備可再次使用。序。獨(dú)占設(shè)備必須標(biāo)記設(shè)備可再次使用。19Linux下設(shè)備驅(qū)動(dòng)程序I/O設(shè)備入口點(diǎn)2Linux驅(qū)動(dòng)程序設(shè)計(jì)qwritewrite:往設(shè)備上寫(xiě)數(shù)據(jù)。對(duì)于有緩沖區(qū)的:往設(shè)備上寫(xiě)數(shù)據(jù)。對(duì)于有緩沖區(qū)的I/OI/O操作,一般是把數(shù)據(jù)寫(xiě)操作,一般是把數(shù)據(jù)寫(xiě)入緩沖區(qū)里。對(duì)字符特別設(shè)備文件進(jìn)行寫(xiě)操作將調(diào)用入緩沖區(qū)里。對(duì)字符特別設(shè)備文件進(jìn)行寫(xiě)操作將調(diào)用writewrite子程序。子程序。qioctlioctl:執(zhí)行讀、寫(xiě)之外的操作。:執(zhí)行讀、寫(xiě)之外的操作。

18、qselectselect:檢查設(shè)備,看數(shù)據(jù)是否可讀或設(shè)備是否可用于寫(xiě)數(shù)據(jù)。:檢查設(shè)備,看數(shù)據(jù)是否可讀或設(shè)備是否可用于寫(xiě)數(shù)據(jù)。selectselect系統(tǒng)調(diào)用在檢查與設(shè)備特別文件相關(guān)的文件描述符時(shí)使用系統(tǒng)調(diào)用在檢查與設(shè)備特別文件相關(guān)的文件描述符時(shí)使用selectselect入口點(diǎn)。如果設(shè)備驅(qū)動(dòng)程序沒(méi)有提供上述入口點(diǎn)中的某一個(gè),系統(tǒng)會(huì)用入口點(diǎn)。如果設(shè)備驅(qū)動(dòng)程序沒(méi)有提供上述入口點(diǎn)中的某一個(gè),系統(tǒng)會(huì)用缺省的子程序來(lái)代替。對(duì)于不同的系統(tǒng),也還有一些其它的入口點(diǎn)。缺省的子程序來(lái)代替。對(duì)于不同的系統(tǒng),也還有一些其它的入口點(diǎn)。qReadRead:從設(shè)備上讀數(shù)據(jù)。對(duì)于有緩沖區(qū)的:從設(shè)備上讀數(shù)據(jù)。對(duì)于有緩沖區(qū)的

19、I/OI/O操作,一般是從緩沖區(qū)里操作,一般是從緩沖區(qū)里讀數(shù)據(jù)。對(duì)字符特別設(shè)備文件進(jìn)行讀操作將調(diào)用讀數(shù)據(jù)。對(duì)字符特別設(shè)備文件進(jìn)行讀操作將調(diào)用readread子程序。子程序。20Linux下設(shè)備驅(qū)動(dòng)程序I/O設(shè)備入口點(diǎn)3q 在用戶自己的驅(qū)動(dòng)程序中,首先要根據(jù)驅(qū)動(dòng)程序的功能,完成 file_operations 結(jié)構(gòu)中的函數(shù)的實(shí)現(xiàn)q 不需要的函數(shù)接口可以直接在 file_operations 結(jié)構(gòu)中初始化為 NULLq 每個(gè)進(jìn)程對(duì)設(shè)備的操作,都會(huì)根據(jù)主次設(shè)備號(hào),轉(zhuǎn)換成對(duì) file_operations 結(jié)構(gòu)的訪問(wèn)21設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)過(guò)程q 查看原理圖,理解設(shè)備的工作原理。q 定義設(shè)備號(hào)。設(shè)備由一

20、個(gè)主設(shè)備號(hào)和一個(gè)次設(shè)備號(hào)來(lái)標(biāo)識(shí)。主設(shè)備號(hào)惟一標(biāo)識(shí)了設(shè)備類型,即設(shè)備驅(qū)動(dòng)程序類型,它是塊設(shè)備表或字符設(shè)備表項(xiàng)的索引q 實(shí)現(xiàn)初始化函數(shù)。在驅(qū)動(dòng)程序中實(shí)現(xiàn)驅(qū)動(dòng)的注冊(cè)和卸載q 設(shè)計(jì)所要實(shí)現(xiàn)的文件操作,定義 file_operations 結(jié)構(gòu)22設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)過(guò)程q實(shí)現(xiàn)所需的文件操作調(diào)用,如 read、write 等q實(shí)現(xiàn)中斷服務(wù),并用 request_irq 向內(nèi)核注冊(cè),中斷并不是每個(gè)設(shè)備驅(qū)動(dòng)所必需的。q編譯該驅(qū)動(dòng)程序到內(nèi)核中,或者用insmod命令加載模塊q測(cè)試該設(shè)備,編寫(xiě)應(yīng)用程序,對(duì)驅(qū)動(dòng)程序進(jìn)行測(cè)試23Linux下設(shè)備注冊(cè)1Linux驅(qū)動(dòng)程序設(shè)計(jì)q設(shè)備驅(qū)動(dòng)程序所提供的入口點(diǎn),在設(shè)備驅(qū)動(dòng)程序初

21、始化的時(shí)候向設(shè)備驅(qū)動(dòng)程序所提供的入口點(diǎn),在設(shè)備驅(qū)動(dòng)程序初始化的時(shí)候向系統(tǒng)進(jìn)行登記,以便系統(tǒng)在適當(dāng)?shù)臅r(shí)候調(diào)用。系統(tǒng)進(jìn)行登記,以便系統(tǒng)在適當(dāng)?shù)臅r(shí)候調(diào)用。LinuxLinux系統(tǒng)里,通過(guò)調(diào)系統(tǒng)里,通過(guò)調(diào)用用register_chrdevregister_chrdev向系統(tǒng)注冊(cè)字符型設(shè)備驅(qū)動(dòng)程序。向系統(tǒng)注冊(cè)字符型設(shè)備驅(qū)動(dòng)程序。register_chrdevregister_chrdev定義為:定義為:#include #include #include #include int register_chrdev(unsigned int major, const char int register_ch

22、rdev(unsigned int major, const char * *name,name, struct file_operations struct file_operations * *fops);fops);q其中,其中,majormajor是為設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請(qǐng)的主設(shè)備號(hào),如果為是為設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請(qǐng)的主設(shè)備號(hào),如果為0 0則系則系統(tǒng)為此驅(qū)動(dòng)程序動(dòng)態(tài)地分配一個(gè)主設(shè)備號(hào)。統(tǒng)為此驅(qū)動(dòng)程序動(dòng)態(tài)地分配一個(gè)主設(shè)備號(hào)。namename是設(shè)備名。是設(shè)備名。fopsfops是該驅(qū)動(dòng)各是該驅(qū)動(dòng)各個(gè)的入口點(diǎn)的文件操作結(jié)構(gòu)指針。個(gè)的入口點(diǎn)的文件操作結(jié)構(gòu)指針。24Linux下設(shè)備注冊(cè)2Linu

23、x驅(qū)動(dòng)程序設(shè)計(jì)q此函數(shù)返回此函數(shù)返回0 0表示成功。返回表示成功。返回-EINVAL-EINVAL表示申請(qǐng)的主設(shè)備號(hào)非法,表示申請(qǐng)的主設(shè)備號(hào)非法,一般來(lái)說(shuō)是主設(shè)備號(hào)大于系統(tǒng)所允許的最大設(shè)備號(hào)。返回一般來(lái)說(shuō)是主設(shè)備號(hào)大于系統(tǒng)所允許的最大設(shè)備號(hào)。返回-EBUSY-EBUSY表示表示所申請(qǐng)的主設(shè)備號(hào)正在被其它設(shè)備驅(qū)動(dòng)程序使用。如果是動(dòng)態(tài)分配主所申請(qǐng)的主設(shè)備號(hào)正在被其它設(shè)備驅(qū)動(dòng)程序使用。如果是動(dòng)態(tài)分配主設(shè)備號(hào)成功,此函數(shù)將返回所分配的主設(shè)備號(hào)。如果設(shè)備號(hào)成功,此函數(shù)將返回所分配的主設(shè)備號(hào)。如果register_chrdevregister_chrdev操作成功,設(shè)備名就會(huì)出現(xiàn)在操作成功,設(shè)備名就會(huì)出現(xiàn)

24、在/proc/devices/proc/devices文件里。文件里。q初始化部分一般還負(fù)責(zé)給設(shè)備驅(qū)動(dòng)程序申請(qǐng)系統(tǒng)資源,包括內(nèi)存、初始化部分一般還負(fù)責(zé)給設(shè)備驅(qū)動(dòng)程序申請(qǐng)系統(tǒng)資源,包括內(nèi)存、中斷、時(shí)鐘、中斷、時(shí)鐘、I/OI/O端口等,這些資源也可以在端口等,這些資源也可以在openopen子程序或別的地方申請(qǐng)。子程序或別的地方申請(qǐng)。在這些資源不用的時(shí)候,應(yīng)該釋放它們,以利于資源的共享。在這些資源不用的時(shí)候,應(yīng)該釋放它們,以利于資源的共享。25Linux下中斷處理Linux驅(qū)動(dòng)程序設(shè)計(jì)q在在LinuxLinux系統(tǒng)里,對(duì)中斷的處理是屬于系統(tǒng)核心的部分,因此如系統(tǒng)里,對(duì)中斷的處理是屬于系統(tǒng)核心的部分

25、,因此如果設(shè)備與系統(tǒng)之間以中斷方式進(jìn)行數(shù)據(jù)交換的話,就必須把該設(shè)備的果設(shè)備與系統(tǒng)之間以中斷方式進(jìn)行數(shù)據(jù)交換的話,就必須把該設(shè)備的驅(qū)動(dòng)程序作為系統(tǒng)核心的一部分。設(shè)備驅(qū)動(dòng)程序通過(guò)調(diào)用驅(qū)動(dòng)程序作為系統(tǒng)核心的一部分。設(shè)備驅(qū)動(dòng)程序通過(guò)調(diào)用request_irqrequest_irq函數(shù)來(lái)申請(qǐng)中斷,通過(guò)函數(shù)來(lái)申請(qǐng)中斷,通過(guò)free_irqfree_irq來(lái)釋放中斷。來(lái)釋放中斷。26Linux下內(nèi)存分配、釋放Linux驅(qū)動(dòng)程序設(shè)計(jì)q作為系統(tǒng)核心的一部分,設(shè)備驅(qū)動(dòng)程序在申請(qǐng)和釋放內(nèi)存時(shí)不是調(diào)用作為系統(tǒng)核心的一部分,設(shè)備驅(qū)動(dòng)程序在申請(qǐng)和釋放內(nèi)存時(shí)不是調(diào)用mallocmalloc和和freefree,而代之以調(diào)用

26、,而代之以調(diào)用kmallockmalloc和和kfreekfree,它們被定義為:,它們被定義為:#include #include void void * * kmalloc(unsigned int len, int priority); kmalloc(unsigned int len, int priority);void kfree(void void kfree(void * * obj); obj);q參數(shù)參數(shù)lenlen為希望申請(qǐng)的字節(jié)數(shù),為希望申請(qǐng)的字節(jié)數(shù),objobj為要釋放的內(nèi)存指針。為要釋放的內(nèi)存指針。prioritypriority為分配內(nèi)存操作的優(yōu)先級(jí),即在沒(méi)有足夠

27、空閑內(nèi)存時(shí)如何操為分配內(nèi)存操作的優(yōu)先級(jí),即在沒(méi)有足夠空閑內(nèi)存時(shí)如何操作,一般用作,一般用GFP_KERNELGFP_KERNEL。27Linux下內(nèi)存分配、釋放Linux驅(qū)動(dòng)程序設(shè)計(jì)q使用一個(gè)沒(méi)有申請(qǐng)的使用一個(gè)沒(méi)有申請(qǐng)的I/OI/O端口不會(huì)使端口不會(huì)使CPUCPU產(chǎn)生異常,也就不會(huì)導(dǎo)致產(chǎn)生異常,也就不會(huì)導(dǎo)致諸如諸如“segmentation fault”segmentation fault”一類的錯(cuò)誤發(fā)生。任何進(jìn)程都可以訪問(wèn)一類的錯(cuò)誤發(fā)生。任何進(jìn)程都可以訪問(wèn)任何一個(gè)任何一個(gè)I/OI/O端口。此時(shí)系統(tǒng)無(wú)法保證對(duì)端口。此時(shí)系統(tǒng)無(wú)法保證對(duì)I/OI/O端口的操作不會(huì)發(fā)生沖突,端口的操作不會(huì)發(fā)生沖突,甚

28、至?xí)虼硕瓜到y(tǒng)崩潰。甚至?xí)虼硕瓜到y(tǒng)崩潰。q因此,在使用因此,在使用I/OI/O端口前,應(yīng)該檢查此端口前,應(yīng)該檢查此I/OI/O端口是否已有別的程序在使端口是否已有別的程序在使用,若沒(méi)有,再把此端口標(biāo)記為正在使用,在使用完以后釋放它。用,若沒(méi)有,再把此端口標(biāo)記為正在使用,在使用完以后釋放它。int check_region(unsigned int from, unsigned int extent);int check_region(unsigned int from, unsigned int extent);void request_region(unsigned int from,

29、 unsigned int extent,void request_region(unsigned int from, unsigned int extent, const char const char * *name);name);void release_region(unsigned int from, unsigned int extent);void release_region(unsigned int from, unsigned int extent);28Linux下開(kāi)關(guān)中斷函數(shù)Linux驅(qū)動(dòng)程序設(shè)計(jì)q在設(shè)備驅(qū)動(dòng)程序里,通過(guò)如下函數(shù)實(shí)現(xiàn)打開(kāi)和關(guān)閉中斷功能:在設(shè)備驅(qū)動(dòng)程序里,通過(guò)如下函數(shù)實(shí)現(xiàn)打開(kāi)和關(guān)閉中斷功能:#include #include #define cli() _asm_ _volatile_ (cli:)#define cli() _asm_ _volatile_ (cli:)#

溫馨提示

  • 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)論