Rockchip之定时器的使用

Rockchip之定时器的使用

定时器在Linux驱动中是非常常用的一种工具,他可以定时的为你去做一些事情,就比如我之前的一个项目,需要使用定时器去查询我的设备ADC情况,如果查询到ADC出错则自动复位.

话不多说,开始讲解
在linux内核linux/include/timer.h中定义了一个定时器的结构体
在这里插入图片描述
Linux中定时器也有很多API,其中重要的有以下几个:

  • 初始化定时器:

    void init_timer(struct timer_list * timer);
    
  • 增加定时器:

    void add_timer(struct timer_list * timer);
    
  • 删除定时器:

    int del_timer(struct timer_list * timer);
    
  • 修改定时器

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

定时器还有一些成员函数,其中比较重要的有:

  • expires:

    expires一般用户毫秒级别的定时器
    expires = jiffies + Hz; //expires触发时间为1S
    expires = jiffies + 10*Hz/1000 ; //expires触发时间为10ms
    expires = jiffies + 5 * Hz; //expires触发时间为5S

  • function
    这个function成员是设置一个回调函数,这个回调函数也叫定时器超时函数,即定时器时间到了之后就将进入这个函数,所以可以在这个函数做你自己一些列的操作.在我自己的项目中我做的操作是查询ADC状态,状态错误则复位ADC.

接下来就是在驱动里面添加定时器了,其实Linux驱动中使用定时器很简单,只需要一下几个步骤:

  1. 初始化结构体

    static struct timer_list tm;
    
  2. 初始化定时器并设置定时参数

    init_timer(&tm);       //初始化定时器    
    tm.function= callback;      //设置回调函数(超时函数)             
    tm.expires = jiffies+5*HZ;   //设置定时器时间,这里是5s
    
  3. 把定时器加入你的工作队列(添加定时器)

    add_timer(&tm);
    
  4. 根据需求编写回调函数(超时函数)

    void callback(unsigned long arg)
    {
        //根据需求编写自己的工作
        printk("arg = %d\n", arg);    //arg是data成员传参
    }
    

    在这里有可能你会疑惑,这个参数arg是从哪里来的呢,这个arg参数是定时器结构体的成员data,如果你需要传参,就设置这个data成员,如果不需要传参则可以不设置.

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

到这里你的定时器就可以工作的,定时器的工作时间就是你设置的expires时间,不过需要注意的是根据不同人的项目,如果定时器查询太过频繁,即定时器时间太短,可能内核会有冲突,不过也是因不同的项目需求而异.

Linux定时器的使用方法很多,你可以另起一个驱动文件编进内核,也可以直接使用他的方法加到你自己的驱动文件,在这里,我是直接使用定时器方法直接加入我的驱动文件,这个就需要看个人需求.

如大家看完上面的还不懂,可以参考下面Linux标准定时器驱动.
https://pan.baidu.com/s/1kuBA4UOuV6NpUZB6wg-7Rw

猜你喜欢

转载自blog.csdn.net/Shushan1/article/details/85838211
今日推荐