炫意html5
最早CSS3和HTML5移动技术网站之一

定时机制 – Linux内核API mod_timer

mod_timer函数功能描述:函数mod_timer( )主要用于更改动态定时器的到期时间,从而可更改定时器的执行顺序,相当于执行如下代码序列:

del_timer(timer);
timer->expires=expires;
add_timer(timer);

mod_timer( )可能会更改动态定时器的base字段,改变动态定时器的到期处理函数的执行CPU。

mod_timer文件包含

#include<linux/timer.h>

mod_timer函数定义

在内核源码中的位置:linux-3.19.3/kernel/time/timer.c

函数格式定义:

int mod_timer(struct timer_list *timer, unsigned long expires)

mod_timer输入参数说明

  • 第一个输入参数是struct timer_list类型的变量,用于存放动态定时器,其定义及详细信息参考add_timer( )分析文档的输入参数说明部分。
  • 第二个参数是传入的新的定时器到期节拍数,把此参数赋给定时器的字段expires。

mod_timer返回参数说明

此函数的返回值是整型,可能的取值是0、1,返回0说明此定时器处于活动状态或已被删除,如果定时器没有被删除,则更改失败,如果定时器处于活动状态,则更改定时器到期时间成功;返回1说明此定时器处于激活状态,还未到期,能够成功更改其到期时间。

mod_timer实例解析

编写测试文件:mod_timer.c

头文件及全局变量声明:

#include <linux/module.h>
#include<linux/timer.h>
MODULE_LICENSE("GPL");
struct timer_list my_timer1; //自定义动态定时器,全局变量

自定义定时器函数:

// 自定义动态定时器到期处理函数,此函数在此只有显示功能,不做任何处理
void my_timer1_function(unsigned long data)
{
printk("In the my_timer1_function\n");
struct timer_list *mytimer = (struct timer_list *)data;
printk("the current jiffies is:%ld\n", jiffies);                 //显示当前节拍数
// 显示动态定时器的到期节拍数
printk("the expires of my_timer1 is:%ld\n", mytimer->expires);
// 重新设定动态定时器到期节拍数
int result1=mod_timer(&my_timer1, my_timer1.expires+10);
printk("the mod result of my_timer1 is: %d\n", result1);         //显示函数调用结果
// 显示动态定时器更新之后的到期节拍数
printk("the new expires of my_timer1 is: %ld\n", my_timer1.expires);
// 显示动态定时器的base字段
printk("the new base of my_timer1 is: %u\n", (unsigned int) my_timer1.base);
del_timer(&my_timer1);                                           //删除定时器变量
}

定时器模块初始化函数:

int __init mod_timer_init(void)
{
printk("my_timer1 will be created.\n");
printk("the current jiffies is :%ld\n", jiffies);       //显示当前节拍数
init_timer(&my_timer1);                                 //初始化动态定时器
my_timer1.expires = jiffies + 1*HZ;                    //初始化字段expires, HZ=250
my_timer1.data = &my_timer1;                            //初始化字段data
my_timer1.function = my_timer1_function;                //初始化字段function
add_timer(&my_timer1);                                  //激活动态定时器
// 显示字段expires的值
printk("the expires of my_timer1 after function add_timer( ) is:%ld\n",my_timer1.expires);
// 显示字段base的值
printk("the base of my_timer1 after function add_timer( ) is:%u\n", (unsigned int)my_timer1.base);
// 重新设定动态定时器到期节拍数
int result1=mod_timer(&my_timer1, my_timer1.expires+10);
printk("the mod result of my_timer1 is: %d\n", result1);    //显示函数调用结果
// 显示动态定时器更新之后的到期节拍数
printk("the new expires of my_timer1 is: %ld\n", my_timer1.expires);
// 显示动态定时器的base字段
printk("the new base of my_timer1 is: %u\n", (unsigned int)my_timer1.base);
printk("my_timer1 init.\n");
return 0;
}

定时器模块退出函数:

void __exit mod_timer_exit(void)
{
printk("Goodbye mod_timer\n");
del_timer(&my_timer1); //删除定时器变量
}

模块初始化及退出函数调用:

module_init(mod_timer_init);
module_exit(mod_timer_exit);

实例运行结果及分析:

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

Linux内核API mod_timer

结果分析:

由结果可以看出第一次函数调用之后动态定时器的expires字段的值发生了变化,函数调用的返回结果是1,说明函数调用时动态定时器处于非活动状态,函数调用前后base字段的值没有发生变化,但base字段的值是有可能发生变化的;第二次函数调用之后动态定时器的expires字段的值发生了变化,函数的返回结果是0,返回结果与此时定时器处于活动状态相符合,base字段的值也没有发生改变。

炫意HTML5 » 定时机制 – Linux内核API mod_timer

Java基础教程Android基础教程