一、等待队列
可实现调用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);毫秒延时函数