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;
}