linux驱动开发--定时器
来源:互联网 发布:sha256算法详细 编辑:程序博客网 时间:2024/05/16 06:52
在我们的按键外部中断程序中,如何使用定时器进行消抖处理:
首先在init函数中进行定时器的初始化
init_timer(&catc->timer);
catc->timer.data = (long) catc; //要想传递的参数catc->timer.function =buttons_timer_function; //定时器中断的执行函数
//buttons_timer.expires = 0; //设置的超时时间
add_timer(&buttons_timer); //增加到链表里面
因为我们第一次没有设置超时时间,也就是默认为 (//buttons_timer.expires = 0; //设置的超时时间)
所以程序会直接跳转到 定时器中断函数中执行,所以我们在前面要进行判断
if(!pindesc)
return;
消除第一次定时器中断的影响
static void buttons_timer_function(unsigned long data){struct pin_desc * pindesc = irq_pd;unsigned int pinval;if (!pindesc)return;pinval = s3c2410_gpio_getpin(pindesc->pin);if (pinval){/* 松开 */key_val = 0x80 | pindesc->key_val;}else{/* 按下 */key_val = pindesc->key_val;} ev_press = 1; /* 表示中断发生了 */ wake_up_interruptible(&button_waitq); /* 唤醒休眠的进程 */kill_fasync (&button_async, SIGIO, POLL_IN);}
接下来来看我们的外部中断函数
第一条语句是获取当前的状态,
第二条语句是设置定时器时间,也就是在当前时间基准上增加
当等待定时器时间到达的过程中,如果再次发生外部中断,说明就是按键的波动产生的,我们就又在基准时间上延后10ms,
也就是我们认定10ms之内没有产生波动,认定按键稳定,再来判断按键的状态
static irqreturn_t buttons_irq(int irq, void *dev_id){/* 10ms后启动定时器 */irq_pd = (struct pin_desc *)dev_id;mod_timer(&buttons_timer, jiffies+HZ/100);return IRQ_RETVAL(IRQ_HANDLED);}
阅读全文
0 0
- linux驱动开发--定时器
- linux驱动开发--内核定时器
- Linux驱动开发-9、Linux定时器
- 《Linux设备驱动开发详解》-- 内核定时器
- Linux定时器的使用-内核驱动定时器
- Linux定时器的使用-内核驱动定时器
- Linux设备驱动之定时器
- Linux驱动--定时器timer小记
- Linux设备驱动---内核定时器
- linux驱动中使用定时器
- Linux 驱动之内核定时器
- linux内核驱动之定时器
- linux驱动之PWM(定时器)
- Linux驱动之内核定时器驱动设计
- linux驱动之内核定时器驱动设计
- 【Linux开发】linux设备驱动归纳总结(七):2.内核定时器
- 《Linux驱动基础篇》- Linux内核定时器
- linux驱动开发学习--对中断和内核定时器的学习笔记
- leetcode: 6. ZigZag Conversion
- 何晖光:“深度学习类脑吗?”--- 基于视觉信息编解码的深度学习类脑机制研究 | VALSE2017之十四
- HTML条件注释判断浏览器版本<!--[if lt IE 9]>
- 宝贝不开直通车了会降权吗?如何提升产品权重
- 考试相关题目
- linux驱动开发--定时器
- Android studio 3.0 版本的出现的bug的总结
- Python数据分析入门-Pandas环境搭建
- iOS开发常用函数
- cannot convert parameter 2 from 'WORD' to 'LPCWSTR'
- 如何判断是客户端问题还是服务器问题
- ssd_pascal.py部分源码阅读
- 文章标题
- 在IntelliJ IDEA中使用maven jetty启动服务时,指定端口号