gpt4 book ai didi

linux kernel timer - 为什么定时器功能在系统启动后没有立即启动

转载 作者:太空宇宙 更新时间:2023-11-04 09:35:40 25 4
gpt4 key购买 nike

我使用内核定时器来安排一个函数定期运行(一旦定时器被初始化并调用该函数,定时器就会在该函数内重新安排)。它作为我的设备驱动程序内核模块的一部分发生,并且想要的行为是该功能被触发并在系统启动(模块已加载)后直接运行。问题是定时器触发的函数不会在系统启动后立即启动,而是在启动后大约 5 分钟后启动(尽管我可以确认模块已经加载并且代码执行足够早地通过 add_timer) .

这是我对定时器的初始化:

// Allocate memory for the timer
struct timer_list* pTimer = (struct timer_list*)vmalloc(sizeof(struct timer_list));
// step 1: Initialising function for the timer
init_timer(pTimer);
// step 2: set timer fields as needed
pTimer->data = (unsigned long)Data;
pTimer->function = ((void(*)(unsigned long))start_routine);
pTimer->expires = -1; // fire immediately
// step 3: register timer
add_timer(pTimer);

,其中 start_routine 是要运行的函数。然后,在该函数中,我重新安排了计时器:

/* reschedule the timer */
pTimer->expires = jiffies + 1; // fire every 4msec
add_timer(pTimer);

整个系统运行良好,但在系统启动后的最初约 5 分钟内运行不正常。

就像我写的那样,我可以看到代码在系统启动后立即通过计时器初始化部分执行(并调用 add_timer),但由于某种原因,函数 start_routine 在启动后的最初 5 分钟内被阻止。之后,开始按预期调用 start_routine。系统启动后开始调用计时器功能大约延迟 5 分钟的原因可能是什么?

最佳答案

pTimer->expires = -1; // fire immediately

没有具有特殊含义的 jiffies 值。此代码告诉内核在 jiffies 计数器达到值 -1 时运行计时器。在您的机器上,计数器恰好从 -75000 开始,因此值 -1 在启动后 5 分钟达到。

pTimer->expires = jiffies + 1; // fire every 4msec

除非 CONFIG_HZ 设置为 250,否则此注释是错误的。

关于linux kernel timer - 为什么定时器功能在系统启动后没有立即启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26862283/

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