定时器使用和延迟执行

本文详细介绍了Linux内核中的定时器使用,包括结构timer_list的定义、初始化、激活与修改,以及如何处理定时器的竞争条件。此外,还讲解了延迟执行的几种方法,如忙等待、short delay函数以及schedule_timeout函数的工作原理和应用场景。
摘要由CSDN通过智能技术生成

1. 定时器

定时器有时也称为动态定时器或内核定时器,是管理内核时间的基础。定时器的使用很简单。你只需要执行一些初始化工作,设置一个超时时间,指定超时发生后执行的函数,然后激活定时器就可以了。

注意,定时器并不是周期运行,它在超时后就自行销毁

 

1.1. 使用定时器

定时器由结构timer_list表示,在<linux/timer.h>中:

struct timer_list{

              struct list_head entry;    /*定时器链表入口*/

              unsigned long expires;    /*jiffies单位的定时值*/

              spin_lock lock;       /*保护定时器的锁/

              void (*func)(unsigned long); /* 定时器处理函数*/

              unsigned long data;        /*参数*/

              struct tvec_t_base_s *base;   /*定时内部值,用户不要使用*/

}

内核提供了一组接口操作定时器,在<linux/timer.h>

创建定时器时需要定义它:

struct timer_list my_timer;

接着需要初始化,初始化必须在使用其他定时器管理函数对定时器操作前完成:

init_timer(&my_timer);

my_timer.expires表示超时时间,它是以节拍为单位的绝对计数值。处理函数必须符合下面的函数原型:

void my_timer_fuc(unsigned long data);

data参数使你可以利用同一个处理函数注册多个定时器,只需要通过参数就能区别对待它们。如果不需要参数,可以简单的传递0(或任何其他值)给处理函数。

最后,必须激活定时器:

add_timer(&my_tiner);

现在,只要节拍计数大于或等于指定的超时时,内核就开始执行定时器处理函数。

内核通过函数mod_timer来实现已经激活的定时器超时时间:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值