日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

中断的上下半部

發(fā)布時(shí)間:2023/12/20 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中断的上下半部 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以下內(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é)

以上是生活随笔為你收集整理的中断的上下半部的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。