在Linux内核模块中能用到的函数比用户空间多,但是它的函数往往被用得很少。当然在内核中叶可以调用用户空间的函数只要直接调用系统调用的封装函数就行,如下:
如调用long gettimeofday(struct timeval tv, struct timezone tz);函数可以直接调用封装体:
_syscall1(long,gettimeofday, struct timeval,tv,struct timezone ,tz);
这个是现在内核的系统调用标准形式,syscall后面接的数字表示这个系统调用类型,系统调用将参数个数的多少进行了分类。
当然也可以直接使用内核特有的函数,这样效率更高:
获得当前时间函数:
头文件: time.h
属性:系统符号导出函数
从jiffies得到时间
void do_gettimeofday(struct timeval *tv);
从xtimer墙上时间得到时间
struct timerspec current_kernel_time(void);
延时:
长延迟
头文件:jeffies.h / time.h
while(time_before(jiffies,jiffies+msecs_to_jiffies(delay_time)){
schedule();
}
纳秒,微妙,毫 秒延迟,必须是短延迟,时间过长会报错
头文件: delay.h
void ndelay(unsigned long nesec);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
void msleep(unsigned int millisecs);
void ssleep(unsigned int seconds);
超时:
头文件: wait.h
long wait_event_timerout(wait_queue_head_t q, condition, long timeout);
long wait_event_interruptible_timerout(wait_queue_head_t q, condition, long timeout);
定时器
头文件:timer.h
定时器数据结构:
struct timer_list{
unsigned long expires; /* 超时时间*/
void (*fun)(unsigned long); /*超时做的事情的函数指针*/
unsigned long data; /*函数数据参数*/
};
初始化定时器
void init_timer(struct timer_list *timer);
添加定时器
void add_timer(struct timer_list *timer);
销毁定时器
int del_timer(struct timer_list *timer);
信号量函数:
头文件:semaphore.h
属性:初始化函数是头文件静态,其他函数时系统符号导出