C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Задержка в микросекундах, винды могут ткое?
** klen
Отправлено: 01.07.2005, 12:42


Не зарегистрирован







Необходимо сформировать задержки с разрешением в микросекунды(или чуть хуже). Стандартный вызов Sleep работает с разрешением в 1 милисекунду. Вынь наверняка имеет API тока я его не знаю.
Програмные задержки не подходять — на разных машинах работать должно.
Как проблему решить?
Gedeon
Отправлено: 01.07.2005, 13:45


Ветеран

Группа: Модератор
Сообщений: 1742



Посмотрите в MSDN Multimedia Timers может поможет
Asher
Отправлено: 01.07.2005, 14:07


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Смотри работу с
QUOTE
SetWaitableTimer
The SetWaitableTimer function activates the specified waitable timer. When the due time arrives, the timer is signaled and the thread that set the timer calls the optional completion routine.

BOOL SetWaitableTimer(
 HANDLE hTimer,
 const LARGE_INTEGER* pDueTime,
 LONG lPeriod,
 PTIMERAPCROUTINE pfnCompletionRoutine,
 LPVOID lpArgToCompletionRoutine,
 BOOL fResume
);

Parameters:
...
pDueTime
[in] Time after which the state of the timer is to be set to signaled, in 100 nanosecond intervals. Use the format described by the FILETIME structure. Positive values indicate absolute time. Be sure to use a UTC-based absolute time, as the system uses UTC-based time internally. Negative values indicate relative time. The actual timer accuracy depends on the capability of your hardware. For more information about UTC-based time, see System Time.
...
** klen
Отправлено: 01.07.2005, 22:44


Не зарегистрирован







Нифига c SetWaitableTaimer не получится

QUOTE

lPeriod
Specifies the period of the timer, in milliseconds. If lPeriod is zero, the timer is signaled once. If lPeriod is greater than zero, the timer is periodic. A periodic timer automatically reactivates each time the period elapses, until the timer is canceled using the CancelWaitableTimer function or reset using SetWaitableTimer. If lPeriod is less than zero, the function fails.


про сто наносекунд это про проблемы точности срабатывания таймера изза преключения потоков.

Протрахался 2 часа, пришел к выводу что масдай по человечи такое не способен.....растроился.... полазил по ядру нашел функцию ZvDelayExecution или что тоже самое NtDelayExecution , далее примерно так

NTSTATUS KeDelayExecutionThread (KPPROCESSOR_MODE WaitMode, BOOLEAN Alertable, PLARGE_INTEGER TimeInterval)  — разрешение функции 100 наносекунд, эта функция доступна в режиме ядра. Воспользоватся данной функцией довольно сложно — нужно писать драйвер.

VOID KeStallExecutionProcessor (ULONG IntervalCount) -задержка выполнения потока в интервале 0....50мкс.
Георгий
Отправлено: 01.07.2005, 23:01


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



можно попробовать в цикле rdtsc выполнять и как только на 1 мкс тактов наберётся

алгоритм что то вроде такого:
инициализация:
1. запомнить значение rdtsc
2. sleep 1
3. вычислить разность rdtsc и сохранённого значения
в результате получена частота процессора тактов/сек которую делим на 10e6 получаем тактов за мкс (z)

реализация мкс задержки:
1. запомнить rdtsc
2. пара nop
3. считать rdtsc и вычислить разность
4. cmp z
5. jl 2
6. ret

правда не эффективное использование проца... но если такая программа будет одна крутиться на компе, да ещё и эти задержки не 10e6 раз в секунду надо будет делать, то, думаю, прокатит (с вероятностью около 1 сбоя на 10e5 испытаний)

Отредактировано Георгий — 02/07/2005, 00:12
Guest
Отправлено: 01.07.2005, 23:17


Не зарегистрирован







Не не не , Георгий.
Это порочный подход не дающий ничего. Не прокатывает.
1. Проц занят.
2. Первое не так страшно, главное что все равно ничего не получится!!! Винды переключают нити с периодом ~10мс , поэтому нить должна быть realtimepriority или одна на всей машине!! нериализуймо не то не другое. Остается использовать API драйверов если — тут 100 нс обесчается по чесному — нить блокируется шедулером а через нужное время отпускается. Поскольку приложения в отличие от драйверов по другому переключаются то на приложениях такой точности не предоставляется.
Георгий
Отправлено: 02.07.2005, 00:34


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



драйвер — это уже тяжёлая артиллерия smile.gif
набор функций предоставляемых ядром для драйверов меняется чуть ли с каждой ОС: 95-98-NT-2000-xp

PS. я правильно понял, что драйверы работают в режиме реального времени т.е. с гарантированными временами отклика? если это так, то винду можно превратить в ОСРВ — сделать обёртку — псевдо драйвер, что для дочерних процессов (напр запущенных из dll) предоставляет сервисы с гарантированными временами?

PPS. точно угадал — можно сделать такой крутой псевдодрайвер http://citforum.cn.ua/operating_systems/rtx/gl_1.shtml
PPPS. подозреваю, что эта библиотечка и с инверсией приоритетов борется

они до сих пр живы http://www.directinsight.co.uk/products/ve...turcom/rtx.html

RTX enables Windows NT/ Windows 2000/Windows XP to function as both a general-purpose operating system and a high-performance real-time operating system — at the same time, on the same computer. With RTX, Windows NT/ Windows 2000/Windows XP truly extends "across the enterprise" — from performing control operations on the factory floor to serving applications and data to the corporate enterprise.

Отредактировано Георгий — 02/07/2005, 02:13
Guest
Отправлено: 02.07.2005, 09:48


Не зарегистрирован







QUOTE (Георгий @ 02/07/2005, 00:34)
драйвер — это уже тяжёлая артиллерия smile.gif
набор функций предоставляемых ядром для драйверов меняется чуть ли с каждой ОС: 95-98-NT-2000-xp

PS. я правильно понял, что драйверы работают в режиме реального времени т.е. с гарантированными временами отклика? если это так, то винду можно превратить в ОСРВ — сделать обёртку — псевдо драйвер, что для дочерних процессов (напр запущенных из dll) предоставляет сервисы с гарантированными временами?

PPS. точно угадал — можно сделать такой крутой псевдодрайвер http://citforum.cn.ua/operating_systems/rtx/gl_1.shtml
PPPS. подозреваю, что эта библиотечка и с инверсией приоритетов борется

они до сих пр живы http://www.directinsight.co.uk/products/ve...turcom/rtx.html

RTX enables Windows NT/ Windows 2000/Windows XP to function as both a general-purpose operating system and a high-performance real-time operating system — at the same time, on the same computer. With RTX, Windows NT/ Windows 2000/Windows XP truly extends "across the enterprise" — from performing control operations on the factory floor to serving applications and data to the corporate enterprise.

Мжду масдаем и другими ОС пропасть. Концептуальная....а назад уже не воротишь...бедный билли....не смог обьять необъятное....
Asher
Отправлено: 04.07.2005, 08:29


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
lPeriod — это уже потом, зацикливание после первого срабатывания, которое настроено в pDueTime.
Если нужны регулярные отсчеты, то надо lPeriod в ноль, и каждый раз заряжать pDueTime.
Но точность все равно практически нереально получить.
Недетерминированность большая.
FataLL
Отправлено: 11.07.2005, 03:47


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Интересно, чем великих и ужасных не устраивает TTimer? Или сложно решать проблему дело принципа?
Dima
Отправлено: 11.07.2005, 06:49


Дежурный стрелочник

Группа: Участник
Сообщений: 61



Самое точное что может предложить виндоуз это мультимедиа таймер (timeSetEvent). Но его точность 1 миллисекунда, что всетаки точнее чем обычный таймер, точность которого около 50 мс.
Георгий
Отправлено: 11.07.2005, 08:17


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (FataLL @ 11/07/2005, 04:47)
Интересно, чем великих и ужасных не устраивает TTimer? Или сложно решать проблему дело принципа?

тем, что Великим и Ужасным (говорить с придыханием) нужна задержка со временем порядка 10e-6, а TTimer принципиально не способен работать с интервалами лучше 10e-3

Отредактировано Георгий — 11/07/2005, 09:20

Вернуться в Вопросы программирования в C++Builder