zoukankan      html  css  js  c++  java
  • linux2.4.18内核定时器的使用

    Linux2.4下驱动中定时器的应用

    我的内核是2.4.18的。Linux的内核中定义了一个定时器的结构:

    #include<linux/timer.h>

    struct timer_list

    {

        struct list_head list;

    unsigned long expires; //定时器到期时间

    unsigned long data; //作为参数被传入定时器处理函数

    void (*function)(unsigned long);

    };

    利用这个结构我们可以在驱动中很方便的使用定时器。

    一: timerAPI函数:

              初始化定时器:

                   void init_timer(struct timer_list * timer);

    增加定时器:

    void add_timer(struct timer_list * timer);

    删除定时器:

    int del_timer(struct timer_list * timer);

    修改定时器的expire

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

     二:使用定时器的一般流程为:

    1)创建timer、编写超时定时器处理函数function

    2)为timerexpiresdatafunction赋值;

    3)调用add_timertimer加入列表;

    4)在定时器到期时,function被执行;

    5)在程序中涉及timer控制的地方适当地调用del_timermod_timer删除timer或修改timerexpires

    三:一个简单的实例(timer.c)

    /****************************************

    作者:蔡肖飞                            *

    时间:2008年11月27日            *

    名称:timer.c                          *

    说明:本程序用于学习linux内核 *

    中定时器的基本使用               *

    *****************************************/

    #include <linux/module.h>

    #include <linux/kernel.h>

    #include <linux/init.h>

    #include <linux/sched.h>//jiffies在此头文件中定义

    #include <linux/init.h>

    #include <linux/timer.h>

    struct timer_list mytimer;//定义一个定时器

    void mytimer_ok(unsigned long arg)

    {

               printk("Mytimer is ok ");

               printk("receive data from timer: %d ",arg);

       }

    static int __init hello_init (void)

    {

        printk("hello,world ");

        init_timer(&mytimer);     //初始化定时器

        mytimer.expires = jiffies+100;//设定超时时间,100代表1

        mytimer.data = 250;    //传递给定时器超时函数的值

        mytimer.function = mytimer_ok;//设置定时器超时函数

        add_timer(&mytimer); //添加定时器,定时器开始生效

        return 0;

    }

       

    static void __exit hello_exit (void)

    {

        del_timer(&mytimer);//卸载模块时,删除定时器

        printk("Hello module exit ");

    }

    module_init(hello_init);

    module_exit(hello_exit);

    MODULE_AUTHOR("CXF");

    MODULE_LICENSE("Dual BSD/GPL");

    四:交叉编译后,放到开发板上:

    #insmod timer.o

    可以发现过一秒后定时器过期函数被执行了,打印出了信息,250也被正确传递

    了,呵呵!

    #rmmod timer

    实验完成。

    五:进一步理解定时器:

          在上面的定时器超时函数mytimer_ok(unsigned long arg)中,添加如下

    代码:

    mytimer.expires = jiffies+100;//设定超时时间,100代表1

    mytimer.function = mytimer_ok;//设置定时器超时函数

    add_timer(&mytimer); //添加定时器,定时器开始生效

    交叉编译后,放到开发板上

    #insmod timer.o

    发现每隔一秒,mytimer_ok函数就执行一次,这是因为每次定时器到期后,都

    又重新给它设置了一个新的超时时间,并且新的超时函数指向自己,形成一个递

    归,所以就会一直执行下去。

    #rmmod timer

    可以卸载模块,当然打印也就结束了,注意因为定时器超时函数不停的打印信息

    ,导致输入上面的命令时会被定时器超时函数不停的打印信息淹没,不用管他,

    耐心的把上面的命令输完就可以成功卸载。

    转载自:http://www.cnblogs.com/leaven/archive/2010/07/09/1774456.html

  • 相关阅读:
    HDU 5791 Two (DP)
    POJ 1088 滑雪 (DPor记忆化搜索)
    LightOJ 1011
    POJ 1787 Charlie's Change (多重背包 带结果组成)
    HDU 5550 Game Rooms (ccpc2015 K)(dp)
    HDU 5542 The Battle of Chibi (ccpc 南阳 C)(DP 树状数组 离散化)
    HDU 5543 Pick The Sticks (01背包)
    HDU 5546 Ancient Go (ccpc2015南阳G)
    NB-IoT的DRX、eDRX、PSM三个模式 (转载,描述的简单易懂)
    MQTT 嵌入式端通讯协议解析(转)
  • 原文地址:https://www.cnblogs.com/xiaoxing/p/3935099.html
Copyright © 2011-2022 走看看