当前位置: 首页 > news >正文

linux驱动编程——等待队列

一、等待队列

可实现调用read函数时阻塞等。

1、流程

(1)初始化等待队列头(带参宏)

init_waitqueue_head(q)

        等待队列头wq数据类型: wait_queue_head_t,等待条件condition:int型变量。

(2)阻塞程序(带参宏)

wait_event_interruptible(wq, condition)

注:condition = 0时阻塞程序;condition =1时解除阻塞。

(3)解除阻塞

 wake_up_interruptible(wait_queue_head_t *q)

eg:

【定义wq与condition】

【模块加载时初始化等待队列】

【需要阻塞时调用等待函数】

【需要结束等待时唤醒程序】

二、中断顶半部和底半部

1、上半部

(1)特点:

①要处理的内容希望其他中断打断
②要处理的任务对时间敏感
③要处理的任务与硬件有关

2、下半部

除了上述三点以外的其他任务,优先考虑放到下半部。中断处理过程比较耗时的代码。

三、内核定时器

系统全局变量:①HZ:HZ是一个节拍,每秒钟产生200次。

②jiffies:记录了自系统启动以来到当下总共产生了多少次节拍;这个数随着时间的推进每秒钟增加200。

如:jiffies + n * HZ,表示未来n秒以后。

我们关注:

(1)结构体struct timer_list

①expires:这个就是那个未来的时刻,可以设置为jiffies + n * HZ表示n秒之后
②function:函数指针,就是当时间到了以后要执行的代码,类型为void (*)(unsigned long n);这个函数带一个参数,参数传递的是下一个成员data
③data:function成员的参数

(2)初始化

#define init_timer(timer)

(3)启动定时器

void add_timer(struct timer_list *timer)

注:等到时间一到就会调用function所指向的函数。

(4)删除定时器

int del_timer(struct timer_list * timer)

注:此外linux还提供了另外几个延时函数:
1. void ndelay(unsigned long nsecs) ;纳秒延时函数
2. void udelay(unsigned long usecs) ;微秒延时函数
3. void mdelay(unsigned long mseces);毫秒延时函数


http://www.mrgr.cn/news/40079.html

相关文章:

  • 如何利用 StarRocks 加速 Iceberg 数据湖的查询效率
  • 【C++篇】启航——初识C++(下篇)
  • MongoDB的查询/超详细/表达式符号
  • 脸爱云管理系统存在任意文件上传漏洞
  • 【C++算法】8.双指针_三数之和
  • Ubuntu VSCode Docker 权限
  • 深入浅出MySQL事务处理:从基础概念到ACID特性及并发控制
  • YOLO11震撼发布!
  • ubuntu server 常用配置
  • “顶级”面试官告诉你 这些Java 面试问题一定有
  • Windows环境Apache httpd 2.4 web服务器加载PHP8:Hello,world!
  • 【微服务】前端微服务qiankun 2.x主子应用通信代码片段
  • SystemC学习(一)——环境安装
  • 软件设计师——计算机网络
  • 两个示例分析系统优化的选择
  • 【微信小程序前端开发】入门Day01 —— 小程序页面组成、组件使用及协同开发发布指南
  • 解决$‘r‘ command not found或者文件夹显示’tvsf 33‘$‘r‘
  • USB 3.1 标准 A 型插头到 USB 3.1 Micro-B 型插头电缆组件的电线连接
  • 裸金属服务器与虚拟机、物理机区别
  • 2024年9月30日随笔