`
isiqi
  • 浏览: 16188174 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

grttimeofday和xtime的定时精度

阅读更多

客户反映,gettimeofday获取的时间us部分总是零
自己修改测试代码有如下结果:
./lpc3250test 1 0 50000
divsor is 1 sec is 0 usec is 50000 ***
current time: sec = 1289836976 usec = 390000 ***
current time: sec = 1289836976 usec = 390000 ***
current time: sec = 1289836976 usec = 390000 ***
current time: sec = 1289836976 usec = 450000 cnt = 1 ***
current time: sec = 1289836976 usec = 450000 cnt = 1 ***
current time: sec = 1289836976 usec = 500000 cnt = 2 ***
current time: sec = 1289836976 usec = 500000 cnt = 2 ***
current time: sec = 1289836976 usec = 550000 cnt = 3 ***
current time: sec = 1289836976 usec = 550000 cnt = 3 ***
current time: sec = 1289836976 usec = 600000 cnt = 4 ***
current time: sec = 1289836976 usec = 600000 cnt = 4 ***
current time: sec = 1289836976 usec = 650000 cnt = 5 ***
current time: sec = 1289836976 usec = 650000 cnt = 5 ***
current time: sec = 1289836976 usec = 700000 cnt = 6 ***
current time: sec = 1289836976 usec = 700000 cnt = 6 ***
current time: sec = 1289836976 usec = 750000 cnt = 7 ***
current time: sec = 1289836976 usec = 750000 cnt = 7 ***
current time: sec = 1289836976 usec = 800000 cnt = 8 ***
current time: sec = 1289836976 usec = 800000 cnt = 8 ***
current time: sec = 1289836976 usec = 850000 cnt = 9 ***
可以发现gettimeofday的us后四位总为零,只能精确到10ms.
调用关系:gettimeofday->sys_gettimeofday->do_gettimeofday.
do_gettimeofday的代码在内核代码的kernel/time/timekeeping.c
函数定义在114行,do_gettimeofday又调用了同一文件中的getnstimeofday。
void getnstimeofday(struct timespec *ts)
{
unsigned long seq;
s64 nsecs;

do {
seq = read_seqbegin(&xtime_lock);

*ts = xtime;
nsecs = __get_nsec_offset();

} while (read_seqretry(&xtime_lock, seq));

timespec_add_ns(ts, nsecs);
}
可见getnstimeofday直接使用了xtime。
现在问题转化为xtime的精度到底如何
在驱动模块中打印current_kernel_time(void)读取的xtime如下:
isoinit, sec:1289833417, ns:950000000
isoinit, sec:1289833417, ns:950000000
isoinit, sec:1289833417, ns:960000000
isoinit, sec:1289833417, ns:960000000
isoinit, sec:1289833417, ns:960000000
isoinit, sec:1289833417, ns:970000000
isoinit, sec:1289833417, ns:970000000

isoinit, sec:1289833425, ns:780000000
isoinit, sec:1289833425, ns:780000000
isoinit, sec:1289833425, ns:790000000
isoinit, sec:1289833425, ns:790000000
isoinit, sec:1289833425, ns:790000000
isoinit, sec:1289833425, ns:800000000
isoinit, sec:1289833425, ns:800000000
多次试验的结果都是最后七位总为零。所以xtime的精度不会超过10ms
现在可以看到gettimeofday和xtime的精度同为10ms。与系统时钟的精度相同(HZ=100).
xtime是一个全局变量。
kernel/time/timekeeping.c中更新xtime的函数为update_wall_time(void)
/**
* update_wall_time - Uses the current clocksource to increment the wall time
*
* Called from the timer interrupt, must hold a write on xtime_lock.
*/
void update_wall_time(void)
{
。。。。。。。。。。。
/* store full nanoseconds into xtime */
xtime.tv_nsec = (s64)clock->xtime_nsec >> clock->shift;
clock->xtime_nsec -= (s64)xtime.tv_nsec << clock->shift;
。。。。。。。。。。。
}
由于此函数是由系统定时中断调用的,所以xtime精度和系统时钟精度相同也就不足为怪了。

总结:getrimeofday和xtime的精度和系统节拍有关,我的系统HZ=100,因此只能精确到10ms。(内核2.6.27.8)

分享到:
评论

相关推荐

    gettimeofday xtime使用总结

    在Linux系统编程中,`gettimeofday`和`xtime`是两个重要的时间相关函数,用于获取当前系统的精确时间。这两个函数在很多场景下都发挥着关键作用,例如计时、性能分析、时间戳记录等。下面我们将深入探讨它们的使用...

    xtime-tworun-Polyline

    综上所述,“xtime-tworun-Polyline”是一个关于利用时间轴进行动态多边形线条动画的设计,涉及到编程、数据绑定、动画控制和性能优化等多个IT领域的知识点。实际应用中,这样的技术可以用于创建引人入胜的数据可视...

    SDK编程笔记_—_计时器篇

    SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_...

    VC6写的获取系统时间源码

    通过这些文件,我们可以了解到这个程序的基本架构和流程:`xtime.cpp`和`xtimeDlg.cpp`中包含了实现获取系统时间的代码,`xtimeDlg.h`定义了对话框类,`xtime.h`可能包含了程序的主入口点和全局变量。`StdAfx.cpp`和...

    xTIMEcomposer-User-Guide (X3766A)译文.pdf

    XMOS 开发工具XTime composer中文用户使用说明书,285页 基于官方文档翻译。初次接触XMOS开发,看中文开发文档效率更高

    Linux时间子系统.docx

    这些文件主要讨论了Linux内核中的时间子系统,包括时钟源...timekeeper结构用于组织与时间相关的数据,包括当前时间(xtime)、单调时间(monotonic time)、原始单调时间(raw monotonic time)和启动时间(boot

    Linux内核程序及功能实现

    这份文档可能详细解释了Linux内核如何处理时间,包括时间戳更新、时钟中断处理和时间精度提升等技术。 "fs.plg"可能是某种插件或工具,可能与分析或调试文件系统相关。而"新建 文本文档.txt"则可能包含了开发者的...

    TimerShutdown:一个简单的Java程序,可让您设置一个计时器,该计时器在达到0时将关闭计算机。它可以通过Windows CMD命令shutdown -s -t XTIME来工作。 它也可以用来取消关机命令。 在Windows 788.110上工作。 不支援Linux

    定时关机简单的Java程序,可让您设置一个计时器,该计时器将在计算机达到0时将其关闭。它可以执行Windows CMD命令shutdown -s -t XTIME; 它也可以用来取消关机命令。 适用于Windows 7/8 / 8.1 / 10。 尚不支持Linux...

    AES.zip_AES_Verilog AES_aes verilog_it

    5. **xtime.v** - 类似于xtime_Ver3.v,但可能是不同版本或实现方式的xtime函数。 6. **Key_Schedule.v** - 密钥扩展模块,将输入的固定长度密钥扩展成多个轮密钥,供加密过程中的每一轮使用。 7. **ShiftRow.v** ...

    aes加密算法自己调试过了

    //xtime用于混合列变换 #define xtime(x) ((x)^(((x&gt;&gt;7)&1)*0x1b)) //密钥的长度为128bit,轮数Nr为10 int Nk=4; int Nr=10; char RoundKey[240];//轮密钥 char Key[32];//主密钥 //S-盒 int sbox[256]= { 0x63,...

    aes256-in-bash:从 code.google.compaes256-in-bash 自动导出

    宏 F 和 FD 以及函数 xtime 被实现为计算表。 F 实际上不再生成,因为它与 xtime 相同(在操作中)。 #define F(x) (((x) &lt;&lt; 1&gt;&gt;7) & 1) * 0x1b)) #define FD(x) (((x) &gt;&gt; 1) ^ (((x) & 1) ? 0x8d : 0)) uint...

    sm2_cpa.zip

    `x2time.v`和`xtime.v`文件可能涉及到了椭圆曲线上的点倍乘算法,如双线性对或双倍操作。这些操作在椭圆曲线密码学中是核心的,因为它们直接影响到加解密的速度。`MAS.v`和`Mul_Mdv_n_operation.v`则可能实现了模乘...

    XMOS reference design_referencexmos_xmosusb_源码

    9. **调试工具和技巧**:XMOS提供了相应的工具链,如XSHELL、XTIME等,用于调试和性能分析。理解如何使用这些工具能加速开发过程。 10. **性能优化**:参考设计可能包含了一些性能优化策略,例如任务调度、内存管理...

    flash8:一帧做出雪景画面

    mc.xtime = random(20); mc.startTime = 0; mc.id = Math.pow(i, 1/2); createSnow(mc, mc.id/2.5, "0xffffff", 20*mc.id); } var loop = function () { updateAfterEvent(); for (var i = 0; i; i++) { var...

    票务系统C++代码.pdf

    - `xtime`:具体时间 - `riqi`:飞行日期 - `yupiao`:余票数量 2. **chengke结构体**: - `xingming`:乘客姓名 - `mima`:密码 - `card`:身份证号 - `zuowei`:座位号 3. **piao结构体**: - `elem`:...

    MATLAB设计_AES-128,192,256算法.zip

    8. xtime.m:可能是一个辅助函数,用于执行GF(2^8)乘法操作,这是AES中的一个重要数学运算。 9. InvShiftRows.m:行逆移位,是AES解密过程中的一步,用于反转加密时的行移位操作。 10. ShiftRows.m:行移位,AES加密...

    16级-上课几道题答案-仅供参考1

    xtime是从系统中取得的时间,一般是从某一历史时刻开始到现在的时间,jiffies是记录着从电脑开机到现在总共的时钟中断次数。 八、子函数调用的实现流程 子函数调用的实现流程是由应用层触发的,然后通过系统调用...

    AES算法介绍,AES算法介绍,AES算法介绍

    AES 加密算法 AES(Advanced Encryption ...* x(十六进制表示为 0x02)乘可以用字节内左移一位和紧接着的一个与 0x1b 的按位模 2 加来实现,该运算暂记为 xtime()。X 的更高次的乘法可以通过重复 xtime() 来实现。

    基于C++实现的线程休眠代码

    这里,我们定义了一个`getSleepTime`函数,它将秒和纳秒转换为`boost::xtime`类型,然后在`test1`和`test2`函数中调用`boost::this_thread::sleep`来休眠线程。 无论是使用Linux原生API还是Boost库,线程休眠都是...

    基于S3的Filey系统Goofys.zip

    $ $GOPATH/bin/goofys  基准测试:使用 goofys --stat-cache-ttl 0 --type-cache-ttl 0 和 s3fs -ostat_cache_expire=1 模拟运行。基准测试详情请看 bench.sh,同时提供 Raw data。测试是在 EC2 c4.xlarge 下...

Global site tag (gtag.js) - Google Analytics