• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            linux設備驅動編寫_tasklet機制

            在編寫設備驅動時, tasklet 機制是一種比較常見的機制,通常用于減少中斷處理的時間,將本應該是在中斷服務程序中完成的任務轉化成軟中斷完成。

            為了最大程度的避免中斷處理時間過長而導致中斷丟失,有時候我們需要把一些在中斷處理中不是非常緊急的任務放在后面執行,而讓中斷處理程序盡快返回。在老版本的 linux 中通常將中斷處理分為 top half handler 、 bottom half handler 。利用 top half handler 處理中斷必須處理的任務,而 bottom half handler 處理不是太緊急的任務。

            但是 linux2.6 以后的 linux 采取了另外一種機制,就是軟中斷來代替 bottom half handler 的處理。而 tasklet 機制正是利用軟中斷來完成對驅動 bottom half 的處理。 Linux2.6 中軟中斷通常只有固定的幾種: HI_SOFTIRQ( 高優先級的 tasklet ,一種特殊的 tasklet) 、 TIMER_SOFTIRQ (定時器)、 NET_TX_SOFTIRQ (網口發送)、 NET_RX_SOFTIRQ (網口接收) BLOCK_SOFTIRQ (塊設備)、 TASKLET_SOFTIRQ (普通 tasklet )。當然也可以通過直接修改內核自己加入自己的軟中斷,但是一般來說這是不合理的,軟中斷的優先級比較高,如果不是在內核處理頻繁的任務不建議使用。通常驅動用戶使用 tasklet 足夠了。

            軟中斷和 tasklet 的關系如下圖:

            ?tasklet.JPG
            ???
            ???上圖可以看出,
            ksoftirqd 是一個后臺運行的內核線程,它會周期的遍歷軟中斷的向量列表,如果發現哪個軟中斷向量被掛起了( pend ),就執行對應的處理函數,對于 tasklet 來說,此處理函數就是 tasklet_action ,這個處理函數在系統啟動時初始化軟中斷的就掛接了。

            Tasklet_action 函數,遍歷一個全局的 tasklet_vec 鏈表(此鏈表對于 SMP 系統是每個 CPU 都有一個),此鏈表中的元素為 tasklet_struct 。此結構如下 :

            struct tasklet_struct

            {

            ?????? struct tasklet_struct *next;

            ?????? unsigned long state;

            ?????? atomic_t count;

            ?????? void (*func)(unsigned long);

            ?????? unsigned long data;

            };

            每個結構一個函數指針,指向你自己定義的函數。當我們要使用 tasklet ,首先新定義一個 tasklet_struct 結構,并初始化好要執行函數指針,然后將它掛接到 task_vec 鏈表中,并發一個軟中斷就可以等著被執行了。

            原理大概如此,對于 linux 驅動的作者其實不需要關心這些,關鍵是我們如何去使用 tasklet 這種機制。

            Linux 中提供了如下接口:

            DECLARE_TASKLET(name,function,data) :此接口初始化一個 tasklet ;其中 name tasklet 的名字, function 是執行 tasklet 的函數; data unsigned long 類型的 function 參數。

            static inline void tasklet_schedule(struct tasklet_struct *t) :此接口將定義后的 tasklet 掛接到 cpu tasklet_vec 鏈表,具體是哪個 cpu tasklet_vec 鏈表,是根據當前線程是運行在哪個 cpu 來決定的。此函數不僅會掛接 tasklet ,而且會起一個軟 tasklet 的軟中斷 , 既把 tasklet 對應的中斷向量掛起 (pend)

            兩個工作完成后,基本上可以了, tasklet 機制并不復雜,很容易的使程序盡快的響應中斷,避免造成中斷丟失。

            posted on 2007-02-10 00:18 璞石 閱讀(7365) 評論(4)  編輯 收藏 引用

            評論

            # re: linux設備驅動編寫_tasklet機制 2007-05-16 19:46 zzp840127

            此接口將定義后的 tasklet 掛接到 cpu 的 tasklet_vec 鏈表,具體是哪個 cpu 的 tasklet_vec 鏈表,是根據當前線程是運行在哪個 cpu 來決定的。

            這句話怎么理解?arm9有多個cpu么,  回復  更多評論   

            # re: linux設備驅動編寫_tasklet機制 2007-05-16 19:48 zzp840127

            樓主能不能+我 qq260711627
            我最近在研究這塊,很多不理解,希望不吝賜教   回復  更多評論   

            # re: linux設備驅動編寫_tasklet機制 2007-05-20 01:42 璞石

            不好意思,我一般不上QQ.可以發郵件交流
            對于每個 CPU都有自己的tasklet_vec, 哪個CPU上的進程調用tasklet_schedule函數,此tasklet_vec就將掛接了哪個CPU上的tasklet_vec上
              回復  更多評論   

            # re: linux設備驅動編寫_tasklet機制 2011-09-27 10:28 lilin

            不是所有的驅動都是ARM架構的,更不會都是針對ARM9的!@zzp840127
            @zzp840127
              回復  更多評論   

            <2007年5月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導航

            統計

            公告

            AAAAAAAAAAAAAAAAAAAAAAAAAAAASDFSDFA

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案(7)

            相冊

            linux技術

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲色大成网站www久久九| 色综合久久无码五十路人妻| 99久久亚洲综合精品成人| 久久精品无码一区二区无码| 亚洲精品乱码久久久久久按摩| 久久亚洲春色中文字幕久久久| 久久精品国产亚洲AV嫖农村妇女| 亚洲精品无码久久久久| 热99re久久国超精品首页| 久久久噜噜噜久久| 99久久久精品| 囯产精品久久久久久久久蜜桃| 精品熟女少妇a∨免费久久| 久久天天躁狠狠躁夜夜2020老熟妇| 欧美精品九九99久久在观看| 麻豆精品久久久一区二区| 亚洲AV日韩AV天堂久久| 亚洲精品97久久中文字幕无码| 麻豆亚洲AV永久无码精品久久| 久久人人青草97香蕉| 久久久国产亚洲精品| 欧美日韩精品久久久久| 激情五月综合综合久久69| 日本免费久久久久久久网站| 国产精品久久久久影院色| 青青草国产精品久久久久| 狠狠色丁香婷婷综合久久来来去| 99久久精品国内| 久久亚洲AV永久无码精品| 久久久久波多野结衣高潮| 亚洲AV无码久久精品成人| 久久精品国产免费一区| 久久99亚洲综合精品首页| 亚洲国产成人久久综合一区77| 麻豆一区二区99久久久久| 久久精品国产亚洲av瑜伽| 婷婷伊人久久大香线蕉AV| 精品久久8x国产免费观看| 亚洲国产精品狼友中文久久久| av无码久久久久不卡免费网站 | 久久久久亚洲av无码专区|