Linux驱动:内核等待队列

发布者:幸福的人生最新更新时间:2025-01-09 来源: cnblogs关键字:Linux驱动  内核  等待队列 手机看文章 扫描二维码
随时随地手机看文章

在Linux中, 一个等待队列由一个'等待队列头'来管理,等待队列是双向链表结构。 应用场合:将等待同一资源的进程挂在同一个等待队列中。

数据结构

在include/linux/wait.h

struct __wait_queue_head {  

spinlock_t lock;  

struct list_head task_list;

};

typedef struct __wait_queue_head  wait_queue_head_t;//定义wait_queue_head_t结构类型:一个等待队列的头结构表征一条等待队列

等待队列的操作函数:

1.声明和初始化

动态的方法:

wait_queue_head_t my_queue;    //先声明

init_waitqueue_head(&my_queue);//接着初始化它

静态的方法:

DECLARE_WAIT_QUEUE_HEAD(name);//定义并初始化等待队列(头)

2.定义等待队列项

DECLARE_WAITQUEUE(name, tsk); //只是等待队列中的一项而已哦。

3.添加删除等待项

//添加到等待队列中去之后,不会进入睡眠等待

void fastcall add_wait_queue(wait_queue_head_t * q, wait_queue_t * wait);

//删除唤醒以后的等待项

void fastcall remove_wait_queue(wait_queue_head_t * q, wait_queue_t * wait);

4.等待时间操作(宏函数)

①只能被wake_up唤醒,不能被中断信号唤醒的:醒来的第一件事情就是检查condition条件,如果为真,立马起床,否则继续睡觉。

wait_event(queue, condition);                 

②最常用的可被中断信号唤醒的等待队列: 被中断信号唤醒之后,立马起床,但是: 如果condition=0 -> 返回-ERESTARTSYS错误码;如果condition=1 -> 返回0

wait_event_interruptible(queue, condition);   

③如果睡眠期间被wake_up唤醒后,如果condition为真:立马“起床”,返回0;否则,继续睡觉,直到超时才“起床”并返回0;

wait_event_timeout(queue, condition, timeout);

④可想而知

wait_event_interruptible_timeout(queue, condition, timeout);

5.唤醒等待队列头牵引的所有项

①可唤醒处于TASK_INTERRUPTIBLE和TASK_UNINTERUPTIBLE状态的进程,和wait_event/wait_event_timeout成对使用

void wake_up(wait_queue_head_t * queue);

②只能唤醒TASK_INTERRUPTIBLE状态的进程.,与wait_event_interruptible/wait_event_interruptible_timeout成对使用

void wake_up_interruptible(wait_queue_head_t * queue);

6.在等待事件中睡眠

①把目前进程的状态置成TASK_UNINTERRUPTIBLE,并定义一个等待队列元素,之后把他附属到等待队列头q,直到资源可用,q引导的等待队列被唤醒

void sleep_on(wait_queue_head_t *q); // 只能被wake_up()宏唤醒

②将进程状态置为TASK_INTERRUPTIBLE.......


关键字:Linux驱动  内核  等待队列 引用地址:Linux驱动:内核等待队列

上一篇:Linux驱动:I2C驱动编写要点
下一篇:Linux驱动:LCD驱动测试

推荐阅读最新更新时间:2026-03-25 12:03

内核等待队列机制介绍
接下来,我要跟各位介绍一下 wait_queue 的用法,以及用一个例子来说明如何使用 wait_queue。最后,我会带各位去 trace 一下 wait_queue 的原始程序代码,看看 wait_queue 是如何做到的。 我想有件事要先提及的是 Linux 在 user space 跟在 kernel space 上的差异。我们知道 Linux 是 multi-tasking 的环境,同时可以有很多人执行很多的程序。这是从 user 的观点来看的。如果就 kernel 的观点来看,是没有所谓的 multi-tasking 的。在 kernel 里,只有 single-thread。也就是说,如果你的 kernel co
[嵌入式]
Linux 内核驱动自动创建设备节点并挂载设备
一、首先需要在最开始定义两个数据结构: static struct class *firstdrv_class; static struct device *firstdrv_device; 二、在init函数里通过class_create和device_create函数创建相应的设备节点,示例代码如下: static int first_drv_init(void) { /* 主设备号设置为0表示由系统自动分配主设备号 */ major = register_chrdev(0, first_drv , &first_drv_fops); /* 创建firstdrv类 */ firstdr
[单片机]
linux内核驱动 第一个led的 程序思想过程
linux 内核写led的驱动如图所示: 按照图 的方式我们发现我们需要写两个部分 一个是APP,一个是底层的驱动。其中APP是通过C库和系统层最后调用到底层的驱动的。 linux系统首先会把底层驱动以文件的形式挂载到dev文件夹内,然后APP利用文件写或者读的方式对底层的代码进行操作。 所以程序会分为两部分1. 写驱动并且挂载到linux内核2. 写APP程序去按照文件的方式调用linux挂载的内核。 1. 首先是写驱动的程序。 主要的程序有: static int first_drv_open(struct inode *inode, struct file *file) 这个是led初始化的函数 其中
[单片机]
<font color='red'>linux</font><font color='red'>内核</font><font color='red'>驱动</font> 第一个led的 程序思想过程
s3c2440液晶屏驱动内核自带) linux-4.1.24
自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev/s3c2410fb.c 先打开调试功能,这样内核在启动的时候,就可以输出这些信息,或者使用 dmesg 查看到这些信息。当然,你配置内核 make menuconfig 也可以打开,但是太麻烦了,不如这样。 1 #define CONFIG_FB_S3C2410_DEBUG 2 #define dprintk(msg...) 3 do { 4 if (debug) 5 printk(msg);
[单片机]
s3c2440液晶屏<font color='red'>驱动</font> (<font color='red'>内核</font>自带) <font color='red'>linux</font>-4.1.24
Linux内核LED驱动来理解字符设备驱动开发流程
开发环境 环境说明 详细信息 备注信息 操作系统 Ubunut 18.04.3 LTS 开发板 S3C2440(JZ2440-V3) kernel版本 linux-3.4.2 官网地址 busybox版本 busybox-1.22.1 官网地址 编译器 arm-linux-gcc-4.4.3 下载地址 编译器路径 /opt/FriendlyARM/toolschain/4.4.3/bin 绝对路径 1. Linux字符设备驱动的组成 引自宋宝华《Linux设备驱动开发详解--基于最新的Linux 4.0内核》P138内容: 在Linux中,字符设备驱动由如下几个部分组成。 1. 字符设备
[单片机]
从<font color='red'>Linux</font><font color='red'>内核</font>LED<font color='red'>驱动</font>来理解字符设备<font color='red'>驱动</font>开发流程
Linux-2.6.32.2内核在mini2440上的移植(五)---激活RTC驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】在初始化文件中加入RTC 设备结构 Linux-2.6.32.2 内核对24
[单片机]
Linux-2.6.32.2内核在mini2440上的移植(九)---触摸屏驱动移植
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】在内核中添加触摸屏驱动程序 Linux-2.6.32.2 内核也没有包含支持S3
[单片机]
<font color='red'>Linux</font>-2.6.32.2<font color='red'>内核</font>在mini2440上的移植(九)---触摸屏<font color='red'>驱动</font>移植
Linux-2.6.32.2内核在mini2440上的移植(十一)---移植SD卡驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】在内核中注册SD 设备驱动 Linux-2.6.32.2 已经自带了S3C24
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved