[arm驱动]linux等待队列阻塞中断IO的应用

简介:

《[arm驱动]linux等待队列阻塞中断IO的应用》涉及内核驱动函数四个,内核结构体零个,分析了内核驱动函数四个;可参考的相关应用程序模板或内核驱动模板一个,可参考的相关应用程序模板或内核驱动一个

一、概念:
   要休眠进程,必须有一个前提:有人能唤醒进程,而起这个人必须知道在哪儿能唤醒进程,这里,就引入了“等待队列”这个概念。
二、应用场景:
   等待队列用来实现进程的阻塞,等待队列可看作保存进程的容器,在阻塞进程时,将进程放入等待队列,当唤醒进程时,从等待等列中取出进程。进程进入休眠后必须有个地方能够唤醒休眠的进程;唤醒进程的地方最大可能是中断里面,应为硬件资源的获取的同时往往伴随着一个中断。所以在中断中常常使用等待队列来休眠进程,将cpu资源让给其他进程,中断发生时唤醒进程
三、中断休眠相关函数
   1、生成等待事件的函数

内核函数一)a)函数wait_event_interruptible(queue,condition)函数

1
2
wait_event_interruptible(queue,condition)  //当condition(一个布尔表达式)为真时,立即返回;
//否则让进程进入TASK_INTERRUPTIBLE的睡眠,并挂在名为queue所指定的等待队列上。

内核代码一)b)内核代码

1
2
3
4
5
6
7
#define wait_event_interruptible(wq, condition)           
   ({                               
       int  __ret = 0;                       
       if  (!(condition))                   
           __wait_event_interruptible(wq, condition, __ret);
       __ret;                           
   })

内核函数二)2、wake_up_interruptible(queue);//唤醒队列中的名为queue的队列
   内核代码二)a)内核源码


1
2
3
4
5
6
7
8
9
#define wake_up_interruptible(x)    __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)
     void  fastcall __wake_up(wait_queue_head_t *q, unsigned  int  mode,
             int  nr_exclusive,  void  *key)
     {
         unsigned  long  flags;
         spin_lock_irqsave(&q->lock, flags);
         __wake_up_common(q, mode, nr_exclusive, 0, key);
         spin_unlock_irqrestore(&q->lock, flags);
     }

   3、定义队列名为queue的两种方法
内核函数三)a)静态定义方法: DECLARE_QUEUE_HEAD(name)(常用)
内核代码三)内核代码

1
2
3
4
#define DECLARE_WAIT_QUEUE_HEAD(name) wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)
            #define __WAIT_QUEUE_HEAD_INITIALIZER(name) {           
                .lock        = __SPIN_LOCK_UNLOCKED(name.lock),   
                .task_list    = { &(name).task_list, &(name).task_list } }

内核函数四)b)动态定义方法:

1
2
wait_queue_head_t  my_queue;
                   init_waitqueue_head(&my_queue);

内代码四)内核代码

1
2
3
4
5
6
init_waitqueue_head(&my_queue)的内核代码
void  init_waitqueue_head(wait_queue_head_t *q)
{
spin_lock_init(&q->lock);
INIT_LIST_HEAD(&q->task_list);
}

三、等待队列代码使用参考模板

模板一)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
staticDECLARE_WAIT_QUEUE_HEAD(queue);
staticintflag =0;
staticirqreturn_t irq_handle(intirq,  void *dev__id){
//printk("irq = %d\n", irq);
//..........其他代码.............
flag = 1;
wake_up_interruptible(&queue);
returnIRQ_RETVAL(IRQ_HANDLED); //warn:杩斿洖IRQ_HANDLED
}
ssize_t XXXXX_read(structfile *filp,char__user *buf,size_tcount,loff_t *pos)
{
//pirntk(KERN_DEBUG "process %i (%s) going to sleep\n",current->pid,current->comm);
wait_event_interruptible(queue,flag); //此时进程被加入等待队列,等待中断发生
flag=0;
//printk(KERN_DEBUG "awoken %i (%s) \n",current->pid,current->comm);
returncount; //这个count变量看自己需要更改
}



本文转自lilin9105 51CTO博客,原文链接:http://blog.51cto.com/7071976/1392461,如需转载请自行联系原作者
相关文章
|
29天前
|
存储 缓存 算法
如何优化阻塞IO的性能?
【10月更文挑战第6天】如何优化阻塞IO的性能?
31 5
|
26天前
|
数据处理
基于ARM的嵌入式原理与应用:ALU的功能与特点
基于ARM的嵌入式原理与应用:ALU的功能与特点
|
3月前
|
监控 数据挖掘 Linux
Linux服务器PBS任务队列作业提交脚本的使用方法
【8月更文挑战第21天】在Linux服务器环境中,PBS任务队列能高效管理及调度计算任务。首先需理解基本概念:作业是在服务器上执行的任务;队列则是等待执行任务的列表,具有不同的资源限制与优先级;节点指分配给作业的计算资源。
410 4
|
3月前
|
存储 Java 数据库连接
BIO阻塞IO流与数据存储大揭秘:性能与资源消耗,一文让你彻底解锁!
【8月更文挑战第25天】本文探讨了Java中BIO阻塞IO流与数据存储的概念及其实现。BIO作为一种传统IO模型,在处理每个客户端请求时需创建新线程并等待响应,这在并发量大时会导致性能下降和高资源消耗。示例代码展示了如何利用`ServerSocket`实现基于BIO的简单服务器。此外,文章还介绍了数据存储的基本方法,例如通过`BufferedWriter`向文件写入数据。两者对比显示,BIO适合连接数稳定的场景,而数据存储则适用于需要持久化保存信息的情况。通过这些分析和实例,希望能帮助读者更好地掌握这两种技术的应用场景及其优缺点。
43 0
|
3月前
|
C# 开发者 设计模式
WPF开发者必读:命令模式应用秘籍,轻松简化UI与业务逻辑交互,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,命令模式是简化UI与业务逻辑交互的关键技术,通过将请求封装为对象,实现UI操作与业务逻辑分离,便于代码维护与扩展。本文介绍命令模式的概念及实现方法,包括使用`ICommand`接口、`RelayCommand`类及自定义命令等方式,并提供示例代码展示如何在项目中应用命令模式。
47 0
|
3月前
|
Ubuntu Linux
内核实验(九):添加IO驱动的阻塞读写功能
本文通过修改内核模块代码,介绍了如何在Linux内核中为IO驱动添加阻塞读写功能,使用等待队列和条件唤醒机制来实现读写操作的阻塞和非阻塞模式,并在Qemu虚拟机上进行了编译、部署和测试。
16 0
|
3月前
|
Linux 调度
Linux内核的基础设施:工作队列、等待队列
本文介绍了Linux内核中的工作队列和等待队列机制,通过一个具体的Demo演示了如何使用等待队列进行条件等待和唤醒,以及工作队列的创建和调度,同时展示了修改唤醒条件导致无法唤醒进程的情况。
46 0
|
4月前
|
消息中间件 Java Kafka
kafka Linux环境搭建安装及命令创建队列生产消费消息
kafka Linux环境搭建安装及命令创建队列生产消费消息
99 4
|
4月前
|
Java
什么是阻塞IO?
**阻塞IO是一种IO操作模式,使得调用线程在IO未完成时会暂停,等待操作完成。简单但可能导致线程阻塞,适用于低并发、长处理场景。Java示例中,`ServerSocket`和`Socket`展示了这种模式。服务端接收到客户端连接后读取数据,回应"Echo",每个连接需单独线程处理。高并发时可考虑非阻塞IO(NIO)或异步IO来优化。**
|
23天前
|
编解码 弹性计算 应用服务中间件
阿里云服务器Arm计算架构解析:Arm计算架构云服务器租用收费标准价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将深入解析阿里云Arm计算架构云服务器的技术特点、适用场景以及包年包月与按量付费的收费标准与最新活动价格情况,以供选择参考。