Linux内核 init_timer_deferrable()

函数:init_timer_deferrable( )

文件包含:

#include<linux/timer.h>

函数定义:

在内核源码中的位置:linux-3.19.3/include/linux/timer.h

函数定义格式:

#define init_timer_deferrable(timer)
    __init_timer((timer), TIMER_DEFERRABLE)

函数功能描述:

函数init_timer_deferrable( )初始化struct timer_list变量,将此结构体变量存储的定时器插入到系统内核定时器模块中,并确定由哪个CPU处理及指定定时器类型为TIMER_DEFERRABLE。

函数init_timer_deferrable( )在实现过程中调用了函数__init_timer( ),完成struct timer_list结构体变量的初始化工作。

输入参数说明:

  • 此函数的第一个输入参数是struct timer_list类型的变量,此变量用于存放动态定时器,其定义及详细说明参考函数add_timer( )分析文档的输入参数说明部分。第二个参数指定定时器的类型,可选类型见文件linux-3.19.3/include/linux/timer.h:
#define TIMER_DEFERRABLE 0x1LU //定时器可推迟执行
#define TIMER_IRQSAFE      0x2LU //定时器执行时IRQ禁止
#define TIMER_FLAG_MASK  0x3LU //定时器模式掩码

返回参数说明:

  • 此函数的返回值是void类型的变量,即函数不返回任何结果。

实例解析:

编写测试文件:init_timer_deferrable.c

头文件引用及全局变量声明:

#include<linux/timer.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
struct timer_list my_timer;  //声明定时器全局变量

自定义定时器处理函数:

// 自定义定时器执行函数,在此只有显示的功能,不做任何处理
void my_timer_function(unsigned long data)
{
    printk("In the my_timer_function\n");
    printk("the jiffies is :%ld\n", jiffies);     //显示当前的节拍数
    struct timer_list *mytimer = (struct timer_list *)data;
    printk("the expries of my_timer is :%ld\n", mytimer->expires);
                                                  // 显示定时器变量的expires字段的值

    /*显示函数调用之后的定时器变量的base的值 */
    printk("the value of the base after the init_timer_deferable:%u\n", (unsigned int)mytimer->base);
}

定时器初始化函数,模块加载函数:

int __init init_timer_deferrable_init(void)
{
    printk("my_timer will be created.\n");
    printk("the jiffies is :%ld\n", jiffies);      //显示当前的节拍数
    /*显示函数调用之前的定时器变量的base字段的值*/
    printk("the value of the base before the init_timer_deferable:%u\n",(unsigned int)my_timer.base);
    init_timer_deferrable(&my_timer);              //调用函数初始化定时器变量
    //init_timer(&my_timer);            //可用于替换函数init_timer_deferrable( )

    my_timer.expires = jiffies + 1*HZ;            //HZ=250,设定expires字段的值
    my_timer.data = &my_timer;                     //设定data字段的值
    my_timer.function = my_timer_function;         //设定function字段的值
    add_timer(&my_timer);                          //将定时器变量加入合适的链表
    printk("my_timer init.\n");
    return 0;
}

模块退出函数:

void __exit init_timer_deferrable_exit(void)
{
    printk("Goodbye init_timer_deferrable\n");
    del_timer(&my_timer);            //删除定时器变量
}

调用模块加载及退出函数:

module_init(init_timer_deferrable_init);
module_exit(init_timer_deferrable_exit);

实例运行结果及分析:

执行命令insmod init_timer_deferrable.ko插入模块,然后输入命令dmesg -c查看内核输出信息,出现如图A所示结果。

Linux内核 init_timer_deferrable()

如果将函数timer_init( )中的语句“init_timer_deferrable(&my_timer); ”替换为“init_timer(&my_timer); ”,重新加载模块,卸载模块,输入命令dmesg -c会出现如图B所示的结果。

Linux内核 init_timer_deferrable()

结果分析:

由图A和图B结果可看出经过函数init_timer_deferrable( )处理之后的定时器变量的base字段的最后一个bit的值为1,说明此定时器是可推迟执行的,而由图B可以看出经过函数init_timer( )处理之后的定时器变量的base字段的最后一个bit的值为0,说明此定时器是不可推迟执行的,利用这两个函数可以完成定时器的可推迟及不可推迟的构造,可以认为函数init_timer_deferrable( )和函数init_timer( )互相补充。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!