参考资料: 《正点原子Linux驱动教程》 定时器是一个很常用的功能,需要周期性处理的工作都要用到定时器。Linux 内核定时器采用系统时钟来实现,也就是arch timer。Linux 内核使用 timer_list 结构体表示内核定时器,timer_list 定义在文件 include/linux/timer.h 中,定义如下:
struct timer_list { struct list_head entry; unsigned long expires; /* 定时器超时时间,单位是节拍数 */ struct tvec_base *base; void (*function)(unsigned long); /* 定时处理函数 */ unsigned long data; /* 要传递给 function 函数的参数 */ int slack; };要使用内核定时器首先要先定义一个 timer_list 变量,表示定时器,tiemr_list 结构体的expires 成员变量表示超时时间,单位为节拍数。比如需要定义一个周期为 2 秒的定时器,那么这个定时器的超时时间就是 jiffies+(2*HZ),因此 expires=jiffies+(2*HZ)。function 就是定时器超时以后的定时处理函数,我们要做的工作就放到这个函数里面,需要我们编写这个定时处理函数。 timer_list的系列API:
void init_timer(struct timer_list *timer) // 初始化timer_list类型变量 void add_timer(struct timer_list *timer) // 向Linux内核注册定时器 int del_timer(struct timer_list * timer) // 用于删除一个定时器 int mod_timer(struct timer_list *timer, unsigned long expires) // 用于修改定时值测试demo:
#include <linux/module.h> #include <linux/kernel.h> #include <linux/timer.h> static struct timer_list my_timer; static void my_timer_callback(struct timer_list *t) { printk("Timer callback function is called!\n"); // 在这里可以执行定时器触发时需要进行的操作 } static int __init timer_demo_init(void) { printk("Initializing timer demo\n"); // 初始化定时器 timer_setup(&my_timer, my_timer_callback, 0); // 设置定时器触发时间为当前时间后的5秒 mod_timer(&my_timer, jiffies + msecs_to_jiffies(5000)); return 0; } static void __exit timer_demo_exit(void) { del_timer(&my_timer); printk("Exiting timer demo\n"); } module_init(timer_demo_init); module_exit(timer_demo_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("lethe1203"); MODULE_DESCRIPTION("timer demo");
标签:定时器,struct,demo,void,list,timer From: https://www.cnblogs.com/lethe1203/p/18095427