此信息是關於舊的核心 - 在最近發佈的這一功能已被刪除,以減少代碼的複雜性,並避免錯誤。現在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);
...
在上述例子中,你應該用適當的值替換clock
,mode
和time
。
如果您想要將數據傳遞到您的回調函數,那麼您必須將tasklet_hrtimer變量嵌入到您的某個結構中,並使用container_of技巧來獲取您的數據。
不是很明顯,你的結構將包含一個tasklet_hrtimer,它將包含一個hrtimer結構。當你得到一個指向最內層元素的指針,並且你知道它有一個從父元素的固定偏移量時,你可以到達父元素。