timer_list

参考资料:
《正点原子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");

 

 

 
posted @ 2024-03-25 21:35  lethe1203  阅读(45)  评论(0编辑  收藏  举报