内核延时函数接口
延时的函数有delay
和sleep
两种类型:
delay接口
void ndelay(unsigned long nsecs);//纳秒延时
void udelay(unsigned long usecs);//微妙延时
void mdelay(unsigned long msecs);//毫秒延时
sleep接口
void msleep(unsigned int msecs);//毫秒级延时
long msleep_interruptible(unsigned int msecs);//毫秒级延时,可被信号打断
void ssleep(unsigned int seconds);//秒级延时
delay和sleep的区别
delay
型延时:忙等待,占用CPU资源,延迟过程无法进行其他任务。
sleep
型延时:休眠,不占用CPU资源,其它模块此时可以使用CPU资源。
低分辨率定时器
jiffies和HZ
jiffies
:全局变量,表示 系统启动以来产生的节拍数 。每产生一次中断,jiffies
自动加一。
HZ
:赫兹,也叫 节拍率 ,表示 每秒种产生多少次中断 。
例如:HZ
为200
,代表每秒产生200
次中断,那2
秒钟jiffies
的值就应该是400
。因此系统的运行时间可以用jiffies/HZ表示。
一秒钟:jiffies
+ HZ
表示一秒钟
原因:内核中统计时间是通过jiffies,因此要比较时间或者定时也是通过jiffies。
例如程序运行一秒钟,内核如何知道运行了一秒?答案是运行一秒后的jiffies值和运行前的jiffies值进行比较,如果相差为一个HZ,则代表一秒钟。jiffies+HZ其实就是一秒后jiffies的值,所以jiffies+HZ可以间接表示一秒钟。
定时2秒:jiffies
+ 2*HZ
。以此类推
获取当前的jiffies
值,可以用get_jiffies_64()
函数。
将时间转为对应的jiffies
值,可以用msecs_to_jiffies()
等函数,例如msecs_to_jiffies(1000)
代表1秒,函数返回值其实就是HZ
。
相关接口
#include< linux/timer.h >
struct timer_list {
struct list_head list;
unsigned long expires; //定时器到期时间,传入的是jiffies值
unsigned long data; //作为参数被传入定时器处理函数
void (*function)(unsigned long);
};
void init_timer(struct timer_list * timer);//初始化定时器
void add_timer(struct timer_list * timer);//添加一个定时器
int mod_timer(struct timer_list *timer, unsigned long expires);//修改定时器的定时时间expires
int del_timer(struct timer_list * timer);//删除定时器
unsigned int jiffies_to_msecs (const unsigned long j);//将jiffies转为对应的毫秒值
unsigned int jiffies_to_usecs (const unsigned long j);//将jiffies转为对应的微秒值
unsigned long msecs_to_jiffies (const unsigned int m);//将毫秒值转为对应的jiffies
unsigned long usecs_to_jiffies (const unsigned int u);//将微秒值转为对应的jiffies
-
内核
+关注
关注
3文章
1357浏览量
40179 -
接口
+关注
关注
33文章
8435浏览量
150685 -
Linux
+关注
关注
87文章
11196浏览量
208659 -
函数
+关注
关注
3文章
4274浏览量
62302
发布评论请先 登录
相关推荐
评论