linux中斷底半部機制

beachboyy發表於2014-09-04

中斷處理程式

----中斷處理程式ISR是在中斷髮生時被呼叫時用來處理中斷的函式,在中斷執行期間,不能

----執行有可能引起睡眠測操作,不能同使用者空間交換資料,不能呼叫schedule函式,實現

----中斷處理有一個原則,就是儘可能快處理並返回地,但是多數中斷產生時要進行大量的

----耗時處理,為了使中斷處理儘可能短並完成後續大量工作,linux引入了一種底半部機制,

----分為頂半部(top half)和底半部(buttomhalf)。

底半部機制

----Tasklet

----工作佇列

Tasklet和下半部處理

----tasklet將任務延遲到安全時間執行,每個tasklet都和一個函式相關聯,當tasklet執行時,

----該函式就被呼叫,並且tasklet可以排程自己。

Tasklet的實現

----定義一個處理函式:

----void tasklet_func(unsigned  long);

----定義一個tasklet結構my_tasklet與tasklet_func(data)函式關聯

----struct tasklet_struct  my_tasklet;

----DECLARE_TASKLET(my_tasklet,tasklet_func,data);

----排程tasklet

----tasklet_schedule(&my_tasklet);

工作佇列和下半部處理

----工作佇列使用方法和tasklet非常相似

----定義一個工作佇列:

----struct work_struct  my_wq;

----定義一個處理函式

----void my_wq_func(struct work_struct  *work);

----初始化工作佇列並將其處理函式繫結

----INIT_WORK(&my_wq,my_wq_func);

----排程工作佇列執行

----schedule_work(&my_wq);

Tasklet和工作佇列的區別

----tasklet工作在中斷上下文

----工作佇列工作在程式上下文

----tasklet處理函式中不能睡眠

----工作佇列中允許有睡眠

相關文章