LINUX.ORG.RU

1мс таймер


0

0

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

вот пример

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>

struct sigevent sig_spec;
int flag_stop = 0;
unsigned long int ms_count = 0;
struct itimerspec timer_setting;
timer_t timer_h;

void timer_signal(int sig)
{
ms_count++;
}

void quit_signal()
{
flag_stop = 1;
}

int main(int argc, char *argv[])
{

signal(SIGUSR1,timer_signal);
signal(SIGINT, quit_signal);


sig_spec.sigev_notify = SIGEV_SIGNAL;
sig_spec.sigev_signo = SIGUSR1;

if (timer_create(CLOCK_REALTIME, &sig_spec, &timer_h) < 0)
{
printf("TIMER: timer_create error\n");
return 0;
}


timer_setting.it_value.tv_sec = 0;
timer_setting.it_value.tv_nsec = 1000000;
timer_setting.it_interval.tv_sec = 0;
timer_setting.it_interval.tv_nsec = 1000000;

if (timer_settime(timer_h, 0, &timer_setting,NULL) < 0)
{
printf("TIMER: timer_settime error\n");
return 0;
}

while(flag_stop == 0)
{
sleep(1);
}

timer_delete(timer_h);

printf("MS: %lu\n",ms_count);
return 1;
}

gcc main.c -o main -lrt

и вот чё получается, например:

sh-3.00$ time ./main
MS: 13264

real 0m17.023s
user 0m0.005s
sys 0m0.005s

куда делось ~4 секунды непонятно, всё отработало мгновенно
неужто за 17 секунд такая ошибка набежала...

как в линухе завести чёткий таймер на милисекунду
и без работы напрямую с hpet ибо ядро 2.6.13 (или 15, непомню) и там он вроде как есть (в логах чёто есть) но даже примеры из доков ядра не пашут.


P.S. в офтопике при использовании мультимедиа таймеров милисекунда тикает чётко (+- 10 микросекунд) на такойже матери

anonymous

Планировщик SCHED_{FIFO,RR} поставил? PREEMPT сконфигурил?

Насколько я помню, hr-таймеры были включены в ядро 2.6.16 (hpet в логах - этого мало).

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

SCHED_FIFO не помогает, PREEMPT вообще незнаю как выстовлен, а для soft-realtime системы он должен быть отключен ?
а вообще интересно, какие есть рекомендации по настройки ядра для софт риалтаййм ? (Timer frequency какой должен быть ?)

а если ядро 2.6.13 и hr-таймеров там нет то чудеса со временем это нормально ?

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

> PREEMPT вообще незнаю как выстовлен, а для soft-realtime системы он должен быть отключен ?

Это первое, что надо проверить. Эта опция должна быть включена.

> какие есть рекомендации по настройки ядра для софт риалтаййм ? (Timer frequency какой должен быть ?)

Официальные - ХЗ. Но CONFIG_PREEMPT должна быть определена, и timer frequency должна быть 1000Гц.

> ядро 2.6.13 и hr-таймеров там нет то чудеса со временем это нормально ?

Если при этом timer frequency == 100Гц, то да, это вполне ожидаемо. Вообще, наверное, при кванте 1мс без hr-таймеров это ожидаемо по-любому.

tailgunner ★★★★★
()

а у меня твой код вообще дает в 2 раза меньше тиков чем время:
$ time ./main
MS: 13266

real    0m26.593s
user    0m0.001s
sys     0m0.004s

то есть интервал отсчитывается от срабатывания таймера.

Если заменить it_interval на 1 наносекунду, то такой результат:
$ time ./main
MS: 12329

real    0m12.379s
user    0m0.003s
sys     0m0.003s

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

я щас на домашней проверял

kernel 2.6.20 vanilla, PREEMPT включен, HZ_1000
чипсет i915, в dmesg ничё про hpet нет (пачему ???)

вапче рандом полный, то почти совпадает то меньше почти в 2 раза то просто меньше, я в шоке

если проверить разрядность часов:
struct timespec clock_resolution;
int stat;
stat = clock_getres(CLOCK_REALTIME, &clock_resolution);
printf("Clock resolution is %d seconds, %ld nanoseconds\n",clock_resolution.tv_sec, clock_resolution.tv_nsec);

то у меня 999848 наносекунд


to dilmah:
ты всмыле так сделал ?
timer_setting.it_value.tv_sec = 0;
timer_setting.it_value.tv_nsec = 1;
timer_setting.it_interval.tv_sec = 0;
timer_setting.it_interval.tv_nsec = 1;

у меня что 1 что 1000000, рандом рандомом...(почему оно вообще даёт 1 наносекунду выставить?)

P.S. может ему без HPET так хреново ?

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

> ты всмыле так сделал ?
> timer_setting.it_value.tv_sec = 0;
> timer_setting.it_value.tv_nsec = 1;
> timer_setting.it_interval.tv_sec = 0;
> timer_setting.it_interval.tv_nsec = 1; 

нет.  Так:

timer_setting.it_value.tv_sec = 0;
timer_setting.it_value.tv_nsec = 1000000;
timer_setting.it_interval.tv_sec = 0;
timer_setting.it_interval.tv_nsec = 1;

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

timer_setting.it_value.tv_sec = 0;
timer_setting.it_value.tv_nsec = 1000000;
timer_setting.it_interval.tv_sec = 0;
timer_setting.it_interval.tv_nsec = 1;

также, тиков или меньше или почти как надо

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

> я щас на домашней проверял

> чипсет i915, в dmesg ничё про hpet нет (пачему ???)

> P.S. может ему без HPET так хреново ?

CONFIG_HIGH_RES_TIMERS включен? Соответствующие источники времени (тот же HPET)?

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

вопщем вот что вышло...
в чистом ядре 2.6.20.7 параметра CONFIG_HIGH_RES_TIMERS нет
это странно, ибо в доках про hr-timers чето есть

обновил одну тачку до 2.6.21.1 (vanilla), и оно там есть
пример там погонял, идёт чётко 4+-1 мс
кстати на этой тачке еще и hpet в логах есть, правда чтобы он заработал пришлось обновить биос...

короче вопрос исчерпан с результатом что ниже 2.6.21 ядра hr-timers не пашут (исправьте меня, буду тока рад)
может конечно если накатить rt патчи то и с ядрами подревнее покатит, но както это мутно, заявлено что эти таймеры в ядре есть и всё через них какбы пашет, а результата невидно.

P.S. где настраиваются источники времени ? я не нашёл.

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

> короче вопрос исчерпан с результатом что ниже 2.6.21 ядра hr-timers не пашут (исправьте меня, буду тока рад)

Насколько я понимаю, hr таймеры отделены от источников времени. Сейчас в ванильном ядре есть только источник времени от таймерного прерывания. Так что _таймеры_ в ядре есть, источников времени нет :)

> может конечно если накатить rt патчи то и с ядрами подревнее покатит

Можно попробовать и это: http://www.tglx.de/projects/hrtimers/

Если попробуешь, отпиши о результатах :)

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

извиняёте, не удалось...
хотел поставить patches-2.6.20-hrt-dynticks1.tar.bz2 на vanilla 2.6.20, недаёт, глянул состав патчей, там какието от ванилы какието от mm
старее ядер под рукой нет, на 2.6.21 всё и без них пашет (они поди там уже есть)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.