Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
14-8588
Delirium^.Tremens
2003-10-15 10:01
2003.11.03
Народные приметы


3-8300
KIR
2003-10-13 15:30
2003.11.03
Соргтировка по агрегированному полю в IB


1-8497
killer
2003-10-23 20:55
2003.11.03
Как программноузнать русифированная или нерусифированная Windows?


3-8257
Term
2003-10-14 15:56
2003.11.03
Есть ли средства для редактирования отчётов в run-time...


4-8721
Bes
2003-08-29 03:37
2003.11.03
Убрать подвисание..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский