上一节获取按键状态时,是在应用层以循环的方式不断读取按键状态,但是我们实际关注的只是当按键被按下时发生的情况,所以大多数时间拿到的状态都是我们不需要的结果。

对此,当按键被释放时,让 read 接口处于阻塞状态,等按键被按下再解除阻塞。
一、等待队列API
要使用等待队列涉及到两个概念:等待队列头、等待项
等待队列通常使用链表实现,等待队列头便是链表的头节点,在Linux内核中使用 wait_queue_head_t 类型来表示等待队列头;等待项是等待队列中的一个子节点,通常是以线程为单位,将等待项加入到等待队列,相当于让线程处于休眠状态,在Linux内核中使用 wait_queue_t 类型来表示。相关API声明在 <linux/wait.h> 文件中。
1、初始化等待队列
在使用等待队列之前,一般需要“声明 + 初始化”,接口原型如下(本质是宏)
/**
* @param q 等待队列
*/
void init_waitqueue_head(wait_queue_head_t *q);
2、向等待队列添加等待项
向等待队列添加等待项之前需要先初始化等待项,等待项的初始化比较特殊,无需事先声明变量,使用的接口原型如下
/**
* @param name 等待项的名字
* @param tsk 当前所属任务(进程),一般填current,current 是一个全局变量,表示当前进程
*/
DECLARE_WAITQUEUE(name, tsk);
// 示例
// wait 自己拟定的变量名(无需事先声明),可以认为此处便是在“声明+定义”一个等待项
// current Linux内核的全局变量,表示当前进程
DECLARE_WAITQUEUE(wait, current);
向等待队列添加等待项,add_wait_queue 接口函数不会主动陷入阻塞,需要我们手
Linux内核中的等待队列API应用:驱动按键状态处理,

本文详细介绍了如何在Linux内核中使用等待队列API处理按键状态,包括初始化、添加等待项、唤醒队列和设置进程状态的过程,以及在驱动中的具体实现和应用测试。
最低0.47元/天 解锁文章
2174

被折叠的 条评论
为什么被折叠?



