概述
(本章基于:
Linux
-4.4.0-37)
jiffies
linux内核根据硬件定时器中断来跟踪时间流动,定时器中断始终按照固定的间隔产生,在linux内核中使用宏HZ表示这个间隔的大小。HZ在<linux/param.h>中定义,表示间隔的频率,即多少次中断表示1秒。
linux内核没发生一次中断,就将64位内核计数器jiffies_64自加1。在32位体系上jiffies是一个32位整型,取jiffies_64的低32位。在64位体系上这两个变量实际上是一个值。jiffies与jiffies_64都是只读的。
延时
#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);
这3个函数提供毫秒、秒级延时,与之前几个函数不同的是它们不涉及忙等待。在进入函数时释放对CPU的占用进入睡眠状态,等延时结束时再被唤醒。msleep与ssleep让进程进入不可中断的睡眠状态,而msleep_interruptible则让进程进入可中断的睡眠状态。msleep_interruptible返回被提早唤醒时剩余的毫秒数,没有被提早唤醒则返回0.
例程:
jiffies
linux内核根据硬件定时器中断来跟踪时间流动,定时器中断始终按照固定的间隔产生,在linux内核中使用宏HZ表示这个间隔的大小。HZ在<linux/param.h>中定义,表示间隔的频率,即多少次中断表示1秒。
linux内核没发生一次中断,就将64位内核计数器jiffies_64自加1。在32位体系上jiffies是一个32位整型,取jiffies_64的低32位。在64位体系上这两个变量实际上是一个值。jiffies与jiffies_64都是只读的。
延时
#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);
这3个函数提供毫秒、秒级延时,与之前几个函数不同的是它们不涉及忙等待。在进入函数时释放对CPU的占用进入睡眠状态,等延时结束时再被唤醒。msleep与ssleep让进程进入不可中断的睡眠状态,而msleep_interruptible则让进程进入可中断的睡眠状态。msleep_interruptible返回被提早唤醒时剩余的毫秒数,没有被提早唤醒则返回0.
例程:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/delay.h>
static void
hello_cleanup(void)
{
}
static __init int hello_init(void)
{
long unsigned int jiffies1, jiffies2;
printk(KERN_INFO "HZ=%un", HZ);
jiffies1 = jiffies;
ssleep(5);
jiffies2 = jiffies;
printk(KERN_INFO "jiffies1:%lun", jiffies1);
printk(KERN_INFO "jiffies2:%lun", jiffies2);
printk(KERN_INFO "diff:%lusn", (jiffies2 - jiffies1) / HZ);
printk(KERN_ALERT "hello init success!n");
return 0;
}
static __exit void hello_exit(void)
{
hello_cleanup();
printk(KERN_WARNING "helloworld exit!n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Stone");
最后
以上就是傻傻灯泡为你收集整理的Linux Kernel 学习笔记11:时间、延时的全部内容,希望文章能够帮你解决Linux Kernel 学习笔记11:时间、延时所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复