此信息与旧内核有关 - 在最近的版本中,此功能已被删除,以降低代码复杂性并避免错误。现在 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 结构。当你得到一个指向最内层元素的指针并且你知道它与父元素有一个固定的偏移量时,你可以到达父元素。