一、定时器
系统节拍率
系统频率也叫系统节拍率,
优点:高节拍率,会提高时间精度,时间测量更加准确
缺点:高节拍率会导致中断产生更加频繁,会加剧系统的负担
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位,标志有一次有效的按键过程发生)