2012-10-07 31 views
2

我發現這個教程的hrtimer: http://www.ibm.com/developerworks/linux/library/l-timers-list/如何在softirq上下文中運行hrtimer處理程序?

我相信它使用運行在hardirq上下文中的回調處理程序的方式,對不對?但它也說:「一個有趣的方面是定義回調函數的執行上下文的能力(如在軟中斷或hardiirq上下文)

我已經檢查了hrtimer.h文件,但它真的不是那麼直觀。有誰知道如何在softirq上下文中運行它?難道在hardirq中運行它嗎?

感謝,

回答

3

此信息是關於舊的核心 - 在最近發佈的這一功能已被刪除,以減少代碼的複雜性,並避免錯誤。現在hrtimer總是在帶有禁用IRQ的hardirq上下文中運行。

一種可能的方法是使用一個tasklet_hrtimer

#include <linux/interrupt.h> 

struct tasklet_hrtimer mytimer; 

enum hrtimer_restart callback(struct hrtimer *t) { 
    struct tasklet_hrtimer *mytime=container_of(t,struct tasklet_hrtimer,timer); 

    ... 
} 

... 
tasklet_hrtimer_init(&mytimer,callback,clock,mode); 
tasklet_hrtimer_start(&mytimer,time,mode); 
... 

在上述例子中,你應該用適當的值替換clockmodetime

如果您想要將數據傳遞到您的回調函數,那麼您必須將tasklet_hrtimer變量嵌入到您的某個結構中,並使用container_of技巧來獲取您的數據。

不是很明顯,你的結構將包含一個tasklet_hrtimer,它將包含一個hrtimer結構。當你得到一個指向最內層元素的指針,並且你知道它有一個從父元素的固定偏移量時,你可以到達父元素。

相關問題