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驱动中使用定时器很简单,只需要一下几个步骤:
-
初始化结构体
static struct timer_list tm;
-
初始化定时器并设置定时参数
init_timer(&tm); //初始化定时器 tm.function= callback; //设置回调函数(超时函数) tm.expires = jiffies+5*HZ; //设置定时器时间,这里是5s
-
把定时器加入你的工作队列(添加定时器)
add_timer(&tm);
-
根据需求编写回调函数(超时函数)
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