Linux内核API setup_timer

setup_timer函数功能描述:函数setup_timer( )在实现过程中调用了函数__setup_timer( ),完成对struct timer_list类型的变量进程初始化工作。函数__setup_timer( )首先调用函数__init_timer( )对struct timer_list变量进行初始化,将此结构体变量存储的定时器插入到系统内核定时器模块中,并确定由哪个CPU处理,字段base用相应CPU的base赋值,字段entry的next用NULL赋值,并初始化自旋锁为打开状态。然后对结构体变量struct timer_list的function字段和data字段初始化,被赋值的结构体变量是函数的第一个参数,第二个参数用于初始化字段function,第三个参数用于初始化字段data。

setup_timer文件包含

#include<linux/timer.h>

setup_timer函数定义

在内核源码中的位置:linux-3.19.3/include/linux/timer.h

函数定义格式:

#define setup_timer(timer, fn, data)                        \
    __setup_timer((timer), (fn), (data), 0)

函数__setup_timer( )的定义见文件linux-3.19.3/include/linux/timer.h

setup_timer输入参数说明

  • 第一个参数是struct timer_list类型的变量,此变量用于存放动态定时器,是即将要被初始化的对象,其定义及详细解释参考

    add_timer( )分析文档的输入参数说明部分。

  • 第二个参数是定时器到期时将要执行的函数,用于给定时器变量的function字段赋值。

  • 第三个参数用于给定时器变量的data字段赋值。

setup_timer返回参数说明

此函数不返回任何类型的值。

setup_timer实例解析

编写测试文件:setup_timer.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_timer1 is :%ld\n", mytimer->expires);
                                                  // 显示字段expires的值
}

定时器初始化、模块加载函数定义:

int __init setup_timer_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的值

    // 初始化定时器变量的function和data字段
    setup_timer(&my_timer, my_timer_function, &my_timer);
    add_timer(&my_timer);                          //将定时器变量加入到合适的链表,激活定时器
    printk("my_timer init.\n");
    return 0;
}

模块退出函数:

void __exit setup_timer_exit(void)
{
    printk("Goodbye setup_timer\n");
    del_timer(&my_timer);  //删除定时器变量
}

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

module_init(setup_timer_init);
module_exit(setup_timer_exit);

实例运行结果及分析:

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

Linux内核API setup_timer

结果分析:

由图可以看出定时器变量的function字段和data字段分别被自定义函数my_timer_function( )和定时器变量自身初始化了,并且完成了对定时器变量的系统初始化。

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

评论 抢沙发

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