Linux内核API mod_timer_pending

mod_timer_pending函数功能描述:

函数mod_timer_pending:

1)当动态定时器处于非活动状态时调用此函数,此函数能实现更改动态定时器的到期时间,从而可更改定时器的执行顺序,相当于执行如下代码序列:

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

此函数的执行还可能会更改动态定时器的base字段的值,改变动态定时器的到期处理函数的执行CPU;

2)当动态定时器处于活动状态时调用此函数,此函数不会更改定时器的到期时间,返回0。

mod_timer_pending文件包含

#include<linux/timer.h>

mod_timer_pending函数定义

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

函数定义格式:

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

mod_timer_pending输入参数说明

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

mod_timer_pending返回参数说明

此函数的返回值是整型,可能的取值是0、1,返回0说明此定时器处于活动状态,更改动态定时器到期时间失败;返回1说明此定时器即将到期,处于非活动状态,更改动态定时器到期时间成功。

mod_timer_pending实例解析

编写测试文件:mod_timer_pending.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_pending(&my_timer1, mytimer->expires+10);
    printk("the mod result of my_timer1 is: %d\n", result1); //显示函数调用结果
    printk("the expires of my_timer1 is:%ld\n", mytimer->expires);
                                                          // 显示动态定时器的到期节拍数
}

定义模块初始化函数:

int __init mod_timer_pending_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);                                  //激活动态定时器

    // 显示动态定时器的到期节拍数
    printk("the expires of my_timer1 is before mod_timer_pending:%ld\n", my_timer1.expires);

    // 调用函数改变动态定时器到期时间
    int result1=mod_timer_pending(&my_timer1, my_timer1.expires+10);
    printk("the result of mod_timer_pending is: %d\n", result1); //显示函数调用结果
    printk("the expires of my_timer1 is:%ld\n", my_timer1.expires);
                                                            //显示动态定时器的到期节拍数
    printk("my_timer1 init.\n");
    return 0;
}
void __exit mod_timer_pending_exit(void)
{
    printk("Goodbye mod_timer_pending\n");
    del_timer(&my_timer1);                                  //删除定时器变量
}

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

module_init(mod_timer_pending_init);
module_exit(mod_timer_pending_exit);

实例运行结果及分析:

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

Linux内核API mod_timer_pending

结果分析:

由图可以看出第一次函数调用之后动态定时器的expires字段的值发生了变化,说明expires字段的值更改成功,并且函数调用的返回结果是1,此返回结果也与此时动态定时器处于非活动状态相符;第二次调用此函数时返回值是0,调用前后字段expires的没有发生变化,说明当定时器到期时调用函数mod_timer_pending( )是无法更改字段expires的值的。

函数比较:

函数mod_timer_pending( )与函数mod_timer( )作用基本相同,都能更改动态定时器的到期时间。但是,函数mod_timer_pending( )不能更改处于活动中的动态定时器到期时间;而函数mod_timer( )可以更改处于活动中的动态定时器到期时间。因此,函数mod_timer( )调用的返回值0和1不代表更改成功与失败,而函数mod_timer_pending( )的返回值可代表更改的成功与失败,返回0更改失败,返回1更改成功。

赞(0)
未经允许不得转载:极客笔记 » Linux内核API mod_timer_pending
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址