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()
.