Как работает этот расчет?

Я сталкивался с этим фрагментом кода, где наносекунды со времен 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 является регистром циклического счетчика, почему значение этого регистра делится на частоту процессора, а затем умножается на NANO_PER_SEC?

Кроме того, как можно определить время суток по этим наносекундам?

3

Решение

почему значение этого регистра делится на частоту процессора, а затем
умножить на NANO_PER_SEC?

Это конвертировать единицы

CNTVCT увеличивается каждый такт

частота это такты в секунду

NANO_PER_SEC это наносекунды в секунду

Итак, глядя на единицы:

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

они есть:

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

равно (умножение числителя и знаменателя на sec)

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

равно (деление числителя и знаменателя на clocks)

nano

поэтому вам нужно разделить на частоту, чтобы получить секунды и умножить на нано, чтобы сделать его нано секунд

Кроме того, как можно определить время суток по этим наносекундам?

наносекунды — это время загрузки, а не эпоха

Но вы можете получить текущее время суток, вычесть текущие наносекунды, а затем скорректировать с учетом наносекунд вперед

1

Другие решения