關於中斷的buttom half 二

2021-07-04 12:20:24 字數 1583 閱讀 5501

tasklets

tasklets建立在軟中斷上的一種機制,它是一種軟中斷,但又與軟中斷不同,它有自己的特點:

1,可以動態建立和銷毀。

2,在執行時,多次進行排程,此時也只能執行一次,並且排程時總是會讓其在同一處理器上執行,如此可以很好的利用cache。

像程序一樣,tasklet也由乙個結構體來表示:

struct tasklet_struct

;tasklet的狀態如下:

enum

;tasklet有兩種形式的存在,一種是普通的tasklet,另一種是高優先順序的tasklet,它們對應了兩個軟中斷,分別為:tasklet_softirq

和hi_softirq

在核心中定義如下:

static define_per_cpu(struct tasklet_head, tasklet_vec);

static define_per_cpu(struct tasklet_head, tasklet_hi_vec);

這是兩個雙向鍊錶,當某種型別的tasklet將被排程時,會把其掛到對應的鍊錶下。

tasklet排程過程:

void __tasklet_schedule(struct tasklet_struct *t)

如上函式對應的是普通tasklet,還有乙個對應提高優先順序的tasklets(__tasklet_hi_schedule),呼叫過程相似,只是需要觸發hi_softirq軟中斷。

靜態定義tasklet

declare_tasklet(name, func, data)

declare_tasklet_disabled(name, func, data);

動態定義tasklet

void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data)

排程tasklet

void tasklet_schedule(struct tasklet_struct *t)

使能/禁用tasklet

void tasklet_enable(struct tasklet_struct *t)

void tasklet_disable(struct tasklet_struct *t)

void tasklet_disable_nosync(struct tasklet_struct *t)

tasklet_disable和tasklet_disable_nosync區別是如果此時tasklet正在執行,要等到執行結束tasklet_disable才能返回,tasklet_disable_nosync

則不用等待就可返回,它們的區別和中斷中的兩個介面(disable_irq/disable_irq_nosync)相似。

移除tasklet

void tasklet_kill(struct tasklet_struct *t) //等待tasklet執行結束,然後把tasklet從排程佇列中移除。

注意:tasklet_disable和tasklet_kill可能在呼叫時都需要等待,所以在中斷處理函式中不能呼叫。

關於PIC中斷

pic微控制器有多個中斷源,16系列只有乙個中斷入口,18系列有兩個中斷入口,不同編譯器下書寫格式又不大一樣。網上資源千篇一律,也不夠系統,只是簡單的羅列程式,生存的環境不一樣也少有說明。在此做個簡單的總結,因為又走了彎路.1.先說18系列 mcc18編譯器下 mplab c18不自動把中斷服務程式...

關於中斷的簡單理解

大家知道cpu的處理速度很快,但是外部裝置的處理速度就很慢了,為了讓這兩種不同速度的機器相互配合,就產生了中斷。比如 cpu有乙個需求需要把硬碟中的資料讀取到記憶體中,這時硬碟中的資料拷貝到記憶體是乙個比較慢的情況,如果沒有中斷,cpu需要不停的檢查讀完了沒有,但是有了中斷,cpu讀硬碟比較慢就去處...

關於執行緒請求中斷

沒有可以強制終止執行緒的方法,只有請求中斷執行緒的方法 interrupt 當對執行緒使用interrupt方法時,將對執行緒傳送乙個中斷的訊號,每個執行緒都具有乙個boolean標識,標識當前的執行緒是否中斷,所以每個執行緒都應該要持續進行檢查。while thread.currentthread...