比较缓存值和当前值时,应该使用下面的宏:
#include<linux/jiffies.h>
int time_after(unsigned long a, unsigned long b);
int time_before(unsigned long a, unsigned long b);
int time_after_eq(unsigned long a, unsigned long b);
int time_before_eq(unsigned long a, unsigned long b);
用户空间的时间表述方法(使用struct timeval和struct timespec)
内核提供以下辅助函数用于完成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);
对真实世界的时间处理通常最好留给用户空间,C函数库为我们提供了更好的支持。
内核提供了将墙钟时间转换为jiffies值的函数:
#include <linux/time.h>
unsigned long mktime(unsigned int year, unsigned int mon, unsigned int day, unsigned int hour, unsigned int min, unsigned int sec);
#include <linux/wait.h>
long wait_event_timeout(wait_queue_head_t q, conditon, long timeout);
long wait_event_interruptible_timeout(wait_queue_head_t q, conditon, long timeout);
上述函数会在给定的等待队列上休眠,但是会在超时(用jiffies表示)到期时返回。
这里的timeout值表示的是要等待的jiffies值。
为了适应这种特殊情况(不等待特定事件而延迟),内核提供了schedule_timeout函数,这样可避免声明和使用多余的等待队列头:
#include <linux/sched.h>
signed long schedule_timeout(signed long timeout);
timeout是用jiffies表示的延迟时间,正常的返回值是0,除非在给定超时值到期前函数返回(比如响应某个信号)。
schedult_timeout要求调用者首先设置当前进程的状态。
int schedule_work(struct work_struct *work);
如果用户读取延迟的设备,工作函数会将自己以延迟模式重新提交到工作队列,这时使用schedule_delayed_work函数:
int schedule_delayed_work(struct work_struct *work, unsigned long delay);