【Linux驱动】Linux阻塞IO —— 阻塞读取按键状态(等待队列实现)

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

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

对此,当按键被释放时,让 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 接口函数不会主动陷入阻塞,需要我们手

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值