内核中的延迟执行机制
- 中断底半部
- 软中断
- tasklet
- workqueue
- timer定时器
在第五讲 Linux内核-中断机制(上)中已经讲述了前4种内核的延时机制,今天讲一讲内核定时器及其应用方法。
3、内核定时器
3.1、初始化定时器
位于``/include/linux/time.h`
struct timer_list{
...
unsigned long expires; //定时时间
struct tvec_base *base;
void(*function)(unsigned long); //指向用户的定时器中断处理函数
unsigned long data;
...
};
/*初始化定时器
eg:定时n秒:expires = jiffies + (n * HZ);
*/
int init_timer(struct timer_list *timer)
DEFINE_TIMER(name, function, expires, data) //定义并初始化一个定时器
void add_timer(struct timer_list *timer); //添加定时器
int del_timer(struct timer_list *timer); //删除定时器
int mod_timer(struct timer_list *timer, unsigned long expires); //修改的定时器定时时间
定时器实例:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/timer.h>
struct timer_list tm; //定时器回调函数
void timer_function(unsigned long args)
{
mod_timer(&tm, jiffies+2*HZ);
printk(KERN_INFO"[%s-%s-%d]:runned...\n",\
__FILE__,__func__,__LINE__);
}
static int __init demo_init(void)
{
//初始化定时器
init_timer(&tm);
tm.expires=jiffies+(2*HZ);
tm.function=timer_function;
//添加定时器
add_timer(&tm);
printk(KERN_DEBUG"[%s-%s-%d]:runned...\n",\
__FILE__,__func__,__LINE__);
return 0;
}
static void __exit demo_exit(void)
{
//删除定时器
del_timer(&tm);
printk(KERN_DEBUG"[%s-%s-%d]:runned...\n",\
__FILE__,__func__,__LINE__);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");
可以看到,每隔2秒,定时器回调函数被执行一次。所以,你可以在初始化函数中定义一个定时器,在中断顶半部添加修改定时器函数mod_timer()
来达到延时或消抖的目的。