Я сталкивался с этим фрагментом кода, где наносекунды со времен 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?
Кроме того, как можно определить время суток по этим наносекундам?
почему значение этого регистра делится на частоту процессора, а затем
умножить на NANO_PER_SEC?
Это конвертировать единицы
CNTVCT увеличивается каждый такт
частота это такты в секунду
NANO_PER_SEC это наносекунды в секунду
Итак, глядя на единицы:
CNTVCT * NANO_PER_SEC
-------------
frequency
они есть:
clocks * nano/sec
------------------------
clocks/sec
равно (умножение числителя и знаменателя на sec
)
clocks * nano
-------------
clocks
равно (деление числителя и знаменателя на clocks
)
nano
поэтому вам нужно разделить на частоту, чтобы получить секунды и умножить на нано, чтобы сделать его нано секунд
Кроме того, как можно определить время суток по этим наносекундам?
наносекунды — это время загрузки, а не эпоха
Но вы можете получить текущее время суток, вычесть текущие наносекунды, а затем скорректировать с учетом наносекунд вперед