【问题标题】:How to run hrtimer handler in softirq context?如何在 softirq 上下文中运行 hrtimer 处理程序?
【发布时间】:2012-10-07 02:34:15
【问题描述】:

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

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

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

谢谢,

【问题讨论】:

    标签: linux timer interrupt


    【解决方案1】:

    此信息与旧内核有关 - 在最近的版本中,此功能已被删除,以降低代码复杂性并避免错误。现在 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 技巧来获取您的数据。

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

    【讨论】:

      猜你喜欢
      • 2016-01-07
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多