Linux 驱 动
驱动中延时.................................................................................................................................1
驱动中延时
时间计数 HZ
主时钟中断由内核根据 HZ 这个宏定义来决定,现在 ONT 的 HZ 定义位于 linux/
include/asm-ppc/param.h 中,由此可见,该值一般是由 CPU 体系来设定的。
对用户空间,内核的 HZ 是隐藏的,用户 HZ 始终扩展为 100,对用户来说,确切的
HZ 值只通过/proc/interrupts 的计数值除以/proc/uptime 中报告的系统运行时间。
使用 jiffies 计数器
<linux/jiffies.h> 中 , 包 含 头 文 件 <linux/sched.h> 也 会 同 时 包 含 该 头 文 件 。 jiffies 和
jiffies_64 必须被当作只读变量。当需要记录当前 jiffies 值(被声明为 volatile 避免编译器优
化内存读)时,可以简单地访问这个 unsigned long 变量。一个 jiffies 等于 1/HZ 秒。
一些常用宏定义:
time_after(a, b)
time_before(a, b)
time_after_eq(a, b)
忙等待延时
忙等监视 jiffies 计数,
while (time_before(jiffies, j1))
cpu_relax();
这样的等待方式不仅浪费 CPU 资源,更坏的情况是,如果没有配置内核可抢占模式,
进入循环时如果中断恰好被禁止,jiffies 将不再更新,而导致系统死锁。
让出处理器的等待
头文件<linux/sched.h>中有一个 schedule 函数声明,该函数可以使用为:
while (time_before(jiffies, j1)) {
schedule();
}
该方式只能将处理器让给 ideal 任务?
超时方式的延时
(1) 若驱动使用一个等待队列来等待某些其他事件,并想确保它在一个特定时间段内运
行,可使用等待队列:
#include <linux/wait.h>
long wait_event_timeout(wait_queue_head_t q, condition, long timeout);
评论0
最新资源