日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

什么是中斷下半部

當產生一個中斷時,會進入中斷處理程序。

中斷處理程序必須快速、異步、簡單的對硬件做出迅速響應并完成那些時間要求很嚴格的操作。

因此,對于那些其他的、對時間要求相對寬松的任務,就應該推后到中斷被激活以后再去運行

這樣,整個中斷處理流程就被分為了兩個部分

    第一個部分是中斷處理程序(上半部),內核通過對它的異步執行完成對硬件中斷的即時響應。
    中斷處理流程中的另外那一部分,下半部(bottom half)

    下半部的任務主要是執行與中斷相關的工作,這些工作沒有被中斷服務程序本身完成

    下半部并不需要指明一個確切時間,只要把這些任務推遲一點,讓它們在系統不太繁忙并且中斷恢復后執行就可以了。

    上半部和下半部的主要區別

      上半部指的是中斷處理程序下半部則指的是一些雖然與中斷有相關性但是可以延后執行的任務。

      上半部中斷不能被相同類型的中斷打斷,而下半部依然可以被中斷打斷

      通常下半部在中斷處理程序一返回就會馬上運行。

      上半部分簡單快速,執行的時候禁止一些或者全部中斷。

      下半部分稍后執行,而且執行期間可以響應所有的中斷。

      Linux中,對中斷下半部的實現主要有三種:

        軟中斷
        tasklet
        工作隊列

        softirq

        softirq即軟中斷,代碼位于kernel/softirq.c文件中;

        每個軟中斷由softirq_action結構表示:

        softirq.c中定義了一個軟中斷向量數組softirq_vec

        static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;  
            enum  
            {  
               HI_SOFTIRQ=0, /*用于高優先級的tasklet*/  
               TIMER_SOFTIRQ, /*用于定時器的下半部*/  
               NET_TX_SOFTIRQ, /*用于網絡層發包*/  
               NET_RX_SOFTIRQ, /*用于網絡層收報*/  
               BLOCK_SOFTIRQ,  
               BLOCK_IOPOLL_SOFTIRQ,  
               TASKLET_SOFTIRQ, /*用于低優先級的tasklet*/  
               SCHED_SOFTIRQ,  
               HRTIMER_SOFTIRQ,  
               RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */  
               NR_SOFTIRQS  
           };

        登錄后復制

        數組的成員數由NR_SOFTIRQS決定,是一個枚舉常量。

        新增一個軟中斷時,需要在文件include/linux/interrupt.h 中添加一個枚舉常量。

        軟中斷使用的幾個要點

          一個軟中斷不會搶占另外一個軟中斷。
          惟一可以搶占軟中斷的是中斷處理程序。
          其他的軟中斷可以在其他處理器上同時執行。

          相關接口

            注冊軟中斷
            void open_softirq(int nr, void (*action)(struct softirq_action *))

            登錄后復制

            即注冊對應類型的處理函數到全局數組softirq_vec中。

              觸發軟中斷
              void raise_softirq(unsigned int nr)

              登錄后復制

              實際上即以軟中斷類型nr作為偏移量會置位irq_stat[cpu_id]的成員變量__softirq_pending.

              __softirq_pending字段中的每一個bit,對應著某一個軟中斷,某個bit被置位,說明有相應的軟中斷等待處理。

              這也是同一類型軟中斷可以在多個cpu上并行運行的根本原因。

              軟中斷實例

              以一個按鍵驅動的中斷處理為例,將按鍵驅動的中斷處理分成上下兩部分:

                上半部:讀取鍵值,觸發軟中斷
                下半部:喚醒進程

                軟中斷的注冊,在驅動的入口函數,注冊軟中斷:

                添加的枚舉常量:

                可以看到,使用軟中斷是需要修改內核,添加一個枚舉的,有些繁瑣。

                所以,通常我們不建議擅自增加軟中斷的數量,如果需要新的軟中斷,盡可能把它們實現為基于軟中斷的tasklet形式。

                tasklet

                tasklet是利用軟中斷實現的一種下半部機制

                那是用軟中斷還是tasklet好呢?

                選擇到底是用軟中斷還是tasklet其實很簡單:

                  通常你應該用tasklet就像我們在前面看到的,軟中斷資源有限,也麻煩,而且軟中斷的使用者屈指可數。它只在那些執行頻率很高和連續性要求很高的情況下才需要。
                  tasklet卻有更廣泛的用途。大多數情況下用tasklet效果都不錯,而且它們還非常容易使用。
                  因為tasklet是通過軟中斷實現的,所以它們本身也是軟中斷

                  tasklet使用

                  tasklet的使用步驟如下:

                  1、編寫tasklet處理函數(下半部

                  void my_tasklet_fun (unsigned long data)

                  登錄后復制

                  2、聲明tasklet

                  //靜態 
                  DECLARE_TASKLET(my_tasklet,my_tasklet_fun,data); 
                  //動態
                  Struct  tasklet_struct xxx;
                  tasklet_init(&xxx,tasklet_handler,dev)

                  登錄后復制

                  3、調度 tasklet

                  tasklet_schedule(&my_tasklet);

                  登錄后復制

                  登記my_tasklet, 然后允許系統在合適的時間調度它。

                  tasklet實例

                  以按鍵中斷驅動為例:

                  先使用DECLARE_TASKLET靜態聲明一個tasklet,指定其下半部函數為btn_tasklet_func,在中斷服務函數(上半部)獲取按鍵值后,調用tasklet_schedule調度。

                  work queue

                  work queue工作隊列,也是中斷下半部的一種。

                  Work queue將下半部工作推遲給一個內核線程去執行 ——work 總是運行于進程上下文.

                  兩個要點

                    如果推遲的工作需要睡眠,則使用work queues。否則使用softirqtasklets.
                    Work queues適用于需要分配大量的內存,獲得一個信號量,或者執行阻塞的I/O的情況.

                    工作隊列的相關接口函數:

                    在使用上,工作隊列tasklet是類似的:

以上就是Linux驅動中斷下半部的三種方法的詳細內容,更多請關注www.92cms.cn其它相關文章!

分享到:
標簽:三種 中斷 半部 方法 驅動
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定