Linux 内核定时器

内核定时器
1.源码位置:
include/linux/timer.h
kernel/timer.c

2.遵守规则:
1) 没有 current 指针、不允许访问用户空间。因为没有进程上下文,相关代码和被中 断的进程没有任何联系。
2) 不能执行休眠(或可能引起休眠的函数)和调度。
3) 任何被访问的数据结构都应该针对并发访问进行保护,以防止竞争条件。
内核定时器的调度函数运行过一次后就不会再被运行了(相当于自动注销),但可以通过在被调度的函数中重新调度自己来周期运行。

3.使用方法:
内核定时器的数据结构
struct timer_list {
struct list_head entry;

unsigned long expires;
void (*function)(unsigned long);
unsigned long data;

struct tvec_base *base;
/* ... */

};
其中 expires 字段表示期望定时器执行的 jiffies 值,到达该 jiffies 值时,将调用 function 函数,并传递 data 作为参数。当一个定时器被注册到内核之后,entry 字段用来连接该定时器到一个内核链表中。base 字段是内核内部实现所用的。
需要注意的是 expires 的值是32位的,因为内核定时器并不适用于长的未来时间点。

在使用 struct timer_list 之前,需要初始化该数据结构,确保所有的字段都被正确地设置。

方法一:
DEFINE_TIMER(timer_name, function_name, expires_value, data);
该宏会静态创建一个名叫 timer_name 内核定时器,并初始化其 function, expires, name 和 base 字段。
方法二:
struct timer_list mytimer;
setup_timer(&mytimer, (function)(unsigned long), unsigned long data);
mytimer.expires = jiffies + 5
HZ;
方法三:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值