LINUX.ORG.RU

Как вычислить значение маленького временного интервала?


0

0

Red Hat Linux, kernel 2.4.9-13

Как вычислить значение временного интервала с максимальной точностью? Необходимо вычислить, сколько времени прошло с момента получения прерывания в драйвере до передачи управления в прикладуху.

Есть ли функции, позвляющие точно засечь текущее время (что-то типа QueryPerfomanceCounter() и KeQueryPerfomanceCounter() в винде)???

anonymous

Не самый лучший способ, но все-таки: asm rdtsc возвращает в edx:eax текущий такт процессора. Зная частоту процессора можно довольно точно определить временной интервал.

Zak ★★
()

А глобальная переменная jiffies чем некошерна?

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

> просветите: где этот номер тика лежит?
в регистрах процессора еах и edx , извлечь можно так:
asm mov dword ptr result,eax
asm mov dword ptr result[4],edx
где result 64-битное беззнаковое целое (к сожалению я не силен в сях и не знаю как оно пишется, в делфи это int64).

Zak ★★
()

jiffies обновляется раз в 10 миллисекунд, а временной интервал несколько микросекунд. Так что лажа.

Насчет asm rdtsc тоже понятно - считать perfomance counter с проца.... Просто думалось что есть системные вызовы готовые... м-да-да, ну ладно, будем асмить....

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

Помнится, idle не советовал использовать rdtsc по причине того, что частота может сильно плавать(особенно на мобильных процессорах). Правда, на совсем маленьких кусках это, наверное, неактуально.

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

>Просто думалось что есть системные вызовы готовые

Есть почти готовые, появляющиеся после наложения патчей. Поиск в google чего-нибудь типа high resolution timer +linux должен приводить к успеху.

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

>jiffies обновляется раз в 10 миллисекунд, а временной интервал несколько микросекунд. Так что лажа.

>Насчет asm rdtsc тоже понятно - считать perfomance counter с проца.... Просто думалось что есть системные вызовы готовые... м-да-да, ну ладно, будем асмить....

ето уже сделали за тебя. Поройся в /usr/include/ на тему rdtscll()

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

И ещё универсального способа не существует. тоесть поддержка как минимум двух способов в программе должна присутствовать. Если найдёш предыдущий тред на ету тему то упростиш себе жизнь

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

Не поможет

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

cvv ★★★★★
()

Читаем Linux Device Drivers Second edition, глава 6, раздел "Процессоро-зависимые регистры" :

Включив заголовочный файл <asm/msr.h> (machine-specific registers), вы можете использовать следующие макросы:

rdtsc(low,high);

rdtscl(low);

С помощью первого макроса можно прочитать 64-битное значение счетчика в две 32-битовые переменные. Второй макрос читает младшую половину регистра в 32-х битовую переменную, и является достаточным в большинстве случаев. Например, на 500 МГц процессоре переполнение 32-х битового счетчика будет происходить каждые 8.5 секунд. Таким образом, вам не нужно полное значение счетчика, если вы работаете с меньшими временными интервалами.

Следующие строки, например, измеряют время исполнения самого макроса:

unsigned long ini, end;

rdtscl(ini); rdtscl(end);

printk("time lapse: %li\n", end - ini);

Остается непонятным один момент - как получить частоту проца для вылисления времени по количеству тиков?

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

Murr (25.01.2005 15:24:04):

> Помнится, idle не советовал использовать rdtsc по причине того, что частота может сильно плавать(особенно на мобильных процессорах).

Насколько я понимаю существо вопроса, в данном случае время требуется как раз в тиках.

Если же интересует действительно wall-clock, то информация о малом временнОм интервале просто бессодержательна, поскольку интервал этот будет зависеть от нагрузки, погоды и времени суток :)

Die-Hard ★★★★★
()
Ответ на: комментарий от snilga

>Остается непонятным один момент - как получить частоту проца для вылисления времени по количеству тиков?

Можно считывать показания системного таймера i8253/i8254, частота которого 1193181 Гц, если погуглить, то можно найти как на асме до него добратся. Если интервалы меньше 1мкс измерять не нужно, то на rdtsc можно вообще забить.

Zak ★★
()
Ответ на: комментарий от Die-Hard

Die-Hard:

>Насколько я понимаю существо вопроса, в данном случае время требуется как раз в тиках.

>Если же интересует действительно wall-clock, то информация о малом
>временнОм интервале просто бессодержательна, поскольку интервал этот
>будет зависеть от нагрузки, погоды и времени суток :)

IMO, есть смысл поискать внешний источник времени, который и достаточно точный и не зависит от погоды. Вообще, постановка задачи требует системного подхода. ;)

Вполне возможно, что разрешение Programmable Interrupt Timer от Intel вполне устроит (около 1 Мгц вроде). Берем высокий IOPL и ковыряем его напрямую. C Intel TSC есть еще та проблема, что это счетчик процессора, а процессоров бывает много и счетчики на них несинхронизированы в самом общем случае. ;)

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

2Murr(27.01.2005 15:23:53):

Я имел в виду другое: интервал времени с момента получения прерывания в драйвере до передачи управления в прикладуху, замеренный сверхточным внешним секундомером, будет "плыть".

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