Linux驱动设计——阻塞和同步

阻塞和非阻塞是设备访问的两种基本方式,阻塞和非阻塞驱动程序使用时,经常会用到等待队列。

阻塞和非阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有得到结果之后才会返回。而对于同步调用来说,许多时候当前线程还是激活的,只是逻辑上当前函数没有返回而已。

非阻塞指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

完整实例程序分析

等待队列

等待队列机制使等待的进程暂时睡眠,当等待的信号到来时,便唤醒等待队列中进程继续执行。

等待队列的基本数据结构是一个双向链表,这个链表可以存储睡眠的进程。等待队列也与进程调度机制紧密结合,能够实现内核中异步事件通知机制。

等待队列在中断处理、进程同步、定时等场合有重要的用处。

等待队列的实现

等待队列的使用

  1. 定义和初始化等待队列头
  2. 定义等待队列
  3. 添加和移除等待队列
  4. 等待事件
  5. 唤醒等待队列

使用等待队列实现同步机制

To be continue...

时间: 2024-10-05 22:56:35

Linux驱动设计——阻塞和同步的相关文章

Linux驱动设计——并发控制

四种并发控制机制:原子操作.自旋锁.信号量和完成量. 原子变量操作 原子变量操作绝对不会再执行完毕前被任何其他任务或事件打断.原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树中的include/asm/atomic.h文件中,它们都是使用汇编语言实现的. 常用于多个应用程序对同一个共享的值进行操作的情况. 自旋锁 自旋锁是实现信号量和完成量的基础.对资源有很好的保护作用. Linux系统中提供了一些锁机制来避免竞争条件,最简单的一种就是自旋锁.引入锁的机制是因

Linux驱动设计——内存与IO访问

名词解释 内存空间与IO空间 内存空间是计算机系统里面非系统内存区域的地址空间,现在的通用X86体系提供32位地址,寻址4G字节的内存空间,但一般的计算机只安装256M字节或者更少的内存,剩下的高位内存就被用于PCI或者AGP及系统桥设备的使用上面,主机可以像访问系统内存一样访问这些高端内存,这样对于扩展的设备有更大的空间. Linux用户空间与内核空间 IO空间是X86系统上面的专用空间,现在的IO空间大小是64K字节,从0x0000到0xffff,可以供设备使用,比如南桥很多的设备就是挂在I

Linux驱动设计—— 驱动调试技术

参考博客与书籍: <Linux设备驱动开发详解> <Linux设备驱动程序> http://blog.chinaunix.net/uid-24219701-id-2884942.html 对于驱动程序设计来说,核心问题之一就是如何完成调试.当前常用的驱动调试技术可分为: 1. 打印调试 printk 重定向控制台消息 消息记录 开启和关闭消息速度限制 打印设备编号 2. 调试器调试 gdb kdb内核调试器 kgdb补丁 3. 查询调试 使用/proc文件系统 ioctl方法 4.

Linux驱动设计—— 中断与时钟

中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只要保证申请了正确的中断号及编写了正确的中断处理函数即可. 中断的宏观分类 1.硬中断 由系统硬件产生的中断.系统硬件通常引起外部事件.外部事件事件具有随机性和突发性,因此硬件中断也具有随机性和突发性. 2.软中断 软中断是执行中断指令时产生的.软中断不用外设施加中断请求信号,因此软中断的发生不是随机

Linux驱动设计编译错误信息集锦

1.warning: passing argument 2 of 'request_irq' from incompatible pointer type http://blog.sina.com.cn/s/blog_7321be1101012gek.html 今天在些key的driver的时候...写完了编译出现一个warmming如下:warning: passing argument 2 of 'request_irq' from incompatible pointer type 我的r

12 Linux驱动之阻塞IO

阻塞IO机制:使用等待队列 1.定义等待队列头 wait_queue_head_t read_wait; 2.初始化等待队列头 init_waitqueue_head(wait_queue_head_t *q); 3.让进程等待int wait_event(wait_queue_head_t wq ,bool condition); //条件为假的时候,设为不可中断的等待int wait_event_interruptible(wait_queue_head_t wq,bool conditio

linux驱动之i2c子系统device注册driver注册简单分析

Linux 驱动设计主要是根据分层分离思想,i2c子系统分为i2cocre.adapter.及device_driver层,其实adapter也是个device,只不过是我们主控芯片的I2C控制接口而已,我们的主控芯片有几个I2C接口就有几个adapter; i2ccore这一层linux已经帮我们实现,主要的工做是类似platform总线的作用,负责drvier及设备的注册,相比platform多了个adapter的注册管理工作,以及i2c的数据发送接收等等算法,说算法有点夸大,其实就是按照i

7.阻塞型驱动设计

阻塞型驱动设计 唤醒之后按优先级执行. 对按键驱动进行阻塞型改造 改造的duokey.c: Make会产生一下的问题还没解决,由于没有网络.差个头文件..... 明天有网络再说咯 找到了头文件,linux/sched.h又出现了奇怪的错误: 很奇怪,是重名.可我没有定义key..h,是系统的.最后改为button_init和button_exit.make通过了. Duokey.c的代码: #include <linux/module.h>        /* For module speci

读薄《Linux 内核设计与实现》(4) - 中断与同步

这篇文章是<读薄「Linux 内核设计与实现」>系列文章的第 IV 篇,本文主要讲了以下问题:中断和中断处理程序的概念与实现原理.Linux 中的下半部以及内核同步方法. 0x00 中断和中断处理程序 I 中断 中断是一种特殊的电信号,由硬件发向处理器,处理器接收到中断时,会马上箱操作系统反映,由操作系统进行处理.中断随时可以产生,因此,内核随时可能因为新到来的中断而被打断. 不同的设备对应的中断不同,每个中断通过一个唯一的数字标识,这些中断值通常被称为中断请求(IRQ)线. II 中断处理程