如何在softirq上下文中运行hrtimer处理程序?

时间:2012-10-07 02:34:16

标签: linux timer interrupt

我找到了关于hrtimer的这个教程: http://www.ibm.com/developerworks/linux/library/l-timers-list/

我相信它使用的方式将在hardirq上下文中运行回调处理程序,对吧?但它也说“一个有趣的方面是定义回调函数的执行上下文的能力(例如在softirq或hardiirq上下文中)

我已经检查过hrtimer.h文件,但实际上并不那么直观。有谁知道如何在softirq上下文中运行它?在hardirq中运行它是否类似?

谢谢,

1 个答案:

答案 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);
...

在上面的示例中,您应该使用适当的值替换clockmodetime

如果要将数据传递给回调,则必须在您的某些结构中嵌入tasklet_hrtimer变量,并使用container_of技巧获取数据。

不太明显,你的struct将包含一个tasklet_hrtimer,它将包含一个hrtimer结构。当你得到一个指向最内层元素的指针,并且你知道它与父元素有一个固定的偏移量时,你就可以到达父元素。