(二)总结篇之定时器/中断

一、定时器

系统节拍率

系统频率也叫系统节拍率,

优点:高节拍率,会提高时间精度,时间测量更加准确

缺点:高节拍率会导致中断产生更加频繁,会加剧系统的负担

jiffies

Linux内核使用的全局变量jiffies来记录系统从启动以来的系统节拍树

hz就是一秒的节拍数,也就是频率,

定时时间 之前jiffies + 定时时间 =  系统的jiffies

二、中断(重点)

中断向量表

中断向量表,存放了中断程序的起始地址

cPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址

1.先要找到你要使用的中断对应的中断号

2.激活中断,申请,request_irq

3.(不用的话)释放中断,free_irq

4.中断处理函数

5.使能/禁止指定中断

中断 上半部和下半部

上半部处理不能被打断

硬件中断、时间快的中断下班

下半部中断可以被打断(tasklet)

处理一些时间比较长的中断,将一些麻烦的一起·都存放在下半部执

工作队列

将下半部存放在一个线程队列中,这样中断也可以参与线程调度

中断的线程化处理

给每一中断都创建一个线程,都可以参与线程调度

按键中断程序(硬件中断)

1、修改设备树

key {
 #address-cells = <1>;
 #size-cells = <1>;
 compatible = "atkalpha-key";
 pinctrl-names = "default";
 pinctrl-0 = <&pinctrl_key>;
 key-gpio = <&gpio1 18 GPIO_ACTIVE_LOW>; /* KEY0 */
 interrupt-parent = <&gpio1>;//因为key0所使用的gpio为GPIO_IO18,也就是设置KEY0的GPIO中断控制器为gpio1
 interrupts = <18 IRQ_TYPE_EDGE_BOTH>; /* FALLING RISING *///设置中断源,这个宏定义的定义是KEY0按下和释放都会触发中断
 status = "okay";
 };

2、驱动程序编写

一、.__init

1.注册设备

2.初始化按键

keyvalue INVAKEY(最开始肯定要设置成无效值,因为此时并没有按键按下)

releasekey 0 (解释一下这个变量,非常重要,它为1的时候表示有一次完整的按键过程,为0的时候就是没有按键这个过程)

3.进入keyio_init() //按键初始化(进入2查看细节)

二、.keyio_init()

1.提取节点

2.提取gpio

3.初始化key所用IO,并设置中断模式(申请IO,设置IO为输入模式,获取IO对应中断号)

4.设置设备的中断处理函数(进入3查看细节)

5.设置设备的中断的value(就是按下按键后,赋值给设备的keyvalue)

6.申请中断(request_irq)

7.定时器初始化

8.定时器函数的函数的设置(进入4查看细节)

3.key0_handler

三、.key按下出发中断

2.开启定时器,做个10ms的延时

3.时间到了之后触发timer_function

四、.timer_function

出发timer_function说明按键肯定被按下了

分两种

1.正在按(把中断的value赋值给设备的keyvalue)

2.已经按下之后松开了(把最高位置1,同时置 1 releasekey位,标志有一次有效的按键过程发生)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值