2

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

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

我检查了 hrtimer.h 文件,但它真的不是那么直观。有谁知道如何在 softirq 上下文中运行它?在hardirq中运行它是否相似?

谢谢,

4

1 回答 1

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 技巧来获取您的数据。

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

于 2013-05-14T21:40:00.153 回答