免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1359 | 回复: 0
打印 上一主题 下一主题

[驱动] 驱动程序中关于 定时器 的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-04 21:34 |只看该作者 |倒序浏览
       我们知道定时器处理函数只能执行一次,执行完后就会失效。若想循环使用需要重新启动定时器。而我最近看的一个按键驱动程序中,只有 init 函数中初始化了定时器。也就是说,按键第一次发生,响应了中断并且调用了定时器处理函数;而在按键第二次发生时,又是从 init 函数开始初始化定时器,然后跟第一次按键时那样执行下去???请问我的这个理解方式对吗?  如果不对请各位指正。
     


    驱动程序片段如下:
static irqreturn_t button_irq (int irq, void *dev_id)
{
        /* 10 ms 后启动定时器 */
        irq_pd = (struct pin_desc *)dev_id;

        mod_timer(&button_timer, jiffies + HZ/100);

        return IRQ_RETVAL(IRQ_HANDLED);
       
}
              …………

/* Handle the timer event */
static void buttons_timer_function(unsigned long unused)
{
        struct pin_desc *pindesc = irq_pd;
        unsigned int pinval;

        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);
}
                     ……………………

static int seventh_drv_init(int)
{
        init_timer(&button_timer);
        button_timer.function = &buttons_timer_function;        /* timer handler */
        add_timer(&button_timer);

        return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP