linux裝置驅動編寫 tasklet機制

2021-05-09 09:23:31 字數 2700 閱讀 5573

在編寫裝置驅動時,

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的關係如下圖:

上圖可以看出,

ksoftirqd

是乙個後台執行的核心執行緒,它會週期的遍歷軟中斷的向量列表,如果發現哪個軟中斷向量被掛起了(

pend

),就執行對應的處理函式,對於

tasklet來說,此處理函式就是

tasklet_action

,這個處理函式在系統啟動時初始化軟中斷的就掛接了。

tasklet_action

函式,遍歷乙個全域性的

tasklet_vec

鍊錶(此鍊錶對於

smp系統是每個

cpu都有乙個),此煉表中的元素為

tasklet_struct

。此結構如下:

struct tasklet_struct ;

每個結構乙個函式指標,指向你自己定義的函式。當我們要使用

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機制並不複雜,很容易的使程式盡快的響應中斷,避免造成中斷丟失。

編寫Linux裝置驅動

核心版本 2.4.22 閱讀此文的目的 學會編寫linux裝置 驅動。閱讀此文的方法 閱讀以下2個 檔案 hello.c,asdf.c。此文假設讀者 已經能用c語言編寫linux應用程式,理解 字元裝置檔案,塊裝置檔案,主裝置號,次裝置號 會寫簡單的shell指令碼和makefile。1.hello...

linux2 6 裝置驅動編寫

從2.6版本開始引入了platform這個概念,在開發底層驅動程式時,首先要確認的就是裝置的資源資訊,例如裝置的位址,在2.6核心中將每個裝置的資源用結構platform device來描述,該結構體定義在kernel include linux platform device.h中,struct ...

關於如何編寫linux裝置驅動

關於如何編寫linux裝置驅動 1 首先確定硬體介面使用的匯流排,然後確定要實現的功能,是網絡卡 sensor還是什麼,2 再確定對上層應用暴露的介面,從而選擇子系統,例如iio input子系統等。由於linux只有字元裝置 塊裝置 網路裝置三種裝置,其實iio input子系統都是字元裝置,只是...