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);毫秒延时函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值