![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
высокоточный таймер
Сергей222 © (2003-08-18 19:31:00)
Требуется с частотой до 10000 Гц производить чтение/запись в порт. Читал в форуме про функции QueryPerfomanceCounter, QueryPerfomanceTimer но что то у себя не нашел ни в справке ни в .pas файлах такой функции, Delphi 6 ее не знает??
Сейчас пользуюсь timeSetEvent(), которая неплохо работает с частотой до 1000 Гц, бывают задержки до 2-3мс.
NightAngel (2003-08-22 22:55:00) [1]
Не надо никуда лезть. Если пишете под Win9x, здесь непосредственно доступна на запись IDT что делает всё лёгким и удобным. Делаем следующее:
1. Создаём свой обработчик прерываний от таймера.
2. Вписываем его дескриптор на место стандартного.
Что он должен делать:
I. Инициализация:
1. Определить с какой скоростью работает сейчас таймер.
2. Перепрограмировать его на нужную скорость.
3. Определить частоту процессора.
II. Непосредственная работа:
1. Сделать что нужно.
2. Вызывать стандартный обработчик, выравнивая задержками через RDTSC.
Что следует иметь ввиду:
1. Таймер железяка внешняя и ее частота вряд-ли больше 4 МГц.
2. Чипсет тоже, он любит кэшировать запросы и работает в асинхронном режиме.
Если пишете под NT платформы - на задачу там отведено 5-20 мс (т.е. если задача в течение этого времени не отдаст управление то оно всё равно переключится), причем процесс с более высоким приоритетом в Win9х получит управление СРАЗУ а в NT только по истечении интервала, поэтому в NT нормально можно работать, только убив механизм переключения задач (см. выше о OS реального времени).
P.S. Я бы посоветовал приобрести микроконтроллер вроте ATMEL ATtiny у него 8 ног, есть флешка, таймер (короче идеальный генератор) и управлять им с компьютера.
Дмитри В. Белькевич (2003-08-22 20:28:00) [2]
Поищи хотя бы исходники CIH, они хорошо документированы в т.ч. на русском. Он это делает. Как конкретно работать с прерываниями не скажу - никогда не занимался.
Сергей222 (2003-08-22 20:04:00) [3]
> ... Только предварительно на 0 кольцо пролезть.
Как это сделать?
Дмитрий В. Белькевич (2003-08-22 01:14:00) [4]
> А в чем проблема-то? Может кто пояснит что надо для того,
> чтобы используя DDK программировать драйверы под win32 именно
> на Delphi?
Delphi не может vxd/sys генерить. Хотя бы поэтому. А структура этих файлов довольно сильно отличается от exe. Да и отлаживать из-под ide не получится. Нужно нечто типа Soft-Ice + отладочное ядро Windows. Afair существуют некие специальные отладчики под это дело. Кстати, в данном случае, насколько я понимаю, виртуальный драйвер не нужен. Обработку прерываний можно сделать в обычном exe"шнике. Только предварительно на 0 кольцо пролезть.
Verg (2003-08-21 07:52:00) [5]
> Дмитрий В. Белькевич © (19.08.03 21:13) [8]
Про DDK я в курсе.
> А насчет на делфях - лучше не надо
А в чем проблема-то? Может кто пояснит что надо для того, чтобы используя DDK программировать драйверы под win32 именно на Delphi?
Дмитрий В. Белькевич (2003-08-19 21:13:00) [6]
2 Verg: за MSDN не скажу, а вот DDK дейстительно поможет. А насчет на делфях - лучше не надо - голый асм или си на худой конец. Писать там, в общем, не сложно, с отладкой тяжело.
miek (2003-08-19 20:16:00) [7]
Кстати говоря, я недавно померял время выполнения QueryPerformanceCounter и обалдел - 3400-3600 тактов! Ничего себе сходил за кефиром, как говорится...
2Verg: Читай MSDN, должно помочь.
Verg (2003-08-19 17:31:00) [8]
> Но в принципе можно использовать event cards для ISA или
> PCI, которые генерят прерывания, а обработку делать в драйвере
> --> получим стабильную частоту вызовов.
Кто-нить бы еще научил девайс-драйверы на Дельфях делать...
Дмитрий В. Белькевич (2003-08-19 13:36:00) [9]
> Verg
Я про частоту вообще и не говорил, а про её стабильность. Стабильную частоту даже в 1 Гц программно генерить нельзя всё из-за той же нереалтаймовости винды. А 10 кГц - тем более. На звуковухе afaik есть т.н. медиатаймеры пользовать, можно попробовать что-то с ними делать.
N169 (2003-08-19 10:26:00) [10]
При чисто программном решении действительно будет тупик.
Но в принципе можно использовать event cards для ISA или PCI, которые генерят прерывания, а обработку делать в драйвере --> получим стабильную частоту вызовов.
Verg (2003-08-19 07:49:00) [11]
Частота тут не при чем. Важна точность (абсолютная или относительная) с которой надо выдерживать эту частоту. И похоже, что тут будет тупик, см.
> Дмитрий В. Белькевич © (19.08.03 01:01) [2]
Дмитрий В. Белькевич (2003-08-19 01:01:00) [12]
Вообще-то win никогда не был реалтаймовой ОС. Если нужна точная работа со временем - пользуй внешние девайсы. Раньше-то проще с иса было, сейчас разьве что usb"шные втычки делать.
miek (2003-08-18 23:07:00) [13]
Справку по этим процедурам надо искать в хелпе по WinAPI. Но сами они только измеряют, события им назначить нельзя. Придется создавать поток с высоким приоритетом.