資源描述:
《Linux中斷處理驅(qū)動(dòng)程序編寫》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、Linux中斷處理驅(qū)動(dòng)程序編寫中斷處理是操作系統(tǒng)必須具備的上要功能之一,下面我們一起來探討一下Linux中的中斷處理。1.什么是中斷中斷就是CPU正常運(yùn)行期間,由于內(nèi)、外部事件引起的CPU暫時(shí)停止正在運(yùn)行的程序,去執(zhí)行該內(nèi)部事件或外部事件的引起的服務(wù)中去,服務(wù)執(zhí)行完畢后再返回?cái)帱c(diǎn)處繼續(xù)執(zhí)行的情形。這樣的中斷機(jī)制極大的提高了CPU運(yùn)行效率。中斷的分類:1)根據(jù)中斷的來源可分為內(nèi)部中斷和外部中斷,內(nèi)部中斷的中斷源來自于CPU內(nèi)部(軟件中斷指令、溢出、除法錯(cuò)誤等),例如操作系統(tǒng)從用戶態(tài)切換到內(nèi)核態(tài)需要借助CPU內(nèi)部的軟件中斷,外部中斷的中斷源來自于CPU外部,由外設(shè)觸發(fā)。
2、2)根據(jù)中斷是否可以被屏蔽,中斷可分為可屏蔽中斷和不可屏蔽中斷,可屏蔽中斷可以通過設(shè)置中斷控制器寄存器等方法被屏蔽,屏蔽后,該中斷不再得到響應(yīng),而不可屏蔽中斷不能被屏蔽。3)根據(jù)中斷入口跳轉(zhuǎn)方式的不同,中斷可分為向量中斷和非向量中斷。采用向量中斷的CPU通常為不同的中斷分配不同的中斷號(hào),當(dāng)檢測到中斷的中斷號(hào)到來時(shí),就自動(dòng)跳轉(zhuǎn)到該中斷對(duì)應(yīng)的地址處去執(zhí)行程序。不同的中斷號(hào)對(duì)應(yīng)不同的中斷入口地址。非向量中斷的多個(gè)中斷共享一個(gè)入口程序處理入口地址,中斷程序跳轉(zhuǎn)到該入口地址執(zhí)行時(shí),再通過中斷程序來判斷中斷標(biāo)志來識(shí)別具體是哪一個(gè)中斷,也就是說向量中斷由硬件提供中斷服務(wù)程序入口地
3、址,非向量中斷由軟件提供中斷服務(wù)程序入口地址。4)非向量中斷處理流程:廠典型的非向量中斷首先會(huì)判斷中斷源,然后調(diào)用不同中斷源的中斷處理程序*/irq_handler(){???intint_src=read_int_status();/*讀硬件的中斷相關(guān)寄存器*7switch(int_src){〃判斷中斷標(biāo)志caseDEV_A:dev_a_handler();break;caseDEV_B:dev_b_handler();break;???default:break;2?linux中斷頂部.底部概念為保證系統(tǒng)實(shí)時(shí)性,中斷服務(wù)程序必須足夠簡短,但實(shí)際應(yīng)用中某些時(shí)候發(fā)生
4、中斷時(shí)必須處理大量的工作,這時(shí)候如果都在中斷服務(wù)程序中完成,則會(huì)嚴(yán)重降低中斷的實(shí)時(shí)性,基于這個(gè)原因,linux系統(tǒng)提岀了一個(gè)概念:把中斷服務(wù)程序分為兩部分:頂半部、底半部。24頂半部完成盡可能少的比較急的功能,它往往只是簡單的讀取寄存器的中斷狀態(tài),并清除中斷標(biāo)志后就進(jìn)行“中斷標(biāo)記”(也就是把底半部處理程序掛到設(shè)備的底半部執(zhí)行隊(duì)列中)的工作。特點(diǎn)是響應(yīng)速度快。22底半部中斷處理的大部分工作都在底半部,它幾乎做了中斷處理程序的所有事情。特點(diǎn):處理相對(duì)來說不是非常緊急的事件,底半部機(jī)制主要有:tasklet.工作隊(duì)列和軟中斷。Linux中查看/proc/interrupt
5、s文件可以獲得系統(tǒng)中斷的統(tǒng)計(jì)信息:Cpuo0:135253XT^PICtimer1:22XT-PIC180422:0XT-PICcascade8:1XT-PICrtc10:108XT-PICethO11:3707XT-PICBusLogicBT-95812:313XT-PIC1804215:4XT-PICidelNMI:0ERR:03.Linux中斷編程3.1.申請(qǐng)和釋放中斷3.1.1.申請(qǐng)中斷:intrequest_irq(unsignedintirq,irq_handler_thandler,unsignedlongirqflags,constchar*devn
6、ame,void*dev_id);參數(shù)介紹:i「q是要申請(qǐng)的硬件中斷號(hào)。Handler:是向系統(tǒng)登記的中斷處理程序(頂半部),是一個(gè)回調(diào)函數(shù),中斷發(fā)生時(shí),系統(tǒng)調(diào)用它,將devjd參數(shù)傳遞給它。irqflags:是中斷處理的屬性,可以指定中斷的觸發(fā)方式和處理方式:觸發(fā)方式:IRQF_TRIGGER_RISING、IRQF_TRIGGER_FALLING、IRQF_TRIGGER_HIGH、IRQF_TRIGGER_LOW,處理方式:IRQF_DISABLE表明中斷處理程序是快速處理程序,快速處理程序被調(diào)用時(shí)屏蔽所有中斷,IRQF.SHARED表示多個(gè)設(shè)備共享中斷,de
7、vjd在中斷共享時(shí)會(huì)用到,一般設(shè)置為NULL。返回值:為0表示成功,返回-EINVAL表示中斷號(hào)無效返回-EBUSY表示中斷已經(jīng)被占用,且不能共享。頂半部的handler的類型irq_handler_t定義為:typedefirqreturn_t(*irq_handler_t)(int,voicT);typedefintirqreturn_t;3」2釋放IRQ有請(qǐng)求當(dāng)然就有釋放。中斷的釋放函數(shù)為:voidfree_irq(unsignedintirq,void*dev_id);參數(shù)定義與requestjrq類似。3/3中斷的使能和屏蔽voiddisable_ir