init_timer_deferrable函数功能描述:函数init_timer_deferrable( )初始化struct timer_list变量,将此结构体变量存储的定时器插入到系统内核定时器模块中,并确定由哪个CPU处理及指定定时器类型为TIMER_DEFERRABLE。
函数init_timer_deferrable( )在实现过程中调用了函数__init_timer( ),完成struct timer_list结构体变量的初始化工作。
init_timer_deferrable文件包含
#include<linux/timer.h>
init_timer_deferrable函数定义
在内核源码中的位置:linux-3.19.3/include/linux/timer.h
函数定义格式:
#define init_timer_deferrable(timer)
__init_timer((timer), TIMER_DEFERRABLE)
init_timer_deferrable输入参数说明
- 此函数的第一个输入参数是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 //定时器模式掩码
init_timer_deferrable返回参数说明
- 此函数的返回值是void类型的变量,即函数不返回任何结果。
init_timer_deferrable实例解析
编写测试文件: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
所示结果。
如果将函数timer_init( )中的语句“init_timer_deferrable(&my_timer); ”替换为“init_timer(&my_timer); ”,重新加载模块,卸载模块,输入命令dmesg -c会出现如图B
所示的结果。
结果分析:
由图A
和图B
结果可看出经过函数init_timer_deferrable( )处理之后的定时器变量的base字段的最后一个bit的值为1,说明此定时器是可推迟执行的,而由图B
可以看出经过函数init_timer( )处理之后的定时器变量的base字段的最后一个bit的值为0,说明此定时器是不可推迟执行的,利用这两个函数可以完成定时器的可推迟及不可推迟的构造,可以认为函数init_timer_deferrable( )和函数init_timer( )互相补充。