gpt4 book ai didi

timer - Linux 内核中的 hrtimer 重复任务

转载 作者:行者123 更新时间:2023-12-02 22:09:12 27 4
gpt4 key购买 nike

我的目标是使用 hrtimer 结构在 Linux 内核中创建一个重复任务。我希望它每 500 毫秒重复一次。

但是,我对 hrtimer 在 Linux 内核中的工作方式有点困惑(请参阅 linux/hrtimer.h)。我知道时间已指定,并且回调应返回 HRTIMER_RESTARTHRTIMER_NORESTART。我在网上找到了一些资料,指出需要使用 hrtimer_forward 方法在回调中重置计时器。然而,我看到的消息来源对于添加时间是如何工作的有点不清楚。这是我到目前为止的代码:

static struct hrtimer timer;

static enum hrtimer_restart timer_callback(struct hrtimer *timer)
{
printk(KERN_ERR "Callback\n");
//I know something needs to go here to reset the timer
return HRTIMER_RESTART;
}

static int init_timer(void)
{
ktime_t ktime;
unsigned long delay_in_ms = 500L;
printk(KERN_ERR "Timer being set up\n");

ktime = ktime_set(0,delay_in_ms*1E6L);
hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);

timer.function = &timer_callback;
printk(KERN_ERR "Timer starting to fire\n");
printk(KERN_ERR "in %ldms %ld\n", delay_in_ms, jiffies);

hrtimer_start(&timer, ktime, HRTIMER_MODE_REL);
return 0;
}

static void clean_load_balancing_timer(void)
{
int cancelled = hrtimer_cancel(&timer);

if (cancelled)
printk(KERN_ERR "Timer still running\n");
else
printk(KERN_ERR "Timer cancelled\n");
}

有人可以准确解释如何在回调函数中重置计时器吗?谢谢!

最佳答案

如果您查看 kernel/sched.c 函数 sched_rt_period_timer 中第 170 行左右,您将看到一个示例用法。基本线路是

now = hrtimer_cb_get_time(timer);                               
overrun = hrtimer_forward(timer, now, rt_b->rt_period);

现在获取计时器的当前时间作为 ktime_t,rt_b->rt_period 是另一个 ktime_t,指定推进计时器的周期。 hrtimer的过期时间会按周期不断递增,直到大于当前时间。如果经过多次加法才能使过期时间大于当前时间,则返回值将大于 1(表示更多的溢出)。如果计时器过期根本没有提前,它可以为零。

引用:http://lwn.net/Articles/167897/

它使用的 API 来自不同版本的内核,因此一些参数已更改。基本思想还是一样的。

关于timer - Linux 内核中的 hrtimer 重复任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13214197/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com