Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли создать точный таймер с интервалом в 1 мкс? [D3, D7]


Страницы:   1 2

maxfiles ©   (2003-12-16 00:47:00) 

Можно ли создать точный таймер с интервалом в 1 мкс? Если да, то как? Если не трудно.. я бы и от кода не отказался :). заранее спасибо


div   (2004-01-09 11:18:00) [1]

2 y-soft: спасибо... с меня пиво ))) QNX - это мы знаем. Оно на сколько я помню Unix-клон - не пойдет ))).


y-soft   (2004-01-09 10:55:00) [2]

>div   (09.01.04 10:16) [33]
Разгребайте!

http://www.google.com.ru/search?q=Windows+%22Real+Time+Kernel%22&hl=ru&lr=&ie=UTF-8&oe=UTF-8&start=10&sa=N

А вообще советую обратить внимание в другую сторону, на QNX - это изначально ОС реального времени со встроенными средствами разработки и отладки, очень надежная, гибкая, небольшая по объему, а самое главное - в последних версиях бесплатная для некоммерческого использования и есть документация на русском языке, можно свободно скачать дистрибутив. Недостаток - Delphi для нее не существует :))

http://qnx.org.ru/


div   (2004-01-09 10:16:00) [3]

2 y-soft:
подкинь линку на такое ядро. надо для Win2000.


Brahman   (2004-01-09 10:07:00) [4]

miek ©   (08.01.04 22:25) [31]

>На мощной машине в принципе

Бред..


miek   (2004-01-08 22:25:00) [5]

На мощной машине в принципе можно такое сделать. Ставишь приоритет RealTime, ставишь хуки на все, чтобы всякую системную хрень выключить, руками смотришь, сколько прошло времени... с помощью того же QueryPerformanceCounter. Осуществимо даже без написания своего драйвера, но геморрою будет много.


y-soft   (2004-01-08 20:54:00) [6]

Такие задачи полноcтью решаются только аппаратно, в некоторых случаях помогает специально написанный драйвер

Windows не является ОС реального времени - измерять время можно с хорошей точностью, но точно выдерживать интервалы нельзя.

Хотя в принципе существуют варианты с очень неплохими характеристиками с ядром реального времени для линии NT, но под них и писать надо особым образом (расширен диапазон приоритетов, используется специальный API...)


div   (2004-01-08 19:04:00) [7]

Есть еще вариант - пишеш свой TThread а при создании даешь ему максимальный приоритет (tpTimeCritical). В этом случае твой трид задушит всю систему (даже мыша будет глючить) а внутри трида додумаешь сам как осуществить правильный отчет времени. Но есть одно но: win9x - практически перестает работать все, а вот NT/2000 и XP все равно все процессорное время не отдаст, так что будут проблемы под разными осями...( к тому же учти что кванты времени в разных осях разные и от этого тоже могут быть побочные эффекты.
а ваапще задачка несколько сложноватая - винда в принципе не может работать с такими интервалами времени (
эт тебе не ДОС )


N169   (2003-12-29 11:36:00) [8]

А как можно события генерить со стабильным периодом с помощью QueryPerformanceFrequency/QueryPerformanceCounter?
Запросить-то можно, сколько времени прошло, а как на его основе генерить события, да со стабильным интервалом? Да с дискретностью 1 мкс?
Вот в чём вопрос.


Artog   (2003-12-29 11:11:00) [9]

Точность будет зависеть от частоты процессора.

A counter is a general term used in programming to refer to an incrementing variable. Some systems include a high-resolution performance counterthat provides high-resolution elapsed times.
If a high-resolution performance counter exists on the system, the QueryPerformanceFrequencyfunction can be used to express the frequency, in counts per second. The value of the count is processor dependent. On some processors, for example, the count might be the cycle rate of the processor clock.


Artog   (2003-12-29 11:08:00) [10]

Unit HRTimer;
{Var
   HRT : THRTimer
   x : Double;
begin
   HRT := THRTimer.Create;
   HRT.StartTimer;  Сброс таймера в ноль
   x := HRT.ReadTimer ;Возвращает отсчитанное время в мкс
                      ;начиная со времени старта
   HRT.Free;
end;
}
interface
Uses Windows;
Type
THRTimer = Class(TObject)
  Constructor Create;
  Function StartTimer : Boolean;
  Function ReadTimer : Double;
private
  StartTime : Double;
  ClockRate : Double;
public
  Exists    : Boolean;
End;

implementation

Constructor THRTimer.Create;
Var
  QW : TLargeInteger;
BEGIN
   Inherited Create;
   Exists := QueryPerformanceFrequency(QW);
   ClockRate := LARGE_INTEGER(QW).QuadPart;
END;

Function THRTimer.StartTimer : Boolean;
Var
  QW : TLargeInteger;
BEGIN
  Result := QueryPerformanceCounter(QW);
  StartTime := LARGE_INTEGER(QW).QuadPart;
END;

Function THRTimer.ReadTimer : Double;
Var
  ET : TLargeInteger;
BEGIN
  QueryPerformanceCounter(ET);
  Result := 1000000.0*( LARGE_INTEGER(ET).QuadPart - StartTime)/ClockRate;
END;
end.


ALEIIIKA   (2003-12-29 09:47:00) [11]

[23] Новое это хорошо забытое старое.
[24] Если винды, чтож как говорят флаг в руки и барабан на шею!

Используй какое-нибудь буферное устройство, а оттуда считывай с максимально возможной скоростью.


maxfiles   (2003-12-27 22:24:00) [12]

Я очень уважаю DOS, не подумайте ничего такого, просто надо под винды...


maxfiles   (2003-12-27 22:23:00) [13]

Под DOS? Это называется "Назад в будущее"? :)


ALEIIIKA   (2003-12-27 11:27:00) [14]

Пиши под DOS! Там проще работать с портами, и временем ты будешь не обделен.


nester   (2003-12-27 10:20:00) [15]

Ну я сигнал имеено так и принимал. Выставлял DTR и от него питал схему, а сам сигнал по-моему снимал с RTS или CTS, собсно это и не так важно откуда.


maxfiles   (2003-12-27 03:34:00) [16]

А за каким сигналом конкретно ты следил? У меня информация будет передаваться не совсем обычным путем, ибо порт работает фактически на 2 устройства. Так как у меня свободен DTR и RTS то один из сигналов питает второе устройство, а другой выступает в роли источника информации.

и второе: по плану я должен не принимать, а формировать сигнал. Пока я думаю как это сделать. Короче сформировать сигнал надо на DTR или RTS и очень быстро... Не 1 мкс (это я конечно, загнул), но близко к этой цифре... может от 10 до 50 мкс...

вот... наворотил на свою голову....


nester   (2003-12-27 02:25:00) [17]

Блин, както невнятно объяснил, щас еще раз:
При нажатии на кнопку тебе присылается набор переходов(попросту говоря набор бит) причем этот набор за одно нажатие присылается несколько раз с небольшим интервалом. Скажем нажал ты кнопку и себе душка сказала раз эдак 7 что кнопка нажата, ну так для верности.
Мои изыскания привели к тому, что написал я отдельный поток, в нем цикл в цикле делаю sleep(0) - это слип на время, которое определяет система которое ей щас нужно и анализирую состояние порта. Как только я нахожу изменение порта, я сразу перестаю делать sleep и в цикле просто слежу за изменением состояния порта, для пущего ускорения можно потоку отдать приоритет realtime на время анализа, потом когда сигналы окончатся вернуть нормал и опять слипиться начать. В общем все.
Я эту байду не дописал, но посмотреть есть чего, хочешь могу выслать, точнее выслал уже


nester   (2003-12-27 02:11:00) [18]

О, я тоже когдато писал такую байду, возьми просто другую душку, например RC5, у нее пакеты длинные и тебе с лихвой хватит обычного TTimer.
Храни гденить предыдущее время срабатывания таймера и смотри скока времени проходит. вот и все.
Душка передает в одном пакете сразу кучу сигналов, т.е. она на одно нажтее генерит тебе сразу кучу сигналов, чтобы избавиться от помех. Поэтому я делал интервалы большие, и если видел сигнал, то резко уменьшал время.
А потом вообще от TTimer отказался, просто сделал поток, а в нем ставил sleep на нужное мне время, если в друг в порту появлялся сигнал, то я переставал делать слип вообще, и в цикли опрашивал состояние порта, пока сигнал не кончался


just me   (2003-12-26 17:28:00) [19]

real time clock на материнской плате вполне может дать менее 1 мс, он ни к кому не привязан.


N169   (2003-12-26 13:52:00) [20]

Все таймеры привязаны к системным часам и не могут дать разрешение выше 1 мс.

Можно использовать KeStallExecutionProcessor(), до 50 mks. Эта фича гарантированно останавливает пень на указанный интервал, а после продолжает работу.
Дискретность времени - высокая, лучше 500 нс.

Вопрос только в том, насколько часто его придётся останавливать.
Может, не стОит? Поискать типа другое решение...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо