我找到了关于hrtimer的这个教程: http://www.ibm.com/developerworks/linux/library/l-timers-list/
我相信它使用的方式将在hardirq上下文中运行回调处理程序,对吧?但它也说“一个有趣的方面是定义回调函数的执行上下文的能力(例如在softirq或hardiirq上下文中)”
我已经检查过hrtimer.h文件,但实际上并不那么直观。有谁知道如何在softirq上下文中运行它?在hardirq中运行它是否类似?
谢谢,
答案 0 :(得分: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);
...
在上面的示例中,您应该使用适当的值替换clock
,mode
和time
。
如果要将数据传递给回调,则必须在您的某些结构中嵌入tasklet_hrtimer变量,并使用container_of技巧获取数据。
不太明显,你的struct将包含一个tasklet_hrtimer,它将包含一个hrtimer结构。当你得到一个指向最内层元素的指针,并且你知道它与父元素有一个固定的偏移量时,你就可以到达父元素。