版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式操作系統(tǒng)
-驅(qū)動(dòng)程序編寫基礎(chǔ)李春杰嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第1頁(yè)!主要內(nèi)容設(shè)備驅(qū)動(dòng)硬件基礎(chǔ)內(nèi)核模塊中斷服務(wù)例程驅(qū)動(dòng)程序組成嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第2頁(yè)!設(shè)備驅(qū)動(dòng)的作用驅(qū)動(dòng)是應(yīng)用軟件和硬件的橋梁它使得應(yīng)用軟件只需要調(diào)用系統(tǒng)軟件的應(yīng)用編程接口(API)就可讓硬件去完成要求的工作。驅(qū)動(dòng)程序溝通著硬件和應(yīng)用軟件,而驅(qū)動(dòng)工程師溝通著硬件工程師和軟件工程師。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第3頁(yè)!無(wú)操作系統(tǒng)的程序架構(gòu)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第4頁(yè)!無(wú)操作系統(tǒng)時(shí)驅(qū)動(dòng)和應(yīng)用程序的關(guān)系在沒有操作系統(tǒng)時(shí),設(shè)備的接口被直接提交給用用軟件。應(yīng)用軟件直接調(diào)用、訪問(wèn)設(shè)備驅(qū)動(dòng)的接口設(shè)備驅(qū)動(dòng)的接口函數(shù)與硬件的功能直接吻合,沒有任何附加功能。兩種不合理設(shè)計(jì)驅(qū)動(dòng)中存在部分應(yīng)用,或應(yīng)用中包含驅(qū)動(dòng)都會(huì)導(dǎo)致程序移植性和復(fù)用性變差
嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第5頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第6頁(yè)!無(wú)操作系統(tǒng)的LED驅(qū)動(dòng)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第7頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第8頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第9頁(yè)!Linux設(shè)備驅(qū)動(dòng)的重點(diǎn)、難點(diǎn)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第10頁(yè)!Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì)的硬件基礎(chǔ)1、處理器嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第11頁(yè)!Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì)的硬件基礎(chǔ)3、總線與接口串口電器特性、時(shí)序特性(掌握)、信號(hào)分類I2C—有時(shí)序,無(wú)協(xié)議SPICAN—有協(xié)議,有時(shí)序USBPCI網(wǎng)口嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第12頁(yè)!Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì)的硬件基礎(chǔ)原理圖分析:確定設(shè)備使用的相關(guān)資源時(shí)序分析:芯片手冊(cè)芯片結(jié)構(gòu)、整體性能、管件個(gè)數(shù)、電氣性能寄存器編程外設(shè)控制器的編程流程嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第13頁(yè)!Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì)的硬件基礎(chǔ)儀器儀表使用萬(wàn)用表示波器等等嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第14頁(yè)!內(nèi)核模塊的概述內(nèi)核模塊在內(nèi)核空間運(yùn)行,內(nèi)核模塊編程是在內(nèi)核空間編程。內(nèi)核模塊可以引用內(nèi)核空間導(dǎo)出的全局符號(hào),因此內(nèi)核模塊編程與內(nèi)核的版本密切相關(guān)。內(nèi)核模塊只能調(diào)用和使用內(nèi)核提供的函數(shù),不能使用相關(guān)的應(yīng)用程序庫(kù)函數(shù)。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第15頁(yè)!上面例子是一個(gè)完整的內(nèi)核模塊,該模塊被載入內(nèi)核時(shí)會(huì)向系統(tǒng)的日志中寫入Hello,world;當(dāng)模塊被卸載時(shí),該模塊會(huì)向系統(tǒng)日志寫入一條Goodbye,cruelworld的信息。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第16頁(yè)!內(nèi)核模塊的基本結(jié)構(gòu)2模塊許可聲明:MODULE_LICENSE宏聲明此模塊的許可證,否則在模塊被加載時(shí),內(nèi)核會(huì)顯示警告。初始化、清理函數(shù)聲明:在2.6內(nèi)核模塊必須調(diào)用宏module_init和module_exit去注冊(cè)初始化與清理函數(shù),需要注意的是初始化清理函數(shù)必須在宏module_init和module_exit使用前定義滿足以上基本結(jié)構(gòu),模塊就可以正常工作了,在驅(qū)動(dòng)程序中除包含模塊的三個(gè)基本部分以外,還會(huì)包含文件操作及其它內(nèi)容??梢栽谀K中包含的其他描述性定義有MODULE_AUTHOR(聲明誰(shuí)編寫了模塊),MODULE_DESCRIPION(一個(gè)人可讀的關(guān)于模塊做什么的聲明),等其它MODULE_宏;各種MODULE_聲明可以出現(xiàn)在你的源碼文件的任何函數(shù)之外的地方.但是,一個(gè)內(nèi)核代碼中相對(duì)近期的慣例是把這些聲明放在文件末尾.
嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第17頁(yè)!初始化中的錯(cuò)誤處理如果在你注冊(cè)工具時(shí)發(fā)生任何錯(cuò)誤,首先的事情是決定模塊是否能夠無(wú)論如何繼續(xù)初始化它自己.常常,在一個(gè)注冊(cè)失敗后模塊可以繼續(xù)操作,如果需要可以功能降級(jí).在任何可能的時(shí)候,你的模塊應(yīng)當(dāng)盡力向前,并提供事情失敗后具備的能力.如果證實(shí)你的模塊在一個(gè)特別類型的失敗后完全不能加載,你必須取消任何在失敗前注冊(cè)的動(dòng)作.嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第18頁(yè)!清理—注冊(cè)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第19頁(yè)!模塊的編譯在linux2.6內(nèi)核中,模塊的編譯需要配置過(guò)的內(nèi)核源代碼,沒有源代碼無(wú)法進(jìn)行內(nèi)核模塊編譯工作。編譯、鏈接后生成的內(nèi)核模塊后綴為.ko。編譯過(guò)程中首先會(huì)到內(nèi)核源碼目錄下,讀取頂層的makefile文件,然后返回模塊源代碼所在的目錄編譯。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第20頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第21頁(yè)!模塊的加載編譯好模塊后用戶可以利用超級(jí)用戶的身份可以將內(nèi)核模塊加載到內(nèi)核中。常見的實(shí)用程序insmod、rmmod、lsmod、modprobe嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第22頁(yè)!直接在內(nèi)核源碼樹下完成模塊的構(gòu)建對(duì)于上面的示例建立模塊的步驟嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第23頁(yè)!接下來(lái)在內(nèi)核的配置文件中增加新的選項(xiàng):在../driver/char/kconfig文件中增加針對(duì)example的配置選項(xiàng)當(dāng)設(shè)置完kconfig文件并且保存在../driver/char/子目錄下后,上述的代碼片段最終在當(dāng)前的操作系統(tǒng)內(nèi)核配置選項(xiàng)中增加了新的一項(xiàng)config_examples相應(yīng)的配置程序需要通過(guò)下面的命令進(jìn)行調(diào)用,然后進(jìn)行相關(guān)配置完成相關(guān)配置選項(xiàng)的配置工作嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第24頁(yè)!接下來(lái)修改../driver/char/子目錄的makefile,添加example選項(xiàng),指導(dǎo)內(nèi)核配置選項(xiàng)config_example完成example的構(gòu)建工作。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第25頁(yè)!把驅(qū)動(dòng)程序模塊安裝在文件系統(tǒng)相應(yīng)的目錄中。命令舉例(把模塊裝在coyote-target目錄)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第26頁(yè)!對(duì)外設(shè)的操作-1.輪詢,2.中斷外設(shè)的操作時(shí)間一般較長(zhǎng),并且具有時(shí)間的不確定性,驅(qū)動(dòng)程序向外設(shè)發(fā)出操作指令后,驅(qū)動(dòng)程序采用兩種方式等待操作完成。輪詢模式(pollingmode)
CPU重復(fù)檢查(輪詢)設(shè)備的狀態(tài)寄存器,直到寄存器的值表明I/O操作已經(jīng)完成為止中斷模式(interruptmode)
如果I/O控制器能夠通過(guò)IRQ線發(fā)出I/O操作結(jié)束的信號(hào),就可以使用中斷模式嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第27頁(yè)!中斷模式—好處外部設(shè)備通過(guò)中斷線將產(chǎn)生的中斷通知處理器,在驅(qū)動(dòng)程序采用中斷模式工作前必須要申請(qǐng)注冊(cè)一個(gè)中斷號(hào)。要注冊(cè)給外設(shè)注冊(cè)一個(gè)外部中斷號(hào),必須要確定外設(shè)使用的那個(gè)中斷號(hào),確定中斷號(hào)可以通過(guò):指定外設(shè)中斷號(hào)通過(guò)檢測(cè)函數(shù)檢測(cè)中斷號(hào),從而確定要注冊(cè)的外部中斷號(hào)編寫相關(guān)的中斷服務(wù)例程ISR嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第28頁(yè)!兩個(gè)函數(shù)使用結(jié)構(gòu)如下:嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第29頁(yè)!注冊(cè)外部中斷中斷程序的注冊(cè)一個(gè)模塊被希望來(lái)請(qǐng)求一個(gè)中斷通道(或者IRQ,對(duì)于中斷請(qǐng)求),在使用它之前要注冊(cè)它,并且當(dāng)結(jié)束時(shí)釋放它.函數(shù)聲明在<linux/interrupt.h>,實(shí)現(xiàn)中斷注冊(cè)接口:嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第30頁(yè)!中斷處理程序:一個(gè)中斷處理的角色是給它的設(shè)備關(guān)于中斷接收的回應(yīng)并且讀或?qū)憯?shù)據(jù),根據(jù)被服務(wù)的中斷的含義.步常常包括清除接口板上的一位;讓大部分硬件設(shè)備不產(chǎn)生別的中斷直到它們的“中斷掛起”位被清除.–即action.中斷處理程序與普通c代碼沒有太大不同,不同的是中斷程序在中斷期間運(yùn)行,有如下限制:不能向用戶空間發(fā)送或接收數(shù)據(jù)---發(fā)生中斷的上下文是當(dāng)前的用戶空間,如果發(fā)數(shù)據(jù),會(huì)污染用戶空間不能執(zhí)行有睡眠操作的函數(shù)不能調(diào)用調(diào)度函數(shù)---中斷優(yōu)先級(jí)很高,內(nèi)核不支持中斷中調(diào)度嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第31頁(yè)!中斷處理程序的上半部和下半部的劃分:如果一個(gè)任務(wù)對(duì)時(shí)間非常敏感,將其放在上半部執(zhí)行如果一個(gè)任務(wù)和硬件相關(guān),將其放在上半部中執(zhí)行如果一個(gè)任務(wù)要保證不被其他中斷(特別是相同的中斷)打斷,將其放在上半部中執(zhí)行其他所有任務(wù),考慮放置在下半部執(zhí)行嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第32頁(yè)!1、軟中斷(32g)的主要數(shù)據(jù)結(jié)構(gòu)在softirq_vec中定義在softirq_vec數(shù)組中每一項(xiàng)對(duì)應(yīng)一個(gè)軟中斷,系統(tǒng)中最多可以有32個(gè)軟中斷。優(yōu)先級(jí)對(duì)應(yīng)于softirq_vec的下標(biāo)軟中斷函數(shù)及其參數(shù)kernel/softirq.cinclude/linux/interrupt.h嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第33頁(yè)!軟中斷的初始化初始化軟中斷函數(shù)軟中斷初始注冊(cè)函數(shù)open_softirq接受三個(gè)參數(shù),軟中斷的序號(hào)(如nr置為0)、軟中斷處理函數(shù)以及傳遞給軟中斷處理函數(shù)的參數(shù)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第34頁(yè)!2、Tasklet機(jī)制Tasklet是I/O驅(qū)動(dòng)程序中實(shí)現(xiàn)可延遲函數(shù)的首選方法---比軟中斷好建立在HI_SOFTIRQ和TASKLET_SOFTIRQ等軟中斷之上Tasklet和高優(yōu)先級(jí)的tasklet分別存放在tasklet_vec和tasklet_hi_vec數(shù)組中數(shù)組的每一項(xiàng)針對(duì)一個(gè)CPU,代表這個(gè)CPU上的tasklet列表分別由tasklet_action和tasklet_hi_action處理找到CPU對(duì)應(yīng)的那個(gè)項(xiàng),遍歷執(zhí)行嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第35頁(yè)!Tasklet的靜態(tài)定義嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第36頁(yè)!tasklet使用如下://定義一個(gè)處理函數(shù)voidmy_tasklet_function(unsignedlong);//定義了一個(gè)名叫my_tasklet的tasklet并將其與處理函數(shù)綁定,而傳入?yún)?shù)為dataDECLARE_TASKLET(my_tasklet,my_tasklet_function,data);在需要調(diào)度tasklet的時(shí)候引用一個(gè)tasklet_schedule()函數(shù)就能使系統(tǒng)在適當(dāng)?shù)臅r(shí)候進(jìn)行調(diào)度運(yùn)行:tasklet_schedule(&my_tasklet);嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第37頁(yè)!3、工作隊(duì)列workqueue
工作隊(duì)列和tasklet這兩種下半部機(jī)制的主要區(qū)別在于:Tasklet在軟中斷的上下文中運(yùn)行,所有的代碼必須是原子的,不能睡眠、不能使用信號(hào)量或其它產(chǎn)生阻塞的函數(shù);工作隊(duì)列在一個(gè)內(nèi)核線程上下文運(yùn)行,并且可以在延遲一段確定的時(shí)間后才執(zhí)行;有更多的靈活性,它可以使用信號(hào)量等能夠睡眠的函數(shù)。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第38頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第39頁(yè)!這個(gè)驅(qū)動(dòng)程序包含兩個(gè)函數(shù):實(shí)現(xiàn)文件對(duì)象read方法的foo_read()函數(shù)處理中斷的foo_interrupt()函數(shù)只要用戶讀設(shè)備文件,foo_read()函數(shù)就會(huì)被觸發(fā)對(duì)I/O設(shè)備發(fā)出讀命令等待讀操作的結(jié)束,由中斷處理程序喚醒將獲得的數(shù)據(jù)送到用戶空間中嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第40頁(yè)!再看foo_read的輸入?yún)?shù)Structfile*filp,在這個(gè)數(shù)據(jù)的私有數(shù)據(jù)項(xiàng)中,VFS已經(jīng)將其轉(zhuǎn)換成設(shè)備驅(qū)動(dòng)程序的私有的信息
foo_dev_t,被定義為包含如下信息:一個(gè)信號(hào)量,互斥使用intr作為標(biāo)志0:沒有發(fā)生/處理中斷1:處理了中斷一個(gè)等待隊(duì)列,用來(lái)給foo_read睡眠一個(gè)數(shù)據(jù)區(qū),長(zhǎng)度為1,用來(lái)存放讀到的數(shù)據(jù)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第41頁(yè)!驅(qū)動(dòng)程序分析設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)最基本的組成部分,是linux內(nèi)核的一部分,一般情況下可以將驅(qū)動(dòng)程序設(shè)計(jì)為一個(gè)模塊,在需要時(shí)動(dòng)態(tài)加載到內(nèi)核中。Linux將硬件設(shè)備看作一個(gè)特殊的文件來(lái)操作,該文件被稱為設(shè)備文件;系統(tǒng)通過(guò)對(duì)設(shè)備文件的讀寫等操作,實(shí)現(xiàn)對(duì)外設(shè)的讀寫等操作驅(qū)動(dòng)程序是設(shè)備文件與直接外設(shè)間的橋梁嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第42頁(yè)!設(shè)備號(hào)Linux系統(tǒng)使用設(shè)備號(hào)來(lái)標(biāo)識(shí)設(shè)備文件。設(shè)備號(hào)分為主設(shè)備號(hào)和從設(shè)備號(hào)。主設(shè)備號(hào)是同一類設(shè)備的標(biāo)識(shí),對(duì)應(yīng)著一個(gè)驅(qū)動(dòng)程序---如優(yōu)盤從設(shè)備號(hào)是在驅(qū)動(dòng)程序中來(lái)指示某個(gè)物理設(shè)備的實(shí)例,從設(shè)備號(hào)使得不同的物理實(shí)例可以使用同一個(gè)驅(qū)動(dòng)程序---如每個(gè)盤都編號(hào)不一樣嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第43頁(yè)!設(shè)備文件設(shè)備文件這是存放在文件系統(tǒng)中的實(shí)際文件索引節(jié)點(diǎn)不對(duì)磁盤上的數(shù)據(jù)塊編址,而是包含硬件設(shè)備的一個(gè)標(biāo)識(shí)每個(gè)設(shè)備文件包括:名字、類型(字符/塊)設(shè)備號(hào)(主設(shè)備號(hào):次設(shè)備號(hào))同一設(shè)備驅(qū)動(dòng)程序不同設(shè)備嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第44頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第45頁(yè)!注冊(cè)時(shí)機(jī)如果設(shè)備驅(qū)動(dòng)程序被靜態(tài)編譯進(jìn)內(nèi)核,則注冊(cè)發(fā)生在內(nèi)核初始化階段如果作為一個(gè)內(nèi)核模塊來(lái)編譯,則在裝入模塊的時(shí)候注冊(cè)(并在卸載模塊時(shí)注銷)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第46頁(yè)!字符設(shè)備初始化嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第47頁(yè)!字符設(shè)備的注冊(cè)函數(shù)字符設(shè)備的撤銷函數(shù)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第48頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第49頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第50頁(yè)!字符設(shè)備有關(guān)的數(shù)據(jù)結(jié)構(gòu)大部分的基礎(chǔ)性的驅(qū)動(dòng)操作包括3個(gè)重要的內(nèi)核數(shù)據(jù)結(jié)構(gòu),稱為file_operations,file,和inode.file_operations文件操作File打開的文件inode由內(nèi)核在內(nèi)部用來(lái)表示文件嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第51頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第52頁(yè)!File數(shù)據(jù)結(jié)構(gòu)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第53頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第54頁(yè)!字符驅(qū)動(dòng)程序的結(jié)構(gòu)在linux系統(tǒng)中,設(shè)備的操作演變成對(duì)文件的操作,因此設(shè)備驅(qū)動(dòng)程序最重要的工作就是編寫fops指針對(duì)應(yīng)的文件操作函數(shù)。每個(gè)打開的設(shè)備文件均與一組函數(shù)關(guān)聯(lián)。字符驅(qū)動(dòng)程序一般提供以下幾個(gè)入口:以及相應(yīng)的file_operations類型的文件操作接口定義嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第55頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第56頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第57頁(yè)!示例說(shuō)明:增加了一個(gè)新的內(nèi)核頭文件,用于獲取文件系統(tǒng)操作的定義在hello_init()函數(shù)中增加了一個(gè)新的函數(shù)調(diào)用register_chrdev的函數(shù)調(diào)用,該函數(shù)調(diào)用把設(shè)備驅(qū)動(dòng)程序注冊(cè)到內(nèi)核;它將類型為structfile_opretions結(jié)構(gòu),將設(shè)備函數(shù)與來(lái)自文件系統(tǒng)的請(qǐng)求綁定在一起當(dāng)用戶應(yīng)用程序打開某個(gè)設(shè)備驅(qū)動(dòng)程序表示的設(shè)備時(shí),并進(jìn)行讀取數(shù)據(jù)操作(使用read()函數(shù)),文件系統(tǒng)就會(huì)把read()函數(shù)和模塊的hello_read()對(duì)應(yīng)起來(lái)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第58頁(yè)!通過(guò)設(shè)備文件操作設(shè)備驅(qū)動(dòng)模塊運(yùn)用設(shè)備驅(qū)動(dòng)程序嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第59頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第60頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第61頁(yè)!塊設(shè)備的程序結(jié)構(gòu)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第62頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第63頁(yè)!在這樣的系統(tǒng)中,雖然不存在操作系統(tǒng),但設(shè)備驅(qū)動(dòng)程序一般存在。一般情況下,驅(qū)動(dòng)程序都會(huì)定義為一個(gè)軟件模塊,包含.h文件和.C文件,前者定義該設(shè)備驅(qū)動(dòng)程序的數(shù)據(jù)結(jié)構(gòu)并聲明外部函數(shù),后者進(jìn)行驅(qū)動(dòng)的具體實(shí)現(xiàn)。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第64頁(yè)!有操作系統(tǒng)的設(shè)備驅(qū)動(dòng)有操作系統(tǒng)的設(shè)備驅(qū)動(dòng)的變化無(wú)操作系統(tǒng)時(shí)設(shè)備驅(qū)動(dòng)的硬件工作仍然必不可少,沒有它們驅(qū)動(dòng)不可能與硬件打交道需要把驅(qū)動(dòng)融入內(nèi)核。為了實(shí)現(xiàn)這種融合,需要在驅(qū)動(dòng)程序中設(shè)計(jì)面向系統(tǒng)內(nèi)核的接口。這樣的接口有操作系統(tǒng)規(guī)定,對(duì)一類設(shè)備而言結(jié)構(gòu)一致,獨(dú)立于具體的設(shè)備。設(shè)備驅(qū)動(dòng)程序成為硬件和內(nèi)核的橋梁---要寫一部分內(nèi)核接口,多出來(lái)兩層結(jié)構(gòu),有利有弊,屏蔽了底層的差異嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第65頁(yè)!Linux的設(shè)備驅(qū)動(dòng)Linux設(shè)備字符設(shè)備塊設(shè)備網(wǎng)絡(luò)設(shè)備嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第66頁(yè)!Linux的led驅(qū)動(dòng)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第67頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第68頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第69頁(yè)!Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì)的硬件基礎(chǔ)計(jì)算機(jī)系統(tǒng)的硬件主要由CPU、存儲(chǔ)器和外設(shè)組成。驅(qū)動(dòng)針對(duì)的對(duì)象是存儲(chǔ)器和外設(shè)(包括CPU內(nèi)部集成的存儲(chǔ)器和外設(shè))。注意不是針對(duì)CPU核嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第70頁(yè)!Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì)的硬件基礎(chǔ)2、存儲(chǔ)器嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第71頁(yè)!Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì)的硬件基礎(chǔ)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第72頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第73頁(yè)!內(nèi)核模塊概述Linux的內(nèi)核模塊機(jī)制給內(nèi)核提供了很強(qiáng)的靈活性,用戶通過(guò)加載內(nèi)核模塊可以方便的給內(nèi)核添加功能;同樣用戶也可以將內(nèi)核不需要用的功能卸載。驅(qū)動(dòng)程序可以靜態(tài)編譯進(jìn)內(nèi)核,但由于外設(shè)眾多,內(nèi)核不可能包含所有設(shè)備的驅(qū)動(dòng)。用戶通過(guò)內(nèi)核模塊機(jī)制可以把需要用到的驅(qū)動(dòng)程序動(dòng)態(tài)地加入內(nèi)核。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第74頁(yè)!模塊編程舉例-一個(gè)簡(jiǎn)單的hello模塊為何不用printf函數(shù)語(yǔ)句???嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第75頁(yè)!內(nèi)核模塊的基本結(jié)構(gòu)1一個(gè)典型的內(nèi)核模塊包含以下幾部分:頭文件聲明:頭文件module.h和init.h是必須的。module.h包含了加載模塊需要的函數(shù)和符號(hào)的定義;init.h包含了模塊初始化和清理函數(shù)的定義;如果模塊在加載時(shí)允許用戶傳遞參數(shù),模塊還應(yīng)該包含moduleparam.h頭文件。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第76頁(yè)!模塊的初始化與關(guān)閉模塊初始化函數(shù)注冊(cè)模塊提供的相關(guān)功能.這些功能,我們指的是新功能,可以由應(yīng)用程序存取的或者一整個(gè)驅(qū)動(dòng)或者一個(gè)新軟件抽象.實(shí)際的初始化函數(shù)定義常常如:
staticint__initinitialization_function(void){/*Initializationcodehere*/}module_init(initialization_function);
每個(gè)非試驗(yàn)性的模塊也要求有一個(gè)清理函數(shù),它注銷接口,在模塊被去除之前返回所有資源給系統(tǒng).這個(gè)函數(shù)定義為:staticvoid__exitcleanup_function(void){/*Cleanupcodehere*/}module_exit(cleanup_function);如果你的模塊沒有定義一個(gè)清理函數(shù),內(nèi)核不會(huì)允許它被卸載.嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第77頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第78頁(yè)!另一種編程如下:嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第79頁(yè)!模塊的編譯嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第80頁(yè)!模塊的makefile二嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第81頁(yè)!直接在內(nèi)核源碼樹下完成模塊的構(gòu)建嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第82頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第83頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第84頁(yè)!驅(qū)動(dòng)模塊的生成完成上述工作以后,構(gòu)建example設(shè)備驅(qū)動(dòng)程序的基礎(chǔ)設(shè)施就準(zhǔn)備好了,利用上述步驟完成構(gòu)建的好處是,不管何時(shí)調(diào)用內(nèi)核構(gòu)建工作,相應(yīng)的驅(qū)動(dòng)程序都會(huì)自動(dòng)被構(gòu)建。只要在相應(yīng)配置選項(xiàng)中進(jìn)行相應(yīng)選擇,就可以完成設(shè)備驅(qū)動(dòng)程序的構(gòu)建相應(yīng)的命令行舉例:嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第85頁(yè)!加載設(shè)備驅(qū)動(dòng)模塊嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第86頁(yè)!輪詢模式的簡(jiǎn)單例子—不好可以用來(lái)粗略的判斷超時(shí)若時(shí)間比較長(zhǎng),比如ms級(jí),可以在每次輪詢操作之后調(diào)用schedule主動(dòng)放棄CPU,直到下次被調(diào)度再次輪詢嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第87頁(yè)!確定外部中斷號(hào)自動(dòng)檢測(cè)IRQ:內(nèi)核在<linux/interrupt.h>中聲明了兩個(gè)用于自動(dòng)檢測(cè)IRQ的函數(shù)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第88頁(yè)!檢測(cè)IRQ函數(shù)舉例嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第89頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第90頁(yè)!每一個(gè)中斷服務(wù)例程都應(yīng)該∵盡快地釋放處理器,把能夠推遲的工作盡量后推。中斷處理程序的∴上半部和下半部上半部分會(huì)立即被內(nèi)核執(zhí)行下半部分會(huì)被推遲執(zhí)行:下半部的執(zhí)行并不需要指明一個(gè)確切時(shí)間,只要把這些任務(wù)推遲,讓它們?cè)谙到y(tǒng)不太繁忙并且中斷恢復(fù)后執(zhí)行就可以了。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第91頁(yè)!中斷處理程序下半部的實(shí)現(xiàn)機(jī)制:軟中斷Tasklet:基于軟中斷來(lái)實(shí)現(xiàn),但比軟中斷接口簡(jiǎn)單,同步要求較低;軟中斷保留給執(zhí)行頻率及時(shí)間要求高的下半部使用。工作隊(duì)列嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第92頁(yè)!內(nèi)核只預(yù)定義了6個(gè)中斷優(yōu)先級(jí)0:處理高優(yōu)先級(jí)的tasklet和下半部分優(yōu)先級(jí)2:把數(shù)據(jù)包傳送到網(wǎng)卡優(yōu)先級(jí)3:從網(wǎng)卡接受數(shù)據(jù)包優(yōu)先級(jí)5:處理tasklet優(yōu)先級(jí)1:與時(shí)鐘中斷相關(guān)的tasklet優(yōu)先級(jí)4:塊設(shè)備相關(guān)優(yōu)先級(jí)6:調(diào)度SMP相關(guān)include/linux/interrupt.h嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第93頁(yè)!軟中斷的觸發(fā)與執(zhí)行軟中斷處理程序被注冊(cè)后,觸發(fā)軟中斷的函數(shù)為raise_softirq;該函數(shù)接受要被激活的軟中斷序號(hào)最為參數(shù)。例如:raise_softirq(NET_TX_SOFTIRQ)使該軟中斷的處理函數(shù)net_tx_action處于可運(yùn)行狀態(tài)該軟中斷處理函數(shù)net_tx_action會(huì)在內(nèi)核下次執(zhí)行軟中斷do_softirq()時(shí)被執(zhí)行
自學(xué)linux內(nèi)核的軟中斷機(jī)制?嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第94頁(yè)!0:enable>0:disableinclude/linux/interrupt.hnext指針指向下一個(gè)tasklet,它用于將多個(gè)tasklet連接成一個(gè)單向循環(huán)鏈表。func是一個(gè)函數(shù)指針,指向一個(gè)可執(zhí)行的tasklet代碼段,data是func函數(shù)的參數(shù)。自己寫的嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第95頁(yè)!Tasklet的使用當(dāng)需要使用tasklet時(shí),可以按照如下方法進(jìn)行1、分配一個(gè)tasklet的數(shù)據(jù)結(jié)構(gòu),并初始化
==相當(dāng)于聲明(定義)一個(gè)tasklet2、可以禁止/允許這個(gè)tasklet
==相當(dāng)于定義了一個(gè)是否允許使用tasklet的窗口3、可以激活這個(gè)tasklet
==這個(gè)tasklet被插入task_vec或者task_hi_vec的相應(yīng)CPU的鏈表上,將在合適的時(shí)機(jī)得到處理調(diào)度運(yùn)行Tasklet_scheduleTasklet_hi_schedule嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第96頁(yè)!Tasklet使用模板嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第97頁(yè)!工作隊(duì)列的使用(使用內(nèi)核默認(rèn)隊(duì)列)工作隊(duì)列:使用方法和tasklet相似,如下:structwork_structmy_wq;//創(chuàng)建一個(gè)工作隊(duì)列my_wqvoidmy_wq_func(unsignedlong);
//定義一個(gè)處理函數(shù)通過(guò)INIT_WORK()可以初始化這個(gè)工作隊(duì)列并將工作隊(duì)列與處理函數(shù)綁定,如下:INIT_WORK(&my_wq,(void(*)(void*))my_wq_func,NULL);
//初始化工作隊(duì)列并將其與處理函數(shù)綁定同樣,使用schedule_work(&my_irq);來(lái)在系統(tǒng)在適當(dāng)?shù)臅r(shí)候需要調(diào)度時(shí)使用運(yùn)行。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第98頁(yè)!中斷模式的簡(jiǎn)單例子假定實(shí)現(xiàn)一個(gè)簡(jiǎn)單的輸入字符設(shè)備的驅(qū)動(dòng)程序當(dāng)在對(duì)應(yīng)的設(shè)備文件上發(fā)出read()系統(tǒng)調(diào)用時(shí),一條輸入命令被發(fā)往設(shè)備的控制寄存器在一個(gè)不可預(yù)知的長(zhǎng)時(shí)間后,設(shè)備把一個(gè)字節(jié)的數(shù)據(jù)放在輸入寄存器驅(qū)動(dòng)程序然后將這個(gè)字節(jié)作為read()系統(tǒng)調(diào)用的結(jié)果返回一般我們?cè)诖未蜷_設(shè)備時(shí)使用request_irq注冊(cè)中斷,在最后一次關(guān)閉時(shí)使用free_irq釋放中斷。嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第99頁(yè)!從設(shè)備上讀入數(shù)據(jù)喚醒read的剩余部分嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第100頁(yè)!char*buf,用戶提供的存放數(shù)據(jù)的空間Count和ppos都沒有用到再看看foo_interrupt()中,這是通過(guò)foo一個(gè)全局變量獲得設(shè)備的私有數(shù)據(jù)結(jié)構(gòu)的,這個(gè)數(shù)據(jù)結(jié)構(gòu)與foo_read()中通過(guò)filp中獲得的私有數(shù)據(jù)一致foo_interrupt的輸入?yún)?shù)沒有得到使用,這是一種很普遍的情況嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第101頁(yè)!Linux驅(qū)動(dòng)的層次結(jié)構(gòu)用戶通過(guò)操作設(shè)備文件對(duì)硬件設(shè)備進(jìn)行訪問(wèn)。驅(qū)動(dòng)程序包括設(shè)備服務(wù)子程序和中斷處理程序兩部分:設(shè)備服務(wù)程序包含設(shè)備操作相關(guān)的程序代碼;中斷處理程序負(fù)責(zé)處理設(shè)備通過(guò)中斷方式向驅(qū)動(dòng)程序發(fā)出的輸入/輸出請(qǐng)求。用戶進(jìn)程文件系統(tǒng)(設(shè)備文件)設(shè)備驅(qū)動(dòng)程序設(shè)備服務(wù)程序中斷處理程序硬件設(shè)備設(shè)備文件,通過(guò)設(shè)備號(hào)來(lái)尋找驅(qū)動(dòng)程序嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第102頁(yè)!嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第103頁(yè)!mknod()系統(tǒng)調(diào)用用來(lái)創(chuàng)建老式的設(shè)備文件設(shè)備文件名。在/dev目錄下產(chǎn)生一個(gè)文件名操作權(quán)限和設(shè)備類型。其中設(shè)備類型指定:S_IFCHR或S_IFBLK。inod設(shè)備號(hào)16位,主設(shè)備號(hào):次設(shè)備號(hào)可以指定設(shè)備號(hào)嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第104頁(yè)!注冊(cè)設(shè)備驅(qū)動(dòng)程序注冊(cè)一個(gè)設(shè)備驅(qū)動(dòng)程序意味著把它與對(duì)應(yīng)的設(shè)備文件連接起來(lái)使得對(duì)設(shè)備文件發(fā)出的系統(tǒng)調(diào)用可以由內(nèi)核轉(zhuǎn)化為相應(yīng)的設(shè)備驅(qū)動(dòng)程序?qū)?yīng)的函數(shù)按照設(shè)備驅(qū)動(dòng)程序模型,分配一個(gè)新的device_driver描述符,對(duì)應(yīng)到設(shè)備文件上訪問(wèn)一個(gè)沒有注冊(cè)設(shè)備驅(qū)動(dòng)程序的設(shè)備文件將會(huì)返回錯(cuò)誤碼-ENODEV嵌入式操作系統(tǒng)驅(qū)動(dòng)程序編寫基礎(chǔ)共123頁(yè),您現(xiàn)在瀏覽的是第105頁(yè)!字符設(shè)備驅(qū)動(dòng)程序的注冊(cè)內(nèi)核中每個(gè)字符設(shè)備都對(duì)應(yīng)一個(gè)cdev結(jié)構(gòu)的變量:
structcdev{
structkobjectkobj;
//每個(gè)cdev都是一個(gè)kobject
structmodule
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 銀行貸款委托代理合同(2篇)
- 巴西課件 湘教版
- 人教版南轅北轍課件
- 蘇教版江蘇省揚(yáng)州市揚(yáng)州中學(xué)教育集團(tuán)樹人學(xué)校2023-2024學(xué)年高一上學(xué)期期中數(shù)學(xué)試題
- 老舍《茶館》課件
- 外科護(hù)理課件
- 基層教育 課件
- 西京學(xué)院《中華才藝》2023-2024學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《外國(guó)文學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 西華師范大學(xué)《中外電影史》2021-2022學(xué)年期末試卷
- 工程聯(lián)系單表格樣本
- 新媒體運(yùn)營(yíng)智慧樹知到期末考試答案章節(jié)答案2024年黑龍江職業(yè)學(xué)院
- 耳鼻喉科病例討論模板
- 《道路行駛記錄儀檢測(cè)裝置校準(zhǔn)規(guī)范-公示稿》
- 低分學(xué)生提升計(jì)劃小學(xué)數(shù)學(xué)
- 滑坡泥石流-高中地理省公開課金獎(jiǎng)全國(guó)賽課一等獎(jiǎng)微課獲獎(jiǎng)
- 人工智能職業(yè)生涯規(guī)劃報(bào)告總結(jié)
- 主題班隊(duì)會(huì)教學(xué)設(shè)計(jì)
- 三年級(jí)上冊(cè)數(shù)學(xué)除法豎式計(jì)算300道帶答案
- 供應(yīng)室停水停電應(yīng)急預(yù)案
- JGJ72-2004 高層建筑巖土工程勘察規(guī)程
評(píng)論
0/150
提交評(píng)論