溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-10-14 15:24:42 來(lái)源:億速云 閱讀:120 作者:柒染 欄目:編程語(yǔ)言

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

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

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

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

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

其他:

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

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

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

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

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

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

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

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

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

  •    對(duì)每個(gè)注冊(cè)的中斷處理程序來(lái)說(shuō),dev_id參數(shù)必須唯一。不能給共享的處理程序傳遞NULL值。

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

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

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

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

以上就是中斷中處理延時(shí)及一些函數(shù)的調(diào)用規(guī)則是什么呢,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI