Linux Kernel 学习笔记11:时间、延时

(本章基于: 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.

例程:
#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=%u\n", HZ);
        jiffies1 = jiffies;
        ssleep(5);
        jiffies2 = jiffies;

        printk(KERN_INFO "jiffies1:%lu\n", jiffies1);
        printk(KERN_INFO "jiffies2:%lu\n", jiffies2);
        printk(KERN_INFO "diff:%lus\n", (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");





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stone8761

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值