c++ - 这个计算是如何工作的?

标签 c++ timer linux-kernel arm arm64

我遇到过这段代码,其中计算了自 epoc 和自启动以来的纳秒数,但我不知道如何计算?

http://code.metager.de/source/xref/cloudius-systems/osv/arch/aarch64/arm-clock.cc#61

 s64 arm_clock::uptime()  
{
    u64 cntvct;
    asm volatile ("isb; mrs %0, cntvct_el0; isb; " : "=r"(cntvct) :: "memory");

    cntvct = ((__uint128_t)cntvct * NANO_PER_SEC) / this->freq_hz;
    return cntvct; 
}

CNTVCT是循环计数寄存器,为什么这个寄存器的值要先除以CPU频率再乘以NANO_PER_SEC?

此外,如何从这些纳秒中得出时间?

最佳答案

why is the value of this register divided by CPU frequency and then multiplied by NANO_PER_SEC?

就是换算单位

CNTVCT 在每个时钟周期递增

频率是每秒的时钟周期

NANO_PER_SEC 是纳秒每秒

所以看看单位:

CNTVCT * NANO_PER_SEC
-------------
frequency   

他们是:

clocks * nano/sec
------------------------
clocks/sec

等于(分子和分母乘以 sec)

clocks * nano
-------------
clocks

等于(分子和分母除以clocks)

nano

所以你需要除以频率得到秒,然后乘以纳秒得到纳秒

Also, how can Time of day be derived from these nanoseconds?

纳秒是从启动时间开始的,而不是纪元

但是,您可以获取当前时间,减去当前纳秒数,然后向前调整纳秒数

关于c++ - 这个计算是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32481867/

相关文章:

c++ - C/C++ Performance Globals 与 Get/Set 方法

c++ - 在 C++ 中从 CSV 获取数据的最快方法

python - 替代 python 的 time.sleep()

c# - 在 Azure 中使用特定于时间的计时器

c++ - 返回指针的方法,指向在另一个 header 中声明的数组对象,

C++ 套接字 256 字节缓冲区

java - 使用计时器使图像淡入和淡出

linux - cpu_to_le64 有什么作用?

linux - 为什么init进程不能动态创建?

c - 从 linux 内核模块读取或写入时获取未知符号 ***_******(err 0)