在Linux kernel-5.11中内核对定时器的定义:
#include/linux/timer.h
struct timer_list {
struct hlist_node entry; //定时器的链表
unsigned long expires; //以节拍为单位的定时时间,表示为定时器触发的到期时间
void (*function)(struct timer_list *); //该指针指向定时器处理函数,参数为struct timer_list类型指针
u32 flags;
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
二、使用方法
1) 定义定时器: struct timer_list my_timer
2)初始化定时器:timer_setup()在内核中被定义成一个宏,参数说明如下所示。
#define timer_setup(timer, callback, flags) __init_timer((timer), (callback), (flags))
3)修改定时器的延时时间并把定时器添加进内核:mod_timer() 内核原型为:
//path:/kernel/time/time.c
//需要传入两个参数
int mod_timer(struct timer_list *timer, unsigned long expires)
{
return __mod_timer(timer, expires, 0);
}
EXPORT_SYMBOL(mod_timer);
//同时也可以使用add_timer往内核中添加定时器,这个函数要求先对timer_list结构expires成员进行初始化
void add_timer(struct timer_list *timer)
{
BUG_ON(timer_pending(timer));
mod_timer(timer, timer->expires);
}
EXPORT_SYMBOL(add_timer);
4)删除定时器:如果需要在定时器到期之前停止定时器,则可以使用该函数,若是定时器已经过期则不需调用该函数,因为它们会自动删除 del_timer(&my_timer);
三、测试代码注册定时器之后,在timer_callback()修改定时器的延时时间,这个是第一种方式实现,大家可以尝试使用add_timer()方式实现。
#include四、注意事项#include #include #include #include //毫秒 #define TIMEOUT 5000 //定义定时器 struct timer_list mytimer; unsigned int count = 0; //定时器处理函数 mod_timer(&mytimer, jiffies + TIMEOUT); static void timer_callback(struct timer_list *data) { printk("Timer Callback function Called [%d]n", count++); mod_timer(&mytimer, jiffies + msecs_to_jiffies(TIMEOUT)); } //定时器初始化过程 static int __init timer_init(void) { timer_setup(&mytimer, timer_callback, 0); mod_timer(&mytimer, jiffies + msecs_to_jiffies(TIMEOUT)); return 0; } static void __exit timer_exit(void) { del_timer(&mytimer); } module_init(timer_init); module_exit(timer_exit); MODULE_AUTHOR("curtis"); MODULE_LICENSE("GPL");
-
没有 current 指针、不允许访问用户空间。因为没有进程上下文,相关代码和被中断的进程没有任何联系。
-
不能执行休眠(或可能引起休眠的函数)和调度。
-
任何被访问的数据结构都应该针对并发访问进行保护,以防止竞争条件。



