Linux 定时器

Linux 定时器

所谓定时器,就是闹钟,时间到后你就要做某些事。有 2 个要素:时间、做事,
换成程序员的话就是:超时时间、函数。

在内核中使用定时器很简单,涉及这些函数(参考内核源码 include\linux\timer.h):
① setup_timer(timer, fn, data):
设置定时器,主要是初始化 timer_list 结构体,设置其中的函数、参数。

② void add_timer(struct timer_list *timer):
向内核添加定时器。timer->expires 表示超时时间。
当超时时间到达,内核就会调用这个函数:timer->function(timer->data)。

③ iint mod_timer(struct timer_list *timer, unsigned long expires):
修改定时器的超时时间,

④ int del_timer(struct timer_list *timer):
删除定时器

Linux内核的系统滴答中断(tick)是10ms,每发生一次 tick 中断,全局变量 jiffies 就会累加 1。

定时器的时间就是基于 jiffies 的,我们修改超时时间时,一般使用这 2 种方法:
① 在 add_timer 之前,直接修改:

timer.expires = jiffies + xxx; // xxx 表示多少个滴答后超时,也就是 xxx*10ms
timer.expires = jiffies + 2*HZ; // HZ 等于 CONFIG_HZ,2*HZ 就相当于 2 秒

② 在 add_timer 之后,使用 mod_timer 修改:

mod_timer(&timer, jiffies + xxx); // xxx 表示多少个滴答后超时,也就是 xxx*10ms
mod_timer(&timer, jiffies + 2*HZ); // HZ 等于 CONFIG_HZ,2*HZ 就相当于 2 秒

比如,利用定时器处理按键消抖,每次抖动都会关系定时器的超时时间,等待超时时间达到后,才会去读取按键的值。
在这里插入图片描述

一整套流程如下:
①驱动的加载和卸载函数
加载函数中:
注册platform设备驱动
platform_driver_register(&irq_key_drv);

卸载函数中:
注销平台设备驱动
platform_driver_unregister(&irq_key_drv);

②platform设备驱动通过platform_driver_register函数自动匹配设备树
查找设备树种的compatible属性。
如果匹配成功,就会调用.probe函数
在这里插入图片描述
③.probe函数中,首先回去申请设备号
这里有两种方式,第一种是指定设备号,去申请
缺点:
需要提前知道哪个设备号没有使用,且注册该设备号后,所有的子设备号均被占用,比较浪费

第二种是由系统自动分配设备号,可以指定申请几个子设备号。
在这里插入图片描述
④.probe函数中,自动创建设备节点
自动创建设备节点引出了cdev,热插拔功能
实现如下:
在这里插入图片描述
⑤自动创建设备节点还需要创建class和device
在这里插入图片描述
⑥err时,可以使用goto语句进行统一处理,return前需要释放申请过的资源。
在这里插入图片描述
⑦中断服务函数的注册
第一步,取得指定的IO的中断irq编号
在这里插入图片描述
第二步,注册中断服务函数,触发方式
在这里插入图片描述
第三步,编写中断服务函数
中断服务函数中,仅修改定时器的超时时间,意味着,按键按下抖动时,定时器就不会超时,只有稳定下来,才会调用定时器函数,读取按键IO。

⑧在.probe函数中,设置定时器,初始化time_list结构体,注册定时器函数
在这里插入图片描述
向内核添加定时器,首先需要设置timer->expires超时时间。
在这里插入图片描述
超时时间设置为0,代表一定会执行定时器函数。

定时器函数执行,读取按键的值
从而实现消抖功能。

⑨.remove函数中会释放所有申请的资源
在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值