内核定时器的使用和按键防抖原理

来源:互联网 发布:python可视化编程 编辑:程序博客网 时间:2024/06/05 18:15

内核定时器可以实现软中断,在某一时刻执行特定的函数。如何使用它呢?主要五步:声明、初始化、配置、激活、释放。

在使用之前,先讲解一个最重要的结构体:

struct  timer_list {

struct list_head entry,

unsigned long expires,

void (*function)(unsigned long ),

unsigned long data,

struct  timer_base_s *base,

}

function:定义了定时器超时处理函数,从使用的角度来将是最关键的。

expires:定义了相对目前的延时时间。当前时间用jiffiers来度量,延时一秒用expires=jiffiers+Hz,延时10秒就是expires=jiffiers+10*Hz,延时10ms就是expires=jiffiers+Hz/100。如果没有对其初始化,或者初始化为0,则激活定时器之后,内核会拿expires和jiffiers比较,当expires<jiffiers是,定时器就已经超时,则超时处理函数不会执行。

data:传递给超时处理函数function的参数。如果函数function不需要传递参数,则data可以不用配置。

另外两个参数不需要我们配置,由内核帮我们完成。

entry:添加到内核链表

base:指定处理器,由init_timer完成。

按照上面说的四个步骤:

1 声明:声明一个内核定时器结构体

struct   timer_list   buttons_timer;

2.初始化:用init_timer对上一步声明的结构体初始化。主要初始化entry和base这两个参数,由内核完成,细节暂且不管。

init_timer(&buttons_timer);

3.配置:配置内核定时器结构体中的另外三个参数function、expires、data。_

buttons_timer.function = buttons_timer_function //我们自己写的超时处理函数

不是必须的:

buttons_timer.data= n                                               //传递给buttons_timer_function的参数,可以不配置

buttons_timer.expires = jiffiers +10*Hz;                 //延时10s,可以先不配置,通过mod_timer修改这个参数

4.激活:激活定时器,从当前时刻开始计时。

add_timer(&buttons_timer)

通过以上四步就可以实现内核定时器延时一定时间后处理某一函数。这里以内核定时器在按键防抖动中的应用来说明其具体应用。

内核定时器防抖动原理:由于按键的机械振动,如果不加防抖的话,在输入S的时候,可能按了一下,但是输出几个S,就是由于按键的抖动,而重复几次进入中断服务程序。为了防止这种抖动造成的影响,我们修改中断服务程序,在中断服务程序中加入一句mod_timer(&buttons_timer,jiffiers +Hz/100)(修改定时器expires参数,10ms之后执行buttons_timer.function也就是buttons_timer_function),原来的中断服务程序处理的内容全部搬移到定时器中断函数buttons_timer_function中。

这样的话,执行过程是这样的:按下按键,进入中断服务程序,修改定时器时间(使其10ms后执行定时器中断函数),马上退出中断服务程序(不是10ms后才退出)。如果没有抖动,则10ms之后执行定时器中断函数,完成处理过程。如果有一次抖动,那么又一次进入中断服务程序,又一次修改定时器中断,使其在当前时间往后延时10ms执行定时器中断函数,然后退出中断服务程序。如果还有抖动,那重复上一过程。定时器中断函数的真正执行时间是在最后一次抖动进入中断服务程序后的10ms之后。


5 修改:修改定时器延时时间,重新激活,不是必须的

mod_timer(&buttons_timer,jiffiers +Hz/100) //在当前时刻延时10ms,Hz是1S

6 释放:释放定时器资源

del_timer(&buttons_timer)






0 0
原创粉丝点击