Почему у нас есть грубые варианты ktime_get в Linux ядре? - PullRequest
0 голосов
/ 11 февраля 2020

Я проходил по следующей ссылке:

https://www.kernel.org/doc/html/latest/core-api/timekeeping.html

У нас есть как грубые (ktime_get_coarse()), так и не грубые (ktime_get()) версии.

Какой из них следует использовать и когда?

Это говорит о том, что грубые версии работают быстрее, чем не грубые версии.

Читают ли грубые версии счетчик аппаратного обеспечения или нет?

1 Ответ

4 голосов
/ 11 февраля 2020

Q:

Какой из них мы должны использовать и когда?

Кажется, это хорошо описано по вашей ссылке.
A:

Это быстрее, чем не грубые версии, но менее точные.

Так что, если вам нужно быть быстрым, и вам не нужна точность - используйте грубую (будет правильная неточность) до 10 мс при 100 Гц и до 1 мс при 1000 Гц). Если точность является приоритетом, тогда используйте не грубый API.


Q:

Показывает ли не грубая версия счетчик аппаратного обеспечения или нет?

A:
ktime_get() (в отличие от ktime_get_coarse()) в конечном итоге вызывает timekeeping_get_delta(), который считывает источник синхронизации с tk_clock_read():

static inline u64 tk_clock_read(const struct tk_read_base *tkr)
{
    struct clocksource *clock = READ_ONCE(tkr->clock);

    return clock->read(clock);
}

Внутри него вызывается соответствующий обратный вызов для считывания аппаратного таймера.
Вы можете искать такие обратные вызовы в ваших источниках, просматривая источники синхронизации: grep -rnI 'read =' drivers/clocksource.
Например здесь - установка tpu_clocksource_read().

...