Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158380
  • 博文数量: 40
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 355
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-27 18:05
文章分类
文章存档

2011年(1)

2010年(9)

2009年(16)

2008年(14)

我的朋友

分类: LINUX

2008-12-05 12:17:21

长延时(多于一个时钟嘀哒)
 1.忙等待
  while (time_before(jiffies, j1))
       cpu_relax();
 2.让出处理器
  while (time_before(jiffies, j1)) {
       schedule();
   }
 3.超时
  wait_queue_head_t wait;
  init_waitqueue_head (&wait);
  long wait_event_interruptible_timeout(wait_queue_head_t q, condition, long                                  timeout);
  long wait_event_timeout(wait_queue_head_t q, condition, long timeout);
  或者用(避免声明和使用一个多余的等待队列头)
   set_current_state(TASK_INTERRUPTIBLE);
   schedule_timeout (delay);
 

短延时(硬件的反应时间, 涉及到的延时常常是最多几个毫秒)

一、

1.每个体系都实现 udelay,其他的函数可能或者不可能定义; 如果它们没有定义, 提供一个缺省的基于 udelay 的版本,

2.这3个函数都是忙等待; 其他任务在时间流失时不能运行

#include <linux/delay.h>
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);

二、获得毫秒(和更长)延时而不用涉及到忙等待

<linux/delay.h>
void msleep(unsigned int millisecs);
unsigned long msleep_interruptible(unsigned int millisecs);
void ssleep(unsigned int seconds)


msleep 的调用是不可中断的,能确保进程睡眠至少给定的毫秒数

msleep_interruptible可中断,可用队列来唤醒。正常返回为0,唤醒则为剩余的毫秒数

ssleep不可中断

 

阅读(1351) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~