首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86处理器中的时间源

x86处理器中的时间源
EN

Stack Overflow用户
提问于 2012-09-01 16:55:14
回答 3查看 7.8K关注 0票数 6

有人知道可以用来测量时间的x86指令吗?导致任务切换的定时器是否可通过软件访问?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-04 13:00:07

在x86平台上测量时间的方法:

  • 实时时钟-你的操作系统的时间和日期的来源。1秒精度。标准PC中唯一可以用来测量绝对时间的时间源。
  • 8254计数器/计时器 --一种标准的计数器/定时器芯片,自PC问世以来就出现在主板上(现在是芯片组内的一个功能块)。这是IRQ0的传统来源,它是在大多数较老的OSes中执行任务切换的定时器中断。
  • RDTSC组装指令-计数CPU时钟周期。有关使用细节,请参阅Anon发布的答案。对于x86上的时间源来说,这几乎是你能找到的最高精度。然而,它有一些问题的准确性。如果您正在编写程序集,也是最方便的选项。
  • RDTSCP汇编指令-类似于RDTSC,但是序列化的,这解决了RDTSC的一些准确性问题。只在最新的处理器上找到。
  • HPET -围绕个人电脑的核心二重奏时代推出。打算取代值得尊敬的8254。现代OSes将使用它作为任务调度中断(Vista及更高版本)
  • 芯片组中的专有定时器--一些芯片组有专门的定时器,用于电源管理和多媒体功能。有时,您可以为自己的应用程序征用这些,假设您正在处理的是一个固定功能的嵌入式系统,而不是一个通用的PC。

请注意,并不是所有这些选项都可供您使用,具体取决于操作系统和硬件。如果您在现代操作系统(Windows,Linux)下运行,它将根据自己的计时需要控制8254/HPET,因此您将无法使用它们。

在现代操作系统下,通常最好使用操作系统提供的定时功能.操作系统开发人员可能已经解决了许多问题,如果您尝试使用它,您将独自遇到这些问题。(请注意,操作系统可以提供多个定时功能。选择适合您的应用程序的。)

票数 11
EN

Stack Overflow用户

发布于 2012-09-01 17:07:42

您可以使用rdtsc.Just从现值中扣除以前的值来计算时间差。

将处理器的时间戳计数器(64位MSR)的当前值加载到EDX:EAX寄存器中。EDX寄存器用MSR的高阶32位加载,EAX寄存器用低阶32位加载。(在支持Intel 64体系结构的处理器上,每个RAX和RDX的高级32位都被清除。)

这是实现此指令的C代码 :-

代码语言:javascript
复制
unsigned long long int rdtsc(void)
{
   unsigned long long int x;
   unsigned a, d;

   __asm__ volatile("rdtsc" : "=a" (a), "=d" (d));

   return ((unsigned long long)a) | (((unsigned long long)d) << 32);;
}
票数 2
EN

Stack Overflow用户

发布于 2013-01-23 05:29:04

下面是执行此操作的FORTRAN可调用例程:

汇编程序指令RDTSC返回一个64位整数,即自年点开始的CPU时钟计数数。如果FORTRAN有64位整数,则参数KOUNT被声明为整数*8,否则声明为由两个32位整数*4组成的数组。

所以在你的FORTRAN程序中

代码语言:javascript
复制
CALL TIMERR(KOUNT)

在开始时,保存KOUNT的值,然后在末尾重复。然后减去两个64位值来确定经过的时间。我通常只费心减去两个较低的单词,因为我的时间通常小于2^32系统时钟。

它也可以从C呼叫,但我不会说C。

代码语言:javascript
复制
; C This assembler routine looks to FORTRAN like this:
;       SUBROUTINE TIMERR(KOUNT)
;       INTEGER*4 KOUNT(2);  or INTEGER*8 KOUNT
;       ...get a 64-but system time value into KOUNT......
;       RETURN
;       END
;
.Code
_TIMERR@4: RDTSC
         Push Eax
    Push Ecx
    Push Edx
    Mov Ecx, [Esp + 16]
    Mov [Ecx], Eax
    Mov [Ecx + 4], Edx
    Pop Edx
    Pop Ecx
    Pop Eax
    Ret 4
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12229644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档