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