如何在应用程序里面高效的读取jiffies值,希望在几十个时钟周期内搞定。

guoj1997 2008-09-05 12:12:48
想在Linux下实现一个类似Windows的GetTickCount()函数。
精度要求只要和系统的时间片一致就行,因为要频繁调用,所以一定要高效。

我用gettimeofday()实现了一个,精度满足要求,但效率太低,经过测试,平均耗费15000个时钟周期。但WIN32的GetTickCount()就几十个时钟周期。
我想到直接读取系统的jiffes值,但在应用程序空间不知如何获得读取它的内存地址。
/proc/uptime其实就是jiffes值,但用文件方式读取它同样很低效(/proc/uptime文件无法做内存映射文件,不能按照内存地址直接读取)。能把操作系统的jiffes变量的地址映射到用户空间是最好了。

向各位linux高手求救,谢了!
...全文
1031 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
guoj1997 2008-09-08
  • 打赏
  • 举报
回复
多谢x86的回答,但是你的例子里面好像还是没有说明遇到变频CPU时怎么处理?不知有没什么办法?
blackbillow 2008-09-08
  • 打赏
  • 举报
回复
Mark
guoj1997 2008-09-08
  • 打赏
  • 举报
回复 1
我已经找到把系统jiffies变量映射到应用程序空间的方法。

1、到/boot目录下找到内核启动的映像符号表文件。如:System.map-2.6.15-1.2054_FC5smp
2、打开映像符号表文件,找到jiffies变量的偏移地址。格式为:c03bdc00 D jiffies
3、读取偏移值(0xc03bdc00)到变量offset,offset -= 0xc0000000;
4、fd = ::open("/dev/mem", O_RDONLY);
5、p = ::mmap(0, 0x10000, PROT_READ, MAP_SHARED, fd, (off_t)(offset - offset%0x10000));
6、volatile unsigned long* pJiffies = (volatile unsigned long*)((char*)p + offset%0x10000);
以后就可以用*pJiffies来读取jiffies值了。

还有一点需要注意,如果要用jiffies来定时的话,还需要比较精确的测定jiffies的频率,这个方法很多,就不详述了。
x86 2008-09-05
  • 打赏
  • 举报
回复
google了一下,居然搜到了自己的文章,嘿嘿。
给你参考一下:
http://blog.csdn.net/x86/archive/2008/04/08/2260190.aspx
x86 2008-09-05
  • 打赏
  • 举报
回复
试一下直接的rdtsc指令,大致在10个指令周期左右。
不知道是否需要考虑降频的问题,因为CPU的频率并不是固定的,可以通过指令人为的的降低。

#include <stdio.h>

int get_rdtsc() {
asm("rdtsc");
}

int main() {
int i;
for(i=0;i<10;i++) {
int t1 = get_rdtsc();
sleep(1);
int t2 = get_rdtsc();

printf("t2 - t1 = %ld (%ldMHZ)\n", t2 - t1, (t2-t1)/1000000);
}
}

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧