中断的上下半部
以下內(nèi)容源于朱有鵬《物聯(lián)網(wǎng)大講堂》課程的學(xué)習(xí),如有侵權(quán),請(qǐng)告知?jiǎng)h除。
因?yàn)檩斎腩愒O(shè)備的輸入都是異步事件,因此一般使用中斷來(lái)處理和響應(yīng)。
1、中斷處理的注意點(diǎn)
- 中斷處理程序處于中斷上下文中,不能和用戶空間數(shù)據(jù)交互(不能使用copy_to(from)_usr函數(shù));
- 中斷處理程序不能交出CPU(不能休眠、不能schedule);
- ISR運(yùn)行時(shí)間盡可能短,越長(zhǎng)則系統(tǒng)響應(yīng)特性越差。
2、中斷下半部2種解決方案
當(dāng)中斷處理程序比較長(zhǎng),而又希望優(yōu)良的響應(yīng)特性時(shí),linux內(nèi)核處理中斷的方案是:人為地將處理程序分為兩部分。
(1)為什么要分上半部(top half,又叫頂半部)和下半部(bottom half,又叫底半部)?
- 上半部標(biāo)記中斷,調(diào)度下半部;下半部負(fù)責(zé)真正的操作(如讀取按鍵鍵值、從網(wǎng)卡讀取緩沖數(shù)據(jù)等)。
(2)下半部處理策略1:tasklet(小任務(wù))
- 引入tasklet,最主要的是考慮支持SMP,提高SMP多個(gè)cpu的利用率;不同的tasklet可以在不同的cpu上運(yùn)行。但是tasklet屬于中斷上下文,因此不能被阻塞,不能睡眠,不可被打斷。?
(3)下半部處理策略2:workqueue(工作隊(duì)列)
- workqueue的突出特點(diǎn)是下半部會(huì)交給worker thead,因此下半部處于進(jìn)程上下文,可以被重新調(diào)度,可以阻塞,也可以睡眠。
- workqueue的初始化方式有靜態(tài)和動(dòng)態(tài)兩種。?
- 靜態(tài)初始化:調(diào)用宏DECLARE_WORK,初始化一個(gè)中斷的上半部,然后在中斷上半部調(diào)用schedule_work()啟動(dòng)我們的中斷下半部?
- 動(dòng)態(tài)初始化:調(diào)用宏 INIT_WORK,初始化一個(gè)中斷的上半部,然后在中斷上半部調(diào)用queue_work()啟動(dòng)我們的中斷下半部?
3、tasklet使用實(shí)戰(zhàn)
(1)tasklet相關(guān)接口介紹
(2)實(shí)戰(zhàn)演示tasklet實(shí)現(xiàn)下半部
原程序:
static irqreturn_t button_interrupt(int irq, void *dummy) { int flag;s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0)); // input模式flag = gpio_get_value(S5PV210_GPH0(2));s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0f)); // eint2模式input_report_key(button_dev, KEY_LEFT, !flag);input_sync(button_dev);return IRQ_HANDLED; }
使用方案的策略:
4、workqueue實(shí)戰(zhàn)演示
(1)workqueue的突出特點(diǎn)
- 下半部會(huì)交給worker thead,因此下半部處于進(jìn)程上下文,可以被調(diào)度,因此可以睡眠。
(2)include/linux/workqueue.h
5、中斷上下半部處理原則
(1)必須立即進(jìn)行緊急處理的極少量任務(wù)放入在中斷的頂半部中
- 此時(shí)屏蔽了與自己同類型的中斷,由于任務(wù)量少,所以可以迅速不受打擾地處理完緊急任務(wù)(除非優(yōu)先級(jí)比自己高,被搶占了)。
(2)需要較少時(shí)間的中等數(shù)量的急迫任務(wù)放在tasklet中
- 此時(shí)不會(huì)屏蔽任何中斷(包括與自己的頂半部同類型的中斷),所以不影響頂半部對(duì)緊急事務(wù)的處理;
- 同時(shí)又不會(huì)進(jìn)行用戶進(jìn)程調(diào)度,從而保證了自己急迫任務(wù)得以迅速完成。
(3)需要較多時(shí)間且并不急迫(允許被操作系統(tǒng)剝奪運(yùn)行權(quán))的大量任務(wù)放在workqueue中
- 此時(shí)操作系統(tǒng)會(huì)盡量快速處理完這個(gè)任務(wù),但如果任務(wù)量太大,期間操作系統(tǒng)也會(huì)有機(jī)會(huì)調(diào)度別的用戶進(jìn)程運(yùn)行,從而保證不會(huì)因?yàn)檫@個(gè)任務(wù)需要運(yùn)行時(shí)間將其它用戶進(jìn)程無(wú)法進(jìn)行。
(4)可能引起睡眠的任務(wù)放在workqueue中
- 因?yàn)樵趙orkqueue中睡眠是安全的。在需要獲得大量的內(nèi)存時(shí)、在需要獲取信號(hào)量時(shí),在需要執(zhí)行阻塞式的I/O操作時(shí),用workqueue很合適。
總結(jié)
- 上一篇: Unicode 汉字内码表
- 下一篇: Anaconda下载与安装详解