• 用中断方式读取按键的值


    在xxx_open函数中注册中断函数:

     request_irq的最后参数是dev_id,我的理解是他可以像次设备号一样,可以由我们自己定义他是什么含义。

    写真正的中断处理函数:

     当中断发生时会调用这个函数,传入的参数是 相应的中断号 和 注册中断时传入的dev_id

    按键驱动程序中,为了描述一个引脚,声明了pin_desc结构体,并初始化了一个结构体数组:

               

     把&pins_desc[n]作为dev_id传入中断处理程序,就能根据传入的pin_desc->pin成员,直接调用如下函数获得引脚的状态,非常方便:

     ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     当测试程序打开/dev/bottons设备文件并读取按键时,会循环调用:

     如果不在驱动程序中的bottons_read函数中做处理,这样循环读取按键状态会一直占用cpu的资源,因此在bottons_read中做了如下处理:

     wait_event_interruptible(queue, condition)会根据condition的状态判断是否要把当前进程休眠:

    condition == 0-->休眠,并且不返回,等待条件成立(condition == 1)继续执行

    condition == 1-->不休眠,继续执行

    在上文的中断处理函数中,会有如下操作:

     使condition == 1,从而让bottons_read返回,测试程序就能得到按键值了。

    整个执行过程如下:

    测试程序在死循环中调用read函数,内核调用bottons_read函数,执行wait_event_interruptible时发现ev_press == 0,这时测试程序就休眠了,进入等待队列,不占用cpu。

    这时候按下按键,产生中断,在中断函数中读取引脚的高低电平获得按键状态,使condition(ev_press) == 1

     bottons_read函数得以从wait_event_interruptible返回,把中断中获得的按键状态通过copy_to_user告诉测试程序,read函数得以返回按键状态。

  • 相关阅读:
    uva-442 Matrix Chain Multiplication
    mongodb笔记2
    用MODELLER构建好模型后对loop区域进行自动的优化过程
    Java乔晓松-android的四大组件之一Service(服务的绑定)
    内部排序之交换排序
    C,C++中的static
    [置顶] 贝叶斯分类(一)
    RabbitMQ和kafka从几个角度简单的对比--转
    rabbitmq Clustering Guide--官方
    How To Cluster Rabbit-MQ--reference
  • 原文地址:https://www.cnblogs.com/physworld/p/14829179.html
Copyright © 2020-2023  润新知