LINUX.ORG.RU

непонятки с clock_getres

 ,


0

2

доброй ночи, ЛОР! не подскажете, что за непонятки с clock_getres? программка такая:

#define _POSIX_C_SOURCE 199309L                                                     
#include <stdio.h>                                                                  
#include <time.h>                                                                   
                                                                                    
int main()                                                                          
{                                                                                   
    struct timespec ts;                                                             
                                                                                    
    clock_getres(CLOCK_REALTIME, &ts);                                              
    printf("CLOCK_REALTIME resolulion is %d.%09ld\n", ts.tv_sec, ts.tv_nsec);       
                                                                                    
    clock_getres(CLOCK_MONOTONIC, &ts);                                             
    printf("CLOCK_MONOTONIC resolulion is %d.%09ld\n", ts.tv_sec, ts.tv_nsec);   
}
и ее выхлоп: $ ./clock_getres

CLOCK_REALTIME resolulion is 0.000000001

CLOCK_MONOTONIC resolulion is 0.000000001

что за мизерное значение? не может же прерывание от таймера работать с такой частотой, или это всё из-за «CONFIG_NO_HZ=y»?

что за мизерное значение?

resolution != precision. все, что ты узнал этим кодом — показания твоего clocksource будут делиться на 1. могло быть и хуже, особенно в старом эмбеддед.

хочешь узнать точность? замерь разницу между двумя отличающимися значениями хотя бы, будет о чем поговорить.

t184256 ★★★★★ ()
Ответ на: комментарий от metawishmaster

Я так понял, ты хочешь узнать, насколько реально плавно дергается «наносекундная стрелка» твоего clocksource? Замерь. Смотри показания какого-нибудь clock_gettime в цикле, запоминай. Потом выводи и анализируй масштабы скачков.

Если я понял неправильно, то задай вопрос.

t184256 ★★★★★ ()
Ответ на: комментарий от t184256

да вообще, задача стоит портировать виндовский код

timeGetDevCaps(&tc, sizeof(tc));
timerPeriod = tc.wPeriodMin;


// но сейчас мне что-то кажатся, что зря я пропустил главу «Kernel Timers» в LDD, хоть и задача сейчас в юзер-спейсе %)

metawishmaster ★★★★ ()
Последнее исправление: metawishmaster (всего исправлений: 2)

что за мизерное значение?

типичное для hrtimer 1 ns

https://elinux.org/High_Resolution_Timers#How_to_detect_if_your_timer_system_supports_high_resolution

не может же прерывание от таймера работать с такой частотой

может даже чаще. Есть два типа таймеров

1 периодический - долбит с заданной частотой CONFIG_HZ и постоянно генерирует прерывания без перепрограммироавния - в старых ядрах был только такой

2 интервальный - ему можно задать динамически любой интервал, работает однократно, нужно перепрограммировать после срабатывания прервания - на них делают CONFIG_NO_HZ

anonymous ()