中断系列:
1.休眠与唤醒
read无按键则里边休眠wait_eventxx,如果此时有按键按下,唤醒休眠队列 wake_up,处理按键中断;
驱动层步骤:()通过参考书和源码知道的下边三个步骤
- 初始化队列;
- wait_event队列;
- wake_up 队列
过程:应用层read();–驱动层dri_read–>队列为空,则休眠—》按键了—》调用中断处理函数–》队列加值–》唤醒队列–》read里被唤醒–》读出来值–处理;
2.poll机制
3.异步通知(发信号):
应用程序不休眠,做自己的事,驱动有数据的时候发信号给应用程序,然后应用程序去做处理的机制
同步机制:买麻辣香锅,点好了,看着店员做好端给你。
异步:买麻辣香锅,点好了,去做自己的事,做好了,店员通知你做好了;
底层用 kill_fasync()发信号
运行过程:应用程序运行,注册信号处理函数,发送进程pid给驱动,开始做自己的事情,此时硬件按键按下,驱动程序调用中断,中断发信号,给应用程序,应用程序捕捉到信号,开始读驱动,驱动调用读,返回读出的数据,界面打印出度的数据;
4.阻塞与非阻塞
上层打开字符设备时,可选block or no-block,驱动层读取 file->f_flags 来确定是阻塞还是非阻塞,非阻塞则return;
5.定时器
超时时间+处理函数
驱动层,注册定时器,添加超时时间,硬件改变,触发中断irq,修改定时器超时时间,比如 按下按键 消抖=修改的超时时间,时间一过,检测到按键;
6.中断下半部
不能处理耗时任务
内核先处理硬件中断,然后将相应软件中断处理加如内核tasklet队列,硬件中断处理完毕,触发软件中断,处理软件中断;
7.工作队列
用内核线程处理耗时工作,如果处理的任务非常耗时,建议自己创建内核线程;
实现机制