国嵌内核驱动进阶班-7-2(内核等待队列)

定义和初期化

定义等待队列

wait_queue_head_t myqueue;

初始化等待队列

init_waitqueue_head(&myqueue)

定义并初始化等待队列

DECLARE_WAIT_QUEUE_HEAD(myqueue)



睡眠

  • 条件睡眠

当condition为真时,立即执行;

wait_event(queue, condition)

当condition为假时,进入TASK_UNINTERRUPTIBLE;

wait_event_interruptible(queue, condition)

当condition为假时,进入TASK_INTERRUPTIBLE;

wait_event_killable(queue, condition)

当condition为假时,进入TASK_KILLABLE

  • 无条件睡眠

    sleep_on(queue)

    interruptible_sleep_on(queue)



唤醒

wait_up(queue)

唤醒所有进程(TASK_UNINTERRUPTIBLE,TASK_INTERRUPTIBLE,TASK_KILLABLE)

wait_up_interruptible(queue)

唤醒TASK_INTERRUPTIBLE的进程

时间: 2024-10-12 16:15:07

国嵌内核驱动进阶班-7-2(内核等待队列)的相关文章

国嵌内核驱动进阶班-7-1(Ioctl设备控制)

ioctl 控制设备 除了读写设备之外,其他功能的实现需要ioctl.如串口的波特率的设定. 用户空间: ioctl的应用 api int ioctl(int fd, unsigned long cmd, ...) fd 文件描述符 cmd 发送的命令 ...依赖cmd命令 内核空间 api int (*ioctl)(struct inode *inode, struct file *flip, unsigned int cmd, unsigned long arg) inode 文件的物理信息

国嵌内核驱动进阶班-7-3(阻塞型字符设备驱动)

为什么阻塞? 在阻塞方式下,写没有足够的空间或读时候没有数据. ※ 阻塞方式是文件读写的默认方式.没有空间或者读时没有数据返回错误. ※残留问题: 驱动程序中全局变量 在不同进程间是共享的吗? 阻塞型设备驱动程序 驱动代码: 1 #ifndef _MEMDEV_H_ 2 #define _MEMDEV_H_ 3 4 #ifndef MEMDEV_MAJOR 5 #define MEMDEV_MAJOR 0 /*预设的mem的主设备号*/ 6 #endif 7 8 #ifndef MEMDEV_N

国嵌内核驱动进阶班-7-4(Poll设备方法)

Poll 与系统select调用相对应 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) Poll设备方法完成流程: 1. 使用poll_wait将等待队列添加到poll_table中 2. 返回描述设备的可读可写的设备掩码. ※ 掩码有: POLLIN 设备可读 POLLRDNORM 数据可读 POLLOUT 设备可写 POLLWRNORM 数据

国嵌内核驱动进阶班-7-1(Ioctl设备控制)--- 测试代码

驱动内容: 1 #include <linux/module.h> 2 #include <linux/types.h> 3 #include <linux/fs.h> 4 #include <linux/errno.h> 5 #include <linux/mm.h> 6 #include <linux/sched.h> 7 #include <linux/init.h> 8 #include <linux/cde

国嵌内核驱动进阶班-7-5(自动创建设备文件)

linux 2.6.13 开始,devfs不存在,udev取代devfs. udev(mdev)存在应用层,可以实现设备文件的自动创建和删除. 过程: 驱动代码调用class_create创建一个class,再为每个设备调用class_create创建对应的设备. ※ 自动创建设备文件需要udev的支持 struct class *myclass =  class_create(THIS_MODULE, "mydriver"); device_create(myclass,NULL,

Linux内核驱动学习(一)----内核简介 | 配置 | 编译| 安装(PC平台下)

Linux体系结构: 由上图知:Linux架构分为用户空间和内核空间 划分成用户空间与内核空间的原因? 保护操作系统,使应用程序和内核拥有不同的权限.为不同的代码制造不同的等级... 内核空间与用户空间是程序执行的两种不同的状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转换 内核的构成: a-->系统调用接口(SCI). b-->进程管理(PM). c-->内存管理(MM) . d-->关于处理器代码(arch) . e-->虚拟文件系统(VFS). f-->

你为什么看不懂Linux内核驱动源码?

学习嵌入式Linux驱动开发,最核心的技能就是能够编写Linux内核驱动.深入理解Linux内核.而做到这一步的基础,就是你要看得懂Linux内核源码,了解其基本的框架和具体实现,了解其内核API的使用方法,然后才能根据自己的需求写出高质量的内核驱动程序. 说易行难,很多新人.甚至工作1-2年的开发者刚接触Linux内核时,别说写了,看内核代码可能都是一脸懵逼:明明是C语言,但是就是看不懂是什么意思,除了根据函数名.函数参数.函数的返回值以及注释,了解整个函数的基本功能外,一旦分析其细节,你会发

linux内核驱动模型

linux内核驱动模型,以2.6.32内核为例.(一边写一边看的,有点乱.) 1.以内核对象为基础.用kobject表示,相当于其它对象的基类,是构建linux驱动模型的关键.具有相同类型的内核对象构成内核对象集,用kset表示,内核对象集也包含自己的内核对象,从而组成层次化的结构.2.用sysfs文件系统导出到用户空间.内核中的所有内核对象组织成树状,以对象属性为叶子.通过sysfs文件系统,将用户空间对文件的读写操作转化为对内核对象属性的显示和保存方法.从而导出内核对象信息,并提供配置接口.

编译天嵌官方的linux-2.6.30.4内核下载到TQ2440开发板不断重启的解决办法

编译天嵌官方的linux-2.6.30.4内核下载到TQ2440开发板不断重启的解决办法 查看了一下开发板启动打印的 LOG 信息,和官方启动 LOG 一对比发现交叉编译器版本不一致.我用的编译器版本是:arm-linux-gcc-4.5.1,而天嵌官方的 zImage.bin 是用arm-linux-gcc-4.3.3编译的.于是网上找了半天arm-linux-gcc-4.3.3没找到,便下载了一个 4.3.2 版本的. 重新编译下载,板子竟然奇迹般可以正常启动了. 但是又出现了新的问题,进入