现在的位置: 首页 > 综合 > 正文

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

2012年05月05日 ⁄ 综合 ⁄ 共 2218字 ⁄ 字号 评论关闭

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;

}

抱歉!评论已关闭.