init_timer_on_stack函数功能描述:
- 函数init_timer_on_stack( )用于初始化struct timer_list类型的变量,将此结构体变量存储的定时器插入到系统内核定时器模块中,并确定由哪个CPU处理,并初始化自旋锁为打开状态。
- 函数init_timer_on_stack( )在实现过程中调用了函数__init_timer_on_stack( ),完成对struct timer_list结构体变量的初始化工作。
init_timer_on_stack文件包含
#include<linux/timer.h>
init_timer_on_stack函数定义
在内核源码中的位置:linux-3.19.3/include/linux/timer.h
函数定义格式:
#define init_timer_on_stack(timer) \
__init_timer_on_stack((timer), 0)
init_timer_on_stack输入参数说明
- 此函数的输入参数是struct timer_list类型的变量,此变量用于存放动态定时器,其定义及详细解释参考add_timer( )分析文档的输入参数说明部分。
init_timer_on_stack返回参数说明
- 此函数的返回值是void类型的变量,即函数不返回任何结果。
init_timer_on_stack实例解析
编写测试文件:init_timer_on_stack.c
头文件引用及全局变量声明:
#include <linux/module.h>
#include<linux/timer.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字段的值
printk("the base of my_timer is:%u\n", (unsigned int)mytimer->base);
// 显示base字段的值
}
定时器初始化、模块加载函数定义:
int __init init_timer_on_stack_init(void)
{
printk("my_timer will be created.\n");
printk("the jiffies is :%ld\n", jiffies); //显示当前节拍数
init_timer_on_stack(&my_timer); //调用init_timer初始化变量
// HZ=250;初始化字段expires,使其值在当前节拍的基础上增加250个节拍
my_timer.expires = jiffies + 1*HZ;
my_timer.data = &my_timer; //初始化字段data,其值指向变量的地址
my_timer.function = my_timer_function; //初始化字段function,其值是自定义的定时器函数
add_timer(&my_timer); //调用函数add_timer( )将变量插入合适的动态定时器队列
printk("my_timer init.\n");
return 0;
}
模块退出函数定义:
void __exit init_timer_on_stack_exit(void)
{
printk("Goodbye init_timer_on_stack\n");
del_timer(&my_timer); //删除定时器变量
}
模块加载函数及退出函数调用:
module_init(init_timer_on_stack_init);
module_exit(init_timer_on_stack_exit);
实例运行结果及分析:
执行命令insmod init_timer_on_stack.ko插入模块,然后输入命令dmesg -c查看内核输出信息,出现如图所示结果。
结果分析:
由运行结果可知函数init_timer_on_stack( )能够完成定时器变量的初始化。