您的位置:首页 > 运维架构 > Linux

Linux-2.6驱动开发 5 时间,延时

2010-02-09 11:09 288 查看

5 时间,延时

5.1 基本量

HZ 定义了一秒钟的计数
jiffies 当前计数

5.1.1 jiffies与时间参数互相转化

#include <linux/time.h>
 
unsigned long timespec_to_jiffies(struct timespec *value);
void jiffies_to_timespec(unsigned long jiffies, struct timespec *value);
unsigned long timeval_to_jiffies(struct timeval *value);
void jiffies_to_timeval(unsigned long jiffies, struct timeval *value);
unsigned long mktime (unsigned int year, unsigned int mon,
                      unsigned int day, unsigned int hour,
                      unsigned int min, unsigned int sec);
 

5.1.2 获取当前时间

#include <linux/time.h>
void do_gettimeofday(struct timeval *tv);
 
#include <linux/time.h>
struct timespec current_kernel_time(void);

5.2 延时

5.2.1 可跳出延时

#include <linux/wait.h>
long wait_event_timeout(wait_queue_head_t q, condition, long timeout);
long wait_event_interruptible_timeout(wait_queue_head_t q,
                      condition, long timeout);
timeout 是jiffies计数,wait_event_timeout可根据条件跳出,wait_event_interruptible_timeout可根据条件或被中断跳出。
应用:
wait_queue_head_t wait;
init_waitqueue_head (&wait);
condition = 0;
wait_event_interruptible_timeout(wait, condition, delay);

5.2.2 不可跳出延时

#include <linux/sched.h>
signed long schedule_timeout(signed long timeout);
应用:
set_current_state(TASK_INTERRUPTIBLE);

schedule_timeout (delay);

5.2.3 短延时

#include <linux/delay.h>
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
 
void msleep(unsigned int millisecs);
unsigned long msleep_interruptible(unsigned int millisecs);
void ssleep(unsigned int seconds);
 
delay是忙等,在其执行期间,其他进程无法运行;sleep则可空出来让其他进程运行。

5.3 内核定时器

#include <linux/timer.h>

struct timer_list {

        /* ... */

        unsigned long expires;

        void (*function)(unsigned long);

        unsigned long data;

};

 

void init_timer(struct timer_list *timer);

struct timer_list TIMER_INITIALIZER(_function, _expires, _data);

 

void add_timer(struct timer_list * timer);

int del_timer(struct timer_list * timer);

 

说明:expires 是jiffies 数,data 是传给function的参数。

应用:
Struct jit_data
{
  Int prevjiffies;
  timer_list timer;
}
Int main()
{
unsigned long j = jiffies;

unsigned long tdelay = 1000;

 

jit_data * data = (jit_data *)malloc(sizeof(jit_data));

/* register the timer */

data->timer.data = (unsigned long)data;

data->timer.function = jit_timer_fn;

data->timer.expires = j + tdelay; /* parameter */

add_timer(&data->timer);

 

...

 

return 0;
}
void jit_timer_fn(unsigned long arg)
{
    struct jit_data *data = (struct jit_data *)arg;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息