在《Linux设备驱动程序》(第3版)中使用了以下代码实现了一种简单的、对精度要求不高的延时:
    while ( time_before( jiffies, j1 ) )
        cpu_relax();
    该程序主要利用Linux系统使用jiffies计数器记录时钟滴答数,给j1赋值将要延迟终止的jiffies值,若当前jiffies值到达j1时,则程序将退出循环,继续执行后续代码。但j1值设定为多少呢?书中未介绍。延迟一般习惯以时间为单位,如休眠多少秒或毫秒。而对不同的linux系统和不同的计算机硬件,时钟滴答的时间间隔是不一样的。本文编写了一个驱动,用于测定100ms的时钟滴答数。若测定出该值,要延迟多少时间,就很方便转换的需要延迟的时钟滴答数了。

// sumjiffies.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h> // printk()
#include <linux/sched.h>  // jiffies, HZ
#include <linux/delay.h>  // mdelay()

#define REPEAT_TIMES 10

static int __init sumjiffies_init(void)
{
    unsigned long start_jiffies, stop_jiffies, sum_jiffies;
    int i;
    printk( KERN_ALERT "sumjiffies load .../n" );
    sum_jiffies = 0;
    for ( i=0; i<REPEAT_TIMES; i++ )
    {
        start_jiffies = jiffies;
        mdelay(100);
        stop_jiffies = jiffies;
        sum_jiffies += (long)stop_jiffies - (long)start_jiffies;
        printk( KERN_ALERT "[%d] stop_jiffies - start_jiffies = %ld - %ld = %ld/n",
                            i, stop_jiffies, start_jiffies, (long)stop_jiffies - (long)start_jiffies );
    }
    printk( KERN_ALERT "average jiffies of 100ms: %ld/n", sum_jiffies / REPEAT_TIMES );
    return 0;
}

static void __exit sumjiffies_exit(void)
{
    printk( KERN_ALERT "Goodbye/n" );
}

module_init( sumjiffies_init );
module_exit( sumjiffies_exit );

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("ThinkerABC");

以下是对上述程序sumjiffies.c在linux kernel 2.4环境下编译和运行结果。

[root@a ~]# gcc -O2 -Wall -DMODULE -D__KERNEL__ -I /usr/src/linux/include/ -c sumjiffies.c
[root@a ~]# insmod sumjiffies.o
[root@a ~]# lsmod sumjiffies
Module                  Size  Used by    Not tainted
sumjiffies               576   0  (unused)
[root@a ~]# rmmod sumjiffies
[root@a ~]# dmesg
sumjiffies load ...
[0] stop_jiffies - start_jiffies = 69624 - 69573 = 51
[1] stop_jiffies - start_jiffies = 69674 - 69624 = 50
[2] stop_jiffies - start_jiffies = 69725 - 69674 = 51
[3] stop_jiffies - start_jiffies = 69776 - 69725 = 51
[4] stop_jiffies - start_jiffies = 69827 - 69776 = 51
[5] stop_jiffies - start_jiffies = 69878 - 69827 = 51
[6] stop_jiffies - start_jiffies = 69928 - 69878 = 50
[7] stop_jiffies - start_jiffies = 69979 - 69928 = 51
[8] stop_jiffies - start_jiffies = 70030 - 69979 = 51
[9] stop_jiffies - start_jiffies = 70081 - 70030 = 51
average jiffies of 100ms: 50
Goodbye
[root@a ~]#

从以上运行结果中可知在我的实验机中,100ms的平均时钟滴答数为50。

如果要使我的实验机上运行的Linux模块中延迟约1秒,这只需使用以下代码即可:
    j1 = jiffies + 500;
    while ( time_before( jiffies, j1 ) )
        cpu_relax();

测定Linux内核100ms的时钟滴答数相关推荐

  1. linux c设置rtc时间,linux内核的rtc时钟配置

    linux内核的rtc时钟配置,见Device Drivers  --->Real Time Clock .我们的RTC主要是有三种接口配置,一种是I2C接口,一种是SPI接口,还有就是CPU自 ...

  2. linux 内核中断与时钟的冲突 问题 del_timer,Linux内核开发之中断与时钟(三)

    晚上7点10分.. "小涛哥,这章不是叫Linux设备驱动程序之中断与时钟,前边你讲了中断,还给了我很多模版,我都看懂了,这次是不是要开始讲时钟了.." "真聪明,越来越 ...

  3. linux内核配置高精度时钟,关于linux内核中使用的时钟

    linux内核里面用了很多的时钟,其实这些时钟的用处无外乎就几种:1.作为心跳,中断cpu:2.使得用户可以获取当前时间:3.实时测量:4.定时 服务.知道了使用目的后,我们来看看到底有哪些时钟供我们 ...

  4. linux内核时钟驱动,4.9版本的linux内核中实时时钟芯片pcf85263的驱动源码在哪里

    SQL添加维护 计划失败 在sql要求数据库每天自动备份这个是大家都会遇到的问题,我遇到了这个问题如图: 是因为这个服务组件没有安装 CSS Hack汇总快查(CSS兼容代码演示) 文章出处和来源网址 ...

  5. Linux内核中断底半部处理--工作队列

    工作队列的使用过程: 工作队列相关函数介绍: #include <workqueue.h> /*头文件包含*/ 1.工作队列的创建及销毁: 定义一个工作队列结构体指针 static str ...

  6. linux内核c语言笔试,C语言之linux内核--BCD码转二进制与二进制转BCD码(笔试经典)...

    在分析代码之前,我们先来了解一下,BCD码和二进制到底区别在哪? 学习过计算机原理的和数字电子技术这两门课的都会知道这两个到底是什么含义,也有的同学学过了,考过了,过了一段时间又忘记了,今天,我们通过 ...

  7. (十)linux内核时钟

    目录 一.什么是内核时钟 二.HZ 三.jiffies 四.linux中的延时函数 五.内核的动态定时器 六.附录 一.什么是内核时钟 1.内核时钟 操作系统的内核都需要一个系统时钟才可以工作,这个系 ...

  8. linux内核时钟工作原理,需要学习并了解Linux时钟的原理及其应用

    一.前言 时钟或者钟表(clock)是一种计时工具,每个人都至少有一块,可能在你的手机里,也可能佩戴在你的手腕上.如果Linux也是一个普通人的话,那么她的手腕上应该有十几块手表,包括:CLOCK_R ...

  9. 火牛单片机rtc时钟配置_RTC 实时时钟驱动 - Linux内核之我的天下 - CSDN博客

    RTC实时时钟驱动 -------I2C软件模拟通信 内核版本: linux-2.4.21 文档设计:侯辉华 版本: 1.01 时间: 2007/06/10 内容简介:介绍接在I2C总线上RTC实时时 ...

最新文章

  1. 大数据之Python入门语法基础
  2. 模型树——就是回归树的分段常数预测修改为线性回归 对于非线性回归有较好的预测效果...
  3. 4.1 Tensorflow:卷积函数
  4. C#复习笔记(4)--C#3:革新写代码的方式(Lambda表达式和表达式树)
  5. fastai学习笔记——安装
  6. php curl如何解决分页,一段PHP的分页程序,报错,该如何解决
  7. 在Eclipse中搭建Python开发环境
  8. java列表展开折叠,jQuery Datatables rowGroup折叠/展开
  9. 记录用HDFview和Panoply软件打开nc文件
  10. MySQL之字符串拼接
  11. VSCode下载安装和配置Java环境
  12. 匿名电子邮件转发系统
  13. Win8之常用快捷键(1)
  14. 【转载】堆排序算法(图解详细流程)
  15. 幼儿园数学目标_幼儿园数学区目标
  16. XTU 设置教程 自动化 睡眠 休眠
  17. 儿童保温杯市场前景分析及行业研究报告
  18. Android之高德地图SDK配置及简单使用详解
  19. 如何让你的内网服务器可以被外网访问到(端口映射、NAT、域名解析、IP地址)
  20. 中国移动CMPP、联通SGIP和电信SMGP的短信协议

热门文章

  1. Prometheus客户端节点监控node_exporter
  2. Mac使用Docker安装artemis
  3. 使用BoundsChecker查找内存泄露
  4. 西瓜书课后11.1(Relief算法)
  5. 供电公司业扩工程项目管理(原创)
  6. 【ACWing】909. 下棋游戏
  7. win10升级win11后office文件无法直接打开的问题
  8. PreTranslateMessage详解
  9. phpstudy构建数据库
  10. VsCode使用笔记【1】Ubuntu+vscode+Monokai+修改主题中的字体颜色