函数:setup_timer_on_stack( )
函数setup_timer_on_stack( )用于初始化struct timer_list类型的变量,将此结构体变量存储的定时器插入到系统内核定时器模块中,并确定由哪个CPU处理。字段base用相应CPU的base赋值,字段entry的next用NULL赋值,并初始化自旋锁为打开状态。
文件包含:
#include<linux/timer.h>
函数定义:
在内核源码中的位置:linux-3.19.3/include/linux/timer.h
函数定义格式:
#define setup_timer_on_stack(timer, fn, data) \
__setup_timer_on_stack((timer), (fn), (data), 0)
函数__setup_timer_on_stack( )的定义见文件linux-3.19.3/include/linux/timer.h。
函数setup_timer_on_stack( )在实现过程中调用了函数__setup_timer_on_stack( ),实现对struct timer_list类型变量的初始化。函数__setup_timer_on_stack( )先调用函数__init_timer_on_stack( )实现结构体部分字段的初始化工作,然后给字段function和字段data赋值。
输入参数说明:
- 第一个参数是struct timer_list类型的变量,此变量用于存放动态定时器。其定义及详细解释参考add_timer( )分析文档的输入参数说明部分。
-
第二个参数是定时器到期时将要执行的函数,用于给定时器变量的function字段赋值。
-
第三个参数用于给定时器变量的data字段赋值。
返回参数说明:
此函数没有返回值。
实例解析:
编写测试文件:setup_timer_on_stack.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_timer1 is :%ld\n", mytimer->expires);
// 显示expires字段的值
}
定时器初始化、模块加载函数:
int __init setup_timer_on_stack_init(void)
{
printk("my_timer will be created.\n");
printk("the jiffies is :%ld\n", jiffies); //显示当前的节拍数
my_timer.expires = jiffies + 1*HZ; //HZ=250,初始化expires字段
// 调用函数对定时器变量进行初始化
setup_timer_on_stack(&my_timer, my_timer_function, &my_timer);
add_timer(&my_timer); //将定时器变量加入到合适的链表
printk("my_timer init.\n");
return 0;
}
模块退出函数:
void __exit setup_timer_on_stack_exit(void)
{
printk("Goodbye setup_timer_on_stack\n");
del_timer(&my_timer); //删除定时器变量
}
模块加载函数退出函数调用:
module_init(setup_timer_on_stack_init);
module_exit(setup_timer_on_stack_exit);
实例运行结果及分析:
执行命令insmod setup_timer_on_stack.ko插入模块,然后输入命令dmesg -c查看系统输出信息,出现如图所示结果。
结果分析:
由两次输出结果4296078431可以判定,当定时器到期时定时器到期处理函数被正常调用执行,由此可知函数setup_timer_on_stack( )能够完成定时器变量的初始化。
函数比较:
函数setup_timer_on_stack( )和函数init_timer_on_stack( )的作用基本相同,都能实现对struct timer_list类型结构体变量的初始化工作,只是函数setup_timer_on_stack( )增加了给定时器字段function和字段data赋值的操作,而init_timer_on_stack( )没有此操作,所以函数setup_timer_on_stack( )比函数init_timer_on_stack( )作用要强一些。
酷客网相关文章:
评论前必须登录!
注册