中斷中處理延時及一些函數(shù)的調(diào)用規(guī)則是什么呢

本篇文章給大家分享的是有關(guān)中斷中處理延時及一些函數(shù)的調(diào)用規(guī)則是什么呢,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供婁煩企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為婁煩眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

1,中斷處理程序中不能使用有睡眠功能的函數(shù),如ioremap,kmalloc,msleep等,理由是中斷程序并不是進(jìn)程,沒有進(jìn)程的概念,因此就沒有休眠的概念;

2,中斷處理程序中的延時可以用忙等待函數(shù)來代替,如ndelay,udelay,mdelay等,這些函數(shù)在實現(xiàn)上本質(zhì)是根據(jù)CPU頻率進(jìn)行一定次數(shù)的循環(huán);最好不要使用mdelay,因為毫秒延時對內(nèi)核來說已經(jīng)是非常大了。但是在中斷處理程序中使用msleep卻不行。(見linux設(shè)備驅(qū)動開發(fā)詳解第二版p210頁)

3,printk函數(shù)在中斷處理函數(shù)中可以使用,但是會占用較多時間,降低效率。在調(diào)IIC驅(qū)動的時候,由于IIC讀取寫入處理時必須進(jìn)行一定延時,在我沒有使用udelay的時候,竟然用printk就使IIC中斷正常運行,當(dāng)時在調(diào)試的時候,發(fā)現(xiàn)有些printk加上程序就正常,去掉就不正常,當(dāng)時真是匪夷所思,但現(xiàn)在明白了,因此printk占用時間比較大,正好充當(dāng)了IIC延時的功能。最后我把printk全部去掉,在需要延時的地方加入udelay,才使程序正常運行。

4,使用for和while等的空循環(huán)在中斷處理函數(shù)中進(jìn)行延時操作,在實際測試中發(fā)現(xiàn)并不能起到延時的功能,linux內(nèi)核處理這種循環(huán)速度很快,并沒有延時的效果。這跟裸板程序使用循環(huán)來延時的用法不相同。

其他:

1、中斷是一種電信號,由硬件設(shè)備生成,并直接送入中斷控制器的輸入引腳上。然后再由中斷控制器向處理器發(fā)送相應(yīng)的信號。處理器一經(jīng)檢測到此信號,便中斷自己的當(dāng)前工作轉(zhuǎn)而處理中斷。此后,處理器會通知操作系統(tǒng)已經(jīng)產(chǎn)生中斷,這樣,操作系統(tǒng)就可以對這個中斷進(jìn)行適當(dāng)?shù)奶幚砹恕?/p>

   2、不同的設(shè)備對應(yīng)的中斷不同,而每個中斷都通過一個唯一的數(shù)字標(biāo)識。中斷值通常被稱為中斷請求(IRQ)線。有些中斷值是指定的,有些是動態(tài)分配的。特定的中斷總與特定的設(shè)備相關(guān)聯(lián)。

   3、異常與中斷不同,它在產(chǎn)生時必須考慮與處理器時鐘同步。異常也常常稱為同步中斷。許多處理器體系結(jié)構(gòu)處理異常與中斷的方式類似,因此內(nèi)核對它們的處理也很類似。

   4、在響應(yīng)一個特定中斷的時候,內(nèi)核會執(zhí)行一個函數(shù),該函數(shù)叫做中斷處理程序或中斷服務(wù)例程。產(chǎn)生中斷的每個設(shè)備都有一個相應(yīng)的中斷處理程序,如果一個設(shè)備可以產(chǎn)生多種不同的中斷,那么該設(shè)備就可以對應(yīng)多個中斷處理程序。一個設(shè)備的中斷處理程序是它設(shè)備驅(qū)動程序的一部分。

   5、中斷處理程序與其他內(nèi)核函數(shù)的真正區(qū)別在于:中斷處理程序是被內(nèi)核調(diào)用來響應(yīng)中斷的,而它們運行于我們稱之為中斷上下文的特殊上下文中。

   6、中斷處理一般分為兩個部分,中斷處理程序是上半部-接收到一個中斷就立即執(zhí)行,但只做有嚴(yán)格時限的工作,這些工作都是在所有中斷被禁止的情況下完成的。能夠被允許稍后完成的工作被推遲到下半部去。通常情況下,下半部會在中斷處理程序返回時立即執(zhí)行。

   7、Linux中的中斷處理程序是無需重入的。當(dāng)一個給定的中斷處理程序正在執(zhí)行時,相應(yīng)的中斷線在所有處理器上都會被屏蔽掉,以防止在同一中斷線上接收另一個新的中斷。通常情況下,所有其他的中斷都是打開的,所以這些不同中斷線上的其它中斷都能被處理,但當(dāng)前中斷線總是被禁止的。由此可以看出,同一個中斷處理程序絕對不會被同時調(diào)用以處理嵌套的中斷。

   8、共享的中斷處理程序與非共享的在注冊和運行方式上比較類似,但差異主要有以下三處:

  •    注冊中斷處理程序函數(shù)request_irq()的參數(shù)flags必須設(shè)置SA_SHIRQ標(biāo)志。

  •    對每個注冊的中斷處理程序來說,dev_id參數(shù)必須唯一。不能給共享的處理程序傳遞NULL值。

  •    中斷處理程序必須能夠區(qū)分它的設(shè)備是否真的產(chǎn)生了中斷。否則它根本無法知道是它對應(yīng)的設(shè)備發(fā)出了這個中斷還是共享這條中斷線的其它設(shè)備發(fā)出了這個中斷。

   9、當(dāng)執(zhí)行一個中斷處理程序或下半部時,內(nèi)核處于中斷上下文中。中斷上下文和進(jìn)程并沒有什么瓜葛。因為沒有進(jìn)程的背景,所以中斷上下文不可以睡眠。因此,不能從中斷上下文中調(diào)用某些函數(shù)。如果一個函數(shù)睡眠,就不能在中斷處理函數(shù)中使用它。中斷上下文具有較為嚴(yán)格的時間限制,因為它打斷了其他代碼。中斷上下文中的代碼應(yīng)當(dāng)迅速簡潔,盡量不要使用循環(huán)去處理繁重的工作。盡量把工作從中斷處理程序中分離出來,放在下半部執(zhí)行。中斷處理程序并不具有自己的棧。相反,它共享被中斷進(jìn)程的內(nèi)核棧。如果沒有正在運行的進(jìn)程,就使用idle進(jìn)程的棧。中斷處理程序共享別人的堆棧,所以它在棧中獲取空間時必須非常節(jié)省。內(nèi)核棧本就很有限,所有的內(nèi)核代碼都應(yīng)該謹(jǐn)慎利用它。

   10、Linux內(nèi)核提供了一組接口用于操作機(jī)器上的中斷狀態(tài)。這些接口為我們提供了能夠禁止當(dāng)前處理器的中斷系統(tǒng),或屏蔽掉整個機(jī)器的一條中斷線的能力,這些例程都是與體系結(jié)構(gòu)相關(guān)的,可以在<asm/system.h>和<asm/irq.h>中找到。

   11、控制中斷系統(tǒng)的原因歸根結(jié)底是需要提供同步。通過禁止中斷,可以確保某個中斷處理程序不會搶占當(dāng)前代碼,還可以禁止內(nèi)核搶占。但它們都沒有提供任何保護(hù)機(jī)制來防止來自其他處理器的并發(fā)訪問。鎖提供保護(hù)機(jī)制來防止來自其他處理器的并發(fā)訪問。禁止中斷提供保護(hù)機(jī)制來防止來自其他中斷處理程序的并發(fā)訪問。

以上就是中斷中處理延時及一些函數(shù)的調(diào)用規(guī)則是什么呢,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前標(biāo)題:中斷中處理延時及一些函數(shù)的調(diào)用規(guī)則是什么呢
轉(zhuǎn)載源于:http://muchs.cn/article40/piccho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站定制網(wǎng)站、網(wǎng)站策劃自適應(yīng)網(wǎng)站、服務(wù)器托管、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司