中斷下半部:由於中斷處理力求時間短,所以引出了下半部。
tasklet工作在中斷上下文,處理中不允許休眠,而workqueue工作在程序上下文,這是不同點。
1,softirq: 處理比較快,但是核心級別的機制,需要修改整個核心原始碼,不推薦也不常用
2,tasklet: 內部實現實際呼叫了softirq
3, workqueue: 工作佇列
1,tasklet:
struct tasklet_struct
; a, 初始化
struct tasklet_struct mytasklet;
tasklet_init(struct tasklet_struct * t, void(* func)(unsigned long), unsigned long data)
例子:void key_tasklet_half_irq(unsigned long data)
tasklet_init(&key_dev->mytasklet, key_tasklet_half_irq, 45);
b,在上半部中放入到核心執行緒中--啟動
// 啟動下半步
tasklet_schedule(&key_dev->mytasklet);
c,模組解除安裝的時候:
tasklet_kill(&key_dev->mytasklet);
2,工作佇列和工作
typedef void (*work_func_t)(struct work_struct *work);
struct work_struct ;
a, 初始化
void work_irq_half(struct work_struct *work)
struct work_struct mywork;
init_work(struct work_struct *work, work_func_t func);
b, 在上半部中放入到核心執行緒中--啟動
schedule_work(&key_dev->mywork);
筆記 中斷,下半部
先弄清兩個概念,程序上下文和中斷上下文 處理器總處於以下狀態中的一種 核心態,執行於程序上下文,核心代表程序執行於核心空間 核心態,執行於中斷上下文,核心代表硬體執行於核心空間 使用者態,執行於使用者空間。使用者空間的應用程式,通過系統呼叫,進入核心空間。這個時候使用者空間的程序要傳遞很多變數 引數...
中斷的上下半部
因為輸入類裝置的輸入都是非同步事件,因此一般使用中斷來處理和響應。當中斷處理程式比較長,而又希望優良的響應特性時,linux核心處理中斷的方案是 人為地將處理程式分為兩部分。1 為什麼要分上半部 top half,又叫頂半部 和下半部 bottom half,又叫底半部 2 下半部處理策略1 tas...
中斷下半部的妙用
中斷下半部 中斷處理程式是核心中很重要的一部分,但是由於本身存在著一些限制,所以他只能完成整個中斷處理程式中的上半部分。具體侷限如下 中斷處理程式是以非同步方式執行,並且他有可能會打斷其他重要的 甚至有可能是其他的中斷程式 的執行,因此為了避免被打斷的 停止時間過長。中斷處理程式要執行的越快越好 如...