测定Linux内核100ms的时钟滴答数

原创 2007年09月20日 10:51:00
     在《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内核分析笔记之系统滴答定时

linux0.11内核中滴答时钟被设置成10ms一个系统滴答。从而执行中断程序 timer_interrupt          ↓ jiffies++;//用于记录系统总共运行的时钟数 ↓ ...
  • LEAD_SOLO
  • LEAD_SOLO
  • 2015年03月29日 13:01
  • 663

利用系统滴答时间计算实际程序运行时间

1、前言 测试一个程序的执行时间,时间包括用户CPU时间、系统CPU时间、时钟时间。之前获取之前时间都是在程序的main函数用time函数实现,这个只能粗略的计算程序的执行时间,不能准确的获取其他时...
  • yu132563
  • yu132563
  • 2016年12月07日 22:01
  • 1043

Linux内核配置选项简介

Linux内核配置选项简介   Gentoo Linux Gentoo内核(gentoo-sources)特有的选项 Gentoo Linux support CONFI...
  • shengzhadon
  • shengzhadon
  • 2016年06月02日 16:09
  • 7847

linux时间函数总结

linux下常用的时间函数: 读取时间函数:gettimeofday,time,ftime 时间格式转换函数:ctime/ctime_r,localtime/localtime_r, asctime/...
  • tsx86
  • tsx86
  • 2015年11月21日 17:27
  • 2634

Linux 获取时间的方法

时间的头文件 #include 关于时间的类型: time_t   long 型,表示从1970年1月1日到现在经过的秒数。 struct tm {           int tm_...
  • zhuxiaoping54532
  • zhuxiaoping54532
  • 2017年08月31日 20:02
  • 325

LINUX中的中断处理

一)、基本概念 1、安装中断处理程序 系统中中断信号线很有限,有时只有15或16根。内核维护了一个类似于I/O端口注册表的中断信号线的注册表。一个模块可以申请一个中断请求IRQ,处理完以后...
  • wh8_2011
  • wh8_2011
  • 2015年12月04日 18:45
  • 1780

linux下三种MS级定时器的实现

方法1和3已经经过测试,方法2未测试,有几个中断函数中的宏不知道应该在哪个头文件中,请有知道的可以教下.1.通过系统调用 /*mytimer.c----提供50ms,10ms计数器*/ #includ...
  • apn172
  • apn172
  • 2010年12月10日 17:30
  • 1050

时钟滴答定时器(sysclk)用法详解

目录: 概述:本篇博客针对sysclk内核定时器(时钟滴答定时器)的常见用法进行总结,分别实现sysclk的定时、延时、计时功能,全部为代码,寄存器描述需参考《Cortex-M3 权威指南》。 平台:...
  • Golf_research
  • Golf_research
  • 2016年10月03日 04:06
  • 2995

Linux应用层查看系统时间的方法

系统时间,硬件时间,UTC时间,本地时间,查看、修改系统时间和硬件时间的方法,计算系统时间的应用程序。...
  • c406495762
  • c406495762
  • 2016年03月26日 17:48
  • 3040

linux获取进程执行时间方法

linux获取进程执行时间有两种方法可以获取,第一种是用time命令,time 进程。第二种是通过在程序中进行记录,首先利用sysconf函数获取时钟滴答数,再用times获取tms结构,详细看下面的...
  • linyangspring
  • linyangspring
  • 2015年12月24日 08:58
  • 299
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:测定Linux内核100ms的时钟滴答数
举报原因:
原因补充:

(最多只允许输入30个字)