時(shí)間: 分類:電子論文 次數(shù):
摘要:本文詳細(xì)介紹了基于Linux操作系統(tǒng)中字符設(shè)備驅(qū)動開發(fā)。首先介紹了字符設(shè)備驅(qū)動開發(fā)的相關(guān)概念,簡述了驅(qū)動程序開發(fā)的基本知識和字符設(shè)備驅(qū)動程序開發(fā)的基本流程,重點(diǎn)闡述了Linux內(nèi)核相關(guān)程序結(jié)構(gòu)。為字符設(shè)備驅(qū)動開發(fā)的完整性,舉例說明了字符設(shè)備驅(qū)動開發(fā)的編譯下載和測試等實(shí)踐知識。通過本論文能達(dá)到掌握字符設(shè)備驅(qū)動開發(fā)的基本能力,進(jìn)而為復(fù)雜設(shè)備驅(qū)動開發(fā)打下基礎(chǔ)。
關(guān)鍵詞:Linux;字符設(shè)備;驅(qū)動程序
任何一個(gè)計(jì)算機(jī)系統(tǒng)的運(yùn)轉(zhuǎn)都是系統(tǒng)中軟硬件共同努力的結(jié)果,沒有硬件的軟件是空中樓閣,而沒有軟件的硬件則只是一堆廢鐵。計(jì)算機(jī)系統(tǒng)發(fā)現(xiàn)外部設(shè)備并與外部設(shè)備通信,依靠驅(qū)動程序。設(shè)備驅(qū)動程序運(yùn)行在內(nèi)核空間,作為外部設(shè)備與應(yīng)用軟件橋梁。在所有嵌入式操作系統(tǒng)里,嵌入式Linux系統(tǒng)相比于其他的系統(tǒng),在嵌入式領(lǐng)域有著獨(dú)特的優(yōu)勢。首先是Linux開源免費(fèi);然后是Linux的內(nèi)核體積小且易于模塊化,適應(yīng)性和可配置性好適合各種平臺,它同時(shí)還支持多任務(wù)、多用戶;最后是Linux有很多開發(fā)論壇,提供豐富開發(fā)資料,對開發(fā)者而言是強(qiáng)大的技術(shù)外援。所以本論文是基于Linux操作系統(tǒng)上開發(fā)字符設(shè)備驅(qū)動程序。
程序設(shè)計(jì)論文:以O(shè)J系統(tǒng)和學(xué)科競賽為核心的程序設(shè)計(jì)實(shí)踐教學(xué)
1字符設(shè)備驅(qū)動程序設(shè)計(jì)基礎(chǔ)
1.1基本原理
1.1.1創(chuàng)建設(shè)備節(jié)點(diǎn)。
在Linux操作系統(tǒng)中所有設(shè)備都當(dāng)作文件來處理,每個(gè)設(shè)備在/dev目錄下都有一個(gè)設(shè)備文件與之相對應(yīng),對設(shè)備的打開、讀寫、控制和關(guān)閉等所有操作都是通過/dev/目錄下對應(yīng)的文件進(jìn)行操作。設(shè)備節(jié)點(diǎn)有時(shí)會自動創(chuàng)建,可是字符設(shè)備驅(qū)動并不直接負(fù)責(zé)這一項(xiàng)操作。因此我們在設(shè)計(jì)字符設(shè)備驅(qū)動時(shí)會需要手動創(chuàng)建節(jié)點(diǎn),使用mknod命令在文件系統(tǒng)上人工創(chuàng)建。除此之外Linux中有一組函數(shù)可以用來在/dev目錄下創(chuàng)建設(shè)備節(jié)點(diǎn),即class_create()和device_create()。
1.1.2主次設(shè)備號。Linux管理的所有設(shè)備都有與之對應(yīng)的目錄,內(nèi)核通過驅(qū)動程序來識別設(shè)備。一般來說驅(qū)動程序通過主設(shè)備號快速匹配外部設(shè)備,但同一類設(shè)備數(shù)量不只一個(gè)(或者說一個(gè)驅(qū)動程序可以同時(shí)匹配多個(gè)設(shè)備),所以必須增加次設(shè)備號,它給驅(qū)動程序提供了一種能從同一驅(qū)動管理下的同類型設(shè)備分辨出目標(biāo)設(shè)備的方法。
1.1.3用戶空間和內(nèi)核空間。嵌入式系統(tǒng)屬于多用戶、多任務(wù)操作系統(tǒng),不能因?yàn)槟硞(gè)用戶或某個(gè)任務(wù)的非法操作造成死機(jī)現(xiàn)象,所以用程序運(yùn)行在用戶空間,而驅(qū)動程序則運(yùn)行在內(nèi)核空間,內(nèi)核空間維護(hù)計(jì)算機(jī)系統(tǒng)全局穩(wěn)定性,驅(qū)動程序運(yùn)行時(shí)受到內(nèi)核程序較多約束,因?yàn)樵趦?nèi)核中運(yùn)行任一程序出現(xiàn)問題都會造成計(jì)算機(jī)系統(tǒng)死機(jī)。而應(yīng)用程序運(yùn)行較“寬松”。
1.1.4應(yīng)用程序與硬件設(shè)備的訪問。
計(jì)算機(jī)系統(tǒng)中的應(yīng)用程序通過運(yùn)行在內(nèi)核空間的驅(qū)動程序來訪問計(jì)算機(jī)外部設(shè)備。應(yīng)用程序按照其中的流程對硬件設(shè)備進(jìn)行訪問。首先是應(yīng)用程序調(diào)用操作系統(tǒng)提供的系統(tǒng)函數(shù),從而訪問內(nèi)核空間,然后內(nèi)核空間的結(jié)構(gòu)file_operations來實(shí)現(xiàn)驅(qū)動程序中的相關(guān) 函數(shù),從而實(shí)現(xiàn)對設(shè)備的訪問。
1.2重要結(jié)構(gòu)
file_operations要實(shí)現(xiàn)用戶空間對內(nèi)核空間的調(diào)用,必須依賴Linux操作系統(tǒng)內(nèi)核中一個(gè)非常重要的數(shù)據(jù)結(jié)構(gòu):file_operations。此結(jié)構(gòu)存放在內(nèi)核include/linux/fs.h文件中,所以用到此結(jié)構(gòu)的代碼都應(yīng)包含此頭文件#include 。file_operations結(jié)構(gòu)如下:Linux使用file_operations訪問驅(qū)動中的函數(shù)時(shí),file_operations中存儲著對設(shè)備進(jìn)行各種操作的函數(shù)指針f_ops,file_operations中每一個(gè)成員名都對應(yīng)一個(gè)調(diào)用函數(shù),如:file_open()、file_allocate()、file_read()、file_write()、file_ioctl()、file_close()等。比如在對系統(tǒng)進(jìn)行數(shù)據(jù)存取的時(shí)候,系統(tǒng)通過設(shè)備的設(shè)備號來找到驅(qū)動,然后讀取驅(qū)動,開始執(zhí)行函數(shù)。例如:應(yīng)用程序要對某個(gè)外部設(shè)備進(jìn)行如open操作時(shí),這時(shí)匹配該外部設(shè)備的驅(qū)動程序就會執(zhí)行對應(yīng)的fopen函數(shù)。
2字符設(shè)備驅(qū)動程序開發(fā)
字符設(shè)備驅(qū)動程序開發(fā)涉及到知識點(diǎn)較多,開發(fā)起來顯得有點(diǎn)復(fù)雜。但規(guī)律可循,總結(jié)如下流程:第一步:編寫驅(qū)動程序文件準(zhǔn)備工作(定義設(shè)備名稱、定義主次設(shè)備號)、設(shè)備注冊、定義結(jié)構(gòu)體file_operations、實(shí)現(xiàn)結(jié)構(gòu)體內(nèi)的功能函數(shù)、設(shè)備注銷等。具體下來有以下工作:a.初始化外部設(shè)備的相關(guān)寄存器。包括定時(shí)寄存器、中斷寄存器、串口寄存器;b.初始化硬件設(shè)備參數(shù);c.注冊設(shè)備。通過主次設(shè)備號與次設(shè)備號將驅(qū)動程序與設(shè)備關(guān)聯(lián)起來,內(nèi)核會調(diào)用函數(shù)register_chrdev來注冊匹配的外部設(shè)備;d.注冊外部設(shè)備中斷函數(shù)。內(nèi)核會調(diào)用函數(shù)request_irq()來注冊匹配的外部設(shè)備的中斷函數(shù)。
第二步:驅(qū)動程序放進(jìn)Linux內(nèi)核將編輯好驅(qū)動程序源文件和頭文件放置內(nèi)核相對應(yīng)的文件下./kernel/drivers/char,同時(shí)修改Linux內(nèi)核配置文件***.config,在使用makemenuconfig命令時(shí)在配置頁面里出現(xiàn)相應(yīng)的配置選項(xiàng),使用空格鍵選中,保存后退出,再使用預(yù)安裝好的交叉編譯工具鏈進(jìn)行交叉編譯。需要說明的,設(shè)備驅(qū)動程序編譯有兩種方法,一種是編譯進(jìn)內(nèi)核,另一種是編譯成模塊。一般來說,調(diào)試階段編譯成模塊形式,驅(qū)動程序穩(wěn)定后,編譯進(jìn)內(nèi)核。
3字符設(shè)備驅(qū)動程序舉例
在Linux環(huán)境下,以鍵盤驅(qū)動程序?yàn)槔M(jìn)行說明。硬件基本情況是:S3C2410+HD7279(鍵盤數(shù)碼管模塊)。
3.1編寫鍵盤驅(qū)動程序
a.編寫file_operations結(jié)構(gòu)。structfile_operationsKey_Board_7279={open:Key_Board_7279_Open,//打開設(shè)備文件ioctl:Key_Board_7279_Ioctl,//設(shè)備文件其他操作release:Key_Board_7279_Close,//關(guān)閉設(shè)備文件};b.編寫Key_Board_7279_Open/。Key_Board_7279_Close/Key_Board_7279_Ioctl函數(shù)。打開/關(guān)閉函數(shù)為NULL,Key_Board_7279_Ioctl函數(shù)實(shí)現(xiàn)獲取鍵值c.鍵盤服務(wù)子程序。staticvoidKey_Board_7279_ISR(intirq,void*dev_id,structpt_regs*regs){disable_irq(33);//使用33號中斷key_number=Read_Key_Board_7279(cmd_read);//中斷方式讀取鍵值...}d.初始化鍵盤硬件函數(shù)。
voidSetup_Key_Board_7279(void)e.注冊鍵盤設(shè)備,調(diào)用初始化函數(shù)。int__initKey_Board_7279_Init(void){register_chrdev(...)//注冊設(shè)備Setup_Key_Board_7279(...)//調(diào)用硬件初始化函數(shù)request_irq(...)//注冊中斷}f.卸載鍵盤設(shè)備。void__exitKey_Board_7279_Exit(void)3.2測試鍵盤驅(qū)動程序設(shè)備驅(qū)動編譯后,接著編寫測試程序kbd.c用來檢測驅(qū)動程序的效果。fd=open("/dev/Kbd7279",0)
結(jié)束語
本論文講述了字符設(shè)備驅(qū)動的基本原理及編寫字符設(shè)備驅(qū)動程序的方法�;赟3C2410+HD7279平臺上,演示了鍵盤字符設(shè)備驅(qū)動程序開發(fā)并進(jìn)行了驗(yàn)證。本文可認(rèn)為是字符設(shè)備驅(qū)動開發(fā)范例,為初學(xué)字符設(shè)備驅(qū)動開發(fā)提供參考。
參考文獻(xiàn)
[1]周立功.單片機(jī)實(shí)驗(yàn)與實(shí)踐[M].北京:北京航空航天大學(xué)出版社.
[2]陸亞民.單片機(jī)原理及應(yīng)用[M].北京:輕工業(yè)出版社.
[3]Corbet,Rubini&Kroah-Hartman著,魏永明等譯.《LinuxDevice設(shè)備驅(qū)動程序第三版》[M].北京:中國電力出版社,2006.
[4]RobertLove著,陳莉君譯.Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)第二版[M].北京:機(jī)械工業(yè)出版社,2006.
[5]JeanJ.Labrosse著,邵貝貝譯《嵌入.式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ(第2版)》[M].北京:北京航空航天大學(xué)出版社,2005.
[6]倪繼利.Linux內(nèi)核分析及編程[M].北京:電子工業(yè)出版社,2005.
[7]EL-arm-830+型教學(xué)實(shí)驗(yàn)系統(tǒng)[M].北京:北京精儀達(dá)盛科技有限公司.
作者:占華林徐濤濤陳亮亮于子正李明鑫
級別:CSSCI南大期刊,北大期刊,統(tǒng)計(jì)源期刊
ISSN:1003-1707
刊期:進(jìn)入查看
格式:咨詢顧問
級別:CSSCI南大期刊,北大期刊,統(tǒng)計(jì)源期刊
ISSN:0577-9154
刊期:進(jìn)入查看
格式:咨詢顧問
級別:CSSCI南大期刊,北大期刊,統(tǒng)計(jì)源期刊
ISSN:1001-4233
刊期:進(jìn)入查看
格式:咨詢顧問
級別:北大期刊,CSSCI南大期刊
ISSN:1671-7465
刊期:進(jìn)入查看
格式:咨詢顧問
級別:CSSCI南大期刊,北大期刊,統(tǒng)計(jì)源期刊
ISSN:1005-9245
刊期:進(jìn)入查看
格式:咨詢顧問
級別:CSSCI南大期刊,北大期刊,統(tǒng)計(jì)源期刊
ISSN:1002-896X
刊期:進(jìn)入查看
格式:咨詢顧問
級別:北大期刊,CSCD期刊,統(tǒng)計(jì)源期刊
ISSN:0254-1769
刊期:進(jìn)入查看
格式:咨詢顧問
級別:CSSCI南大期刊,北大期刊,統(tǒng)計(jì)源期刊
ISSN:1002-4921
刊期:進(jìn)入查看
格式:咨詢顧問
級別:CSSCI南大期刊,北大期刊,統(tǒng)計(jì)源期刊
ISSN:1002-5936
刊期:進(jìn)入查看
格式:咨詢顧問
級別:CSSCI南大期刊,北大期刊,統(tǒng)計(jì)源期刊
ISSN:1001-8867
刊期:進(jìn)入查看
格式:咨詢顧問
級別:CSSCI南大期刊,北大期刊,統(tǒng)計(jì)源期刊
ISSN:1003-2886
刊期:進(jìn)入查看
格式:咨詢顧問
級別:北大期刊,統(tǒng)計(jì)源期刊,CSSCI南大期刊
ISSN:1000-5560
刊期:進(jìn)入查看
格式:咨詢顧問
數(shù)據(jù)庫:SCI
ISSN:2045-2322
刊期:進(jìn)入查看
格式:咨詢顧問
數(shù)據(jù)庫:SCI
ISSN:0284-1851
刊期:進(jìn)入查看
格式:咨詢顧問
數(shù)據(jù)庫:SCI
ISSN:2352-4928
刊期:進(jìn)入查看
格式:咨詢顧問
數(shù)據(jù)庫:SCI
ISSN:0169-4332
刊期:進(jìn)入查看
格式:咨詢顧問
數(shù)據(jù)庫:SCI
ISSN:0960-7412
刊期:進(jìn)入查看
格式:咨詢顧問
數(shù)據(jù)庫:SCI
ISSN:0048-9697
刊期:進(jìn)入查看
格式:咨詢顧問
數(shù)據(jù)庫:SCI
ISSN:0191-2917
刊期:進(jìn)入查看
格式:咨詢顧問
數(shù)據(jù)庫:SCI
ISSN:1741-7007
刊期:進(jìn)入查看
格式:咨詢顧問
數(shù)據(jù)庫:SCI
ISSN:2238-7854
刊期:進(jìn)入查看
格式:咨詢顧問
數(shù)據(jù)庫:SCI
ISSN:2214-7144
刊期:進(jìn)入查看
格式:咨詢顧問