第五章 按鍵中斷驅(qū)動(dòng)程序 Linux設(shè)備驅(qū)動(dòng)程序 教學(xué)課件_第1頁(yè)
第五章 按鍵中斷驅(qū)動(dòng)程序 Linux設(shè)備驅(qū)動(dòng)程序 教學(xué)課件_第2頁(yè)
第五章 按鍵中斷驅(qū)動(dòng)程序 Linux設(shè)備驅(qū)動(dòng)程序 教學(xué)課件_第3頁(yè)
第五章 按鍵中斷驅(qū)動(dòng)程序 Linux設(shè)備驅(qū)動(dòng)程序 教學(xué)課件_第4頁(yè)
第五章 按鍵中斷驅(qū)動(dòng)程序 Linux設(shè)備驅(qū)動(dòng)程序 教學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第五章按鍵中斷驅(qū)動(dòng)程序中斷與時(shí)鐘嵌入式Linux中斷處理驅(qū)動(dòng)程序及測(cè)試按鍵中斷驅(qū)動(dòng)程序?qū)嵗袛嗯c時(shí)鐘按鍵中斷驅(qū)動(dòng)程序?qū)嵗^中斷是指CPU在執(zhí)行程序的過(guò)程中,出現(xiàn)了某些突發(fā)事件時(shí)CPU必須暫停執(zhí)行當(dāng)前的程序,轉(zhuǎn)去處理突發(fā)事件,處理完畢后CPU又返回原程序被中斷的位置并繼續(xù)執(zhí)行。根據(jù)中斷的來(lái)源,中斷可分為內(nèi)部中斷和外部中斷,內(nèi)部中斷的中斷源來(lái)自CPU內(nèi)部,外部中斷的中斷源來(lái)自CPU外部,由外設(shè)提出請(qǐng)求。根據(jù)是否可以屏蔽中斷分為可屏蔽中斷與不屏蔽中斷,可屏蔽中斷可以通過(guò)屏蔽字被屏蔽,屏蔽后,該中斷不再得到響應(yīng),而不屏蔽中斷不能被屏蔽。根據(jù)中斷入口跳轉(zhuǎn)方法的不同,中斷分為向量中斷和非向量中斷。向量中斷由硬件提供中斷服務(wù)程序入口地址,非向量中斷由軟件提供中斷服務(wù)程序入口地址。非向量中斷服務(wù)程序的典型結(jié)構(gòu):定時(shí)器在硬件上也依賴(lài)中斷來(lái)實(shí)現(xiàn),其工作原理如圖:為了在中斷執(zhí)行時(shí)間盡可能短和中斷處理需要完成大量工作之間找到一個(gè)平衡點(diǎn),Linux將中斷處理程序分解為兩個(gè)部分:頂半部和底半部(軟中斷)。之所以將中斷程序分為兩部分,是因?yàn)橐粋€(gè)中斷請(qǐng)求處理程序中,并非所有工作都是急需處理的,通常會(huì)有一部分可在稍晚一些時(shí)候來(lái)處理。一般來(lái)說(shuō),處理器與外設(shè)數(shù)據(jù)傳輸工作比較緊急,而對(duì)數(shù)據(jù)的分析和處理工作一般就不那么緊急了。可中斷不可中斷頂半部完成盡可能少的比較緊急的功能,它往往只是簡(jiǎn)單地讀取寄存器中的中斷狀態(tài)并清除中斷標(biāo)志后就進(jìn)行登記中斷的工作。(將底半部處理程序掛到該設(shè)備的底半部執(zhí)行隊(duì)列中去)底半部幾乎做了中斷處理程序所有的事情,而且可以被新的中斷打斷,這也是底半部和頂半部的最大不同,因?yàn)轫敯氩客辉O(shè)計(jì)成不可中斷。但如果中斷要處理的工作本身很少,則完全可以直接在頂半部全部完成。在Linux系統(tǒng)中,察看/proc/interrupts文件可以獲得系統(tǒng)中斷的統(tǒng)計(jì)信息。當(dāng)處理器在接收到中斷請(qǐng)求信號(hào)后,在條件允許的情況下,處理器會(huì)應(yīng)這個(gè)請(qǐng)求去執(zhí)行一個(gè)預(yù)設(shè)的程序模塊,即中斷服務(wù)例程。處理器就是通過(guò)執(zhí)行這個(gè)中斷服務(wù)例程來(lái)為中斷源提供服務(wù)的。無(wú)論何種處理器,都必須為中斷請(qǐng)求信號(hào)提供硬件通道。當(dāng)處理器接收到了一個(gè)中斷請(qǐng)求信號(hào)后,必須知道這個(gè)信號(hào)是哪個(gè)通道發(fā)出的。為了使處理器能夠識(shí)別這個(gè)中斷通道,就必須為每個(gè)中斷通道賦予一個(gè)唯一的編號(hào),即通道號(hào)(如圖EINT0、EINT1…EINT23)。這個(gè)通道號(hào)是該通道向處理器傳遞中斷信號(hào),并且處理器響應(yīng)了這個(gè)中斷之后,由中斷控制器自動(dòng)向處理器提供的。CPU中斷控制器中斷請(qǐng)求中斷確認(rèn)EINT0EINT1EINT23中斷服務(wù)例程與中斷源是一一對(duì)應(yīng)的,一個(gè)中斷源要得到處理器的服務(wù),至少要做兩件事情:一是發(fā)出中斷請(qǐng)求信號(hào),二是要在處理器響應(yīng)了這個(gè)中斷請(qǐng)求之后,向處理器提供中斷服務(wù)程序的地址或與之相關(guān)的信息。在一個(gè)復(fù)雜的計(jì)算機(jī)系統(tǒng)中,中斷源的數(shù)目往往比計(jì)算機(jī)硬件提供的中斷通道數(shù)目大得多,這就迫使多個(gè)中斷源必須共同使用同一個(gè)中斷通道。于是,系統(tǒng)就必須在內(nèi)存中為每個(gè)中斷通道維護(hù)一個(gè)中斷源隊(duì)列(中斷請(qǐng)求隊(duì)列),隊(duì)列中的每個(gè)成員對(duì)應(yīng)一個(gè)中斷源。另外,隊(duì)列的每個(gè)成員必須保有對(duì)應(yīng)中斷源的相關(guān)信息,以使處理器接收到了一個(gè)中斷通道的中斷請(qǐng)求信號(hào)之后,能進(jìn)一步在該通道的隊(duì)列中確認(rèn)究竟是哪個(gè)中斷源提出了中斷請(qǐng)求,并能獲取該中斷源服務(wù)例程的地址或其相關(guān)信息。在中斷源請(qǐng)求中斷之前,該中斷源的中斷服務(wù)例程必須已掛接到所在通道的中斷請(qǐng)求隊(duì)列中。其安裝步驟如下:申請(qǐng)中斷將中斷服務(wù)例程安裝到中斷請(qǐng)求隊(duì)列中:

setup_irq(unsigned

int

irq,struct

irqaction*new)在中斷結(jié)束后,關(guān)閉申請(qǐng)中斷的設(shè)備時(shí),要調(diào)用函數(shù)釋放所申請(qǐng)的中斷號(hào):處理器在響應(yīng)了一個(gè)通道的中斷請(qǐng)求后,會(huì)馬上關(guān)閉中斷并中斷現(xiàn)場(chǎng)執(zhí)行的程序,跳轉(zhuǎn)去執(zhí)行該通道對(duì)應(yīng)的中斷處理程序。在通道處理程序中,需要執(zhí)行一些由系統(tǒng)提供的函數(shù)來(lái)完成一些諸如現(xiàn)場(chǎng)保護(hù)等例行現(xiàn)場(chǎng)工作。接著,執(zhí)行函數(shù)do_IRQ(),在該函數(shù)中主要是調(diào)用了中斷源中斷服務(wù)例程(確切地說(shuō),是上半部)。在do_IRQ()函數(shù)的末尾調(diào)用了函數(shù)irq_exit(),這個(gè)函數(shù)的主要工作是啟動(dòng)中斷后半部分的軟

中斷機(jī)制,以使系統(tǒng)可在適當(dāng)?shù)臅r(shí)候執(zhí)行中斷

服務(wù)例程的下半部分函數(shù)。內(nèi)核提供的其他中斷函數(shù)使能和屏蔽中斷作用范圍為本CPU底半部機(jī)制Tasklet我們只需定義tasklet及其處理函數(shù)并將兩者關(guān)聯(lián),例如:在需要調(diào)度tasklet時(shí)引用一個(gè)

tasklet_schedule()就能使系統(tǒng)在適當(dāng)?shù)臅r(shí)候進(jìn)行調(diào)度運(yùn)行:Tasklet使用模板Tasklet使用模板(續(xù))底半部機(jī)制工作隊(duì)列下面的代碼用于定義一個(gè)工作隊(duì)列和一個(gè)底半部執(zhí)行函數(shù):初始化這個(gè)工作隊(duì)列并將工作隊(duì)列與處理函數(shù)綁定的函數(shù),如下:調(diào)度工作隊(duì)列執(zhí)行的函數(shù):底半部機(jī)制軟中斷軟中斷是用軟件方式模擬硬件中斷的概念在Linux內(nèi)核中,用softirq_action結(jié)構(gòu)體表征一個(gè)軟中斷,這個(gè)結(jié)構(gòu)體中包含軟中斷函數(shù)指針和傳遞給該函數(shù)的參數(shù)。使用open_softirq()函數(shù)可以注冊(cè)軟中斷對(duì)應(yīng)的處理函數(shù),而raise_softirq()函數(shù)可以觸發(fā)一個(gè)軟中斷。Time_list該結(jié)構(gòu)體的一個(gè)實(shí)例對(duì)應(yīng)一個(gè)定時(shí)器。初始化定時(shí)器增加定時(shí)器刪除定時(shí)器修改定時(shí)器的expire短延遲Linux內(nèi)核提供了三個(gè)函數(shù)分別進(jìn)行納秒、微秒和毫秒延遲:有時(shí)候,可以在軟件中進(jìn)行這樣的延遲:對(duì)于毫秒級(jí)以上延時(shí),內(nèi)核提供了下列函數(shù):長(zhǎng)延遲內(nèi)核中進(jìn)行延遲的一個(gè)很直觀的方法是比較當(dāng)前的jiffies和目標(biāo)jiffies,直到未來(lái)的jiffie達(dá)到目標(biāo)jiffies。睡著延遲這是比忙等待更好的方式,隨著延遲在等待的時(shí)間到來(lái)之前進(jìn)程處于睡眠狀態(tài),CPU資源被其他進(jìn)程使用。中斷與時(shí)鐘按鍵中斷驅(qū)動(dòng)程序?qū)嵗齋3C2410的中斷控制器可以接收56路中斷源的輸入。這些中斷源由如DMA控制器、UART、IIC或其他內(nèi)部外圍設(shè)備提供的。它支持兩種中斷模式:FIQ和IRQ。每個(gè)中斷源都可以決定中斷請(qǐng)求時(shí)使用哪種模式。當(dāng)從內(nèi)部外圍設(shè)備或外部中斷引腳接收到多個(gè)中斷請(qǐng)求時(shí),在經(jīng)過(guò)中斷裁決后,中斷控制器就向ARM920T內(nèi)核請(qǐng)求FIQ或者IRQ中斷。仲裁過(guò)程依賴(lài)于硬件優(yōu)先級(jí)邏輯,其結(jié)果寫(xiě)入中斷待決寄存器,通過(guò)查詢(xún)它,用戶(hù)可以知道在各路中斷源中產(chǎn)生的是哪路中斷。中斷控制器處理的過(guò)程和優(yōu)先級(jí)裁決邏輯:中斷控制器的控制原理如圖:源待決寄存器SRCPND中斷源發(fā)出的所有的中斷請(qǐng)求首先都要在源待決寄存器中注冊(cè)。它是32位的寄存器,如果中斷源產(chǎn)生了中斷請(qǐng)求,那么相應(yīng)位設(shè)為1,等待中斷服務(wù)。中斷模式寄存器INTMOD它是32位的寄存器,如果某位設(shè)置成1,那么相應(yīng)的中斷源就以FIQ方式處理,否則以IRQ模式處理。中斷掩碼寄存器INTMASK它是32位的寄存器,位模式和SRCPND相同。當(dāng)某一位設(shè)置為1時(shí),即使此時(shí)SRCPND中相應(yīng)位是1,CPU也不會(huì)處理相應(yīng)位的中斷源的請(qǐng)求。優(yōu)先級(jí)寄存器PRIORITY它是20位的寄存器。中斷待決寄存器INTPND它是32位的寄存器,每一位表明相應(yīng)的中斷請(qǐng)求是否有最高優(yōu)先級(jí)。它在優(yōu)先級(jí)邏輯之后,所以只能有一位被設(shè)置,該位向CPU產(chǎn)生IRQ請(qǐng)求。鍵盤(pán)中斷處理的整個(gè)流程:鍵盤(pán)驅(qū)動(dòng)程序的頭文件和宏定義:#include

<linux/config.h>#include

<linux/kernel.h>#include

<linux/timer.h>#include

<linux/sched.h>#include

<linux/module.h>#include

<linux/init.h>#include

<asm/hardware.h>鍵盤(pán)驅(qū)動(dòng)程序的file_operations結(jié)構(gòu):按鍵驅(qū)動(dòng)程序的讀寫(xiě)函數(shù):按鍵驅(qū)動(dòng)程序的ioctl函數(shù):按鍵驅(qū)動(dòng)程序的open、realse函數(shù):按鍵驅(qū)動(dòng)程序的中斷處理函數(shù):按鍵驅(qū)動(dòng)程序的init、exit函數(shù):這個(gè)程序不需要測(cè)試程序,因?yàn)橹袛嗍莻€(gè)異步的外部事件,要求每到發(fā)生的時(shí)候,系統(tǒng)都需要響應(yīng),所以,不需要測(cè)試程序,系統(tǒng)也會(huì)自動(dòng)響應(yīng)中斷。測(cè)試結(jié)果:中斷響應(yīng)流程如圖:嵌入式Linux系統(tǒng)下中斷請(qǐng)求的處理過(guò)程:上圖中,中斷流程中關(guān)鍵的部分是中斷向量表,為了使解析程序能找到向量表,向量表的地址是固定的。這樣,執(zhí)行這個(gè)跳轉(zhuǎn)流程的所有程序地址都是固定的,當(dāng)中斷觸發(fā)以后,就能夠自動(dòng)運(yùn)行;只有向量表的內(nèi)容是可變,用戶(hù)只要在向量表中填入正確的目標(biāo)值就可以了。中斷向量表一般要位于0地址處。圖為一次FIQ跳轉(zhuǎn)的流程,假定用戶(hù)中斷向量表定義在地址

0X00010000開(kāi)始的地方。ARM系統(tǒng)的中斷有7種模式:復(fù)位未定義指令軟件中斷指令預(yù)取中止數(shù)據(jù)中止IRQFIQ一個(gè)嵌入式系統(tǒng)一般有多個(gè)中斷請(qǐng)求源。當(dāng)多個(gè)中斷源同時(shí)請(qǐng)求中斷時(shí),就會(huì)存在

CPU應(yīng)該優(yōu)先響應(yīng)哪個(gè)中斷請(qǐng)求源的問(wèn)題,如果處理不當(dāng)將會(huì)引起混亂,導(dǎo)致系統(tǒng)不能正常工作。通常解決這個(gè)問(wèn)題的方法是根據(jù)中斷源事件的輕重緩急規(guī)定中斷源的優(yōu)先級(jí),CPU優(yōu)先響應(yīng)優(yōu)先級(jí)高的中斷源請(qǐng)求。當(dāng)CPU正在處理一個(gè)中斷請(qǐng)求時(shí),又發(fā)生了另外的中斷請(qǐng)求,如果CPU能暫時(shí)中止對(duì)目前中斷的處理,轉(zhuǎn)去處理優(yōu)先級(jí)更高的中斷請(qǐng)求,待處理完以后,再繼續(xù)處理原來(lái)的中斷事件,這樣的過(guò)程稱(chēng)為中斷嵌套,這樣的中斷系統(tǒng)稱(chēng)為多級(jí)中斷系統(tǒng)。而沒(méi)有中斷嵌套功能的系統(tǒng)稱(chēng)為單級(jí)中斷系統(tǒng)。在實(shí)際應(yīng)用中,中斷源的數(shù)量可能有幾十個(gè),這樣嵌入式系統(tǒng)處理器的中斷接口是遠(yuǎn)遠(yuǎn)不夠的。為了解決這個(gè)問(wèn)題,通常采用添加中斷控制器的方法。例如S3C2410的中斷控制器可以接收56路中斷源的輸

入。這些中斷源由如DMA控制器、UART、IIC或其他內(nèi)部外圍設(shè)備提供的。它支持兩種中斷模式:FIQ和IRQ。每個(gè)中斷源都可以決定中斷請(qǐng)求時(shí)使用哪種模式。當(dāng)從內(nèi)部外圍設(shè)備或外部中斷引腳接收到多個(gè)中斷請(qǐng)求時(shí),在經(jīng)過(guò)中斷裁決后,中斷控制器就向ARM920T內(nèi)核請(qǐng)求FIQ或者IRQ中斷。仲裁過(guò)程依賴(lài)于硬件優(yōu)先級(jí)邏輯,其結(jié)果寫(xiě)入中斷待決寄存器,通過(guò)查詢(xún)它,用戶(hù)可以知道在各路中斷源中產(chǎn)生的是哪路中斷。多個(gè)設(shè)備共享一根硬件中斷線的情況在實(shí)際的硬件系統(tǒng)中廣泛存在。Linux2.6支持這種中斷共享。下面是中斷共享的使用方法:共享中斷的多個(gè)設(shè)備在申請(qǐng)中斷時(shí)都

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論