Текущий архив: 2004.03.28;
Скачать: CL | DM;
Вниз
Можно ли создать точный таймер с интервалом в 1 мкс? Найти похожие ветки
← →
maxfiles (2003-12-16 00:47) [0]Можно ли создать точный таймер с интервалом в 1 мкс? Если да, то как? Если не трудно.. я бы и от кода не отказался :). заранее спасибо
← →
Dimaxx © (2003-12-16 01:41) [1]Невозможно. Слишком маленький промежуток. Практически 100% гарантия, что будет срабатывать воворемя. Минимально 1 мс и то неверно отсчитывает.
← →
maxfiles (2003-12-16 01:56) [2]А если необходимо сообразить сигнал с ПДУ.. то там посылки идут короткими интервалами. Мне необходимо сигналами DTR и RTS осуществлять посылки...
← →
N169 (2003-12-16 11:28) [3]Можно, напр., читать регистр порта принтера, там около 0.6 мкс на одно чтение
← →
Anatoly Podgoretsky © (2003-12-16 11:31) [4]Писать полноценный драйвер
← →
miek © (2003-12-16 16:49) [5]В DOS-е это было можно и я сам его делал.
В Windows невозможно по определению. Но можно сделать таймер с ТОЧНОСТЬЮ 1 мкс. Это разные вещи.
← →
Dimaxx © (2003-12-17 01:34) [6]Пардон, и каким же образом, если 1 мс отсчитывает неверно? А уж 1 мкс и подавно.
← →
me (2003-12-17 15:30) [7]А real time clock на что?
← →
xredor (2003-12-17 15:44) [8]Пошлите кто нибудь куда-нибуь, чгде есть сорцы этого дела.
← →
atruhin © (2003-12-23 07:51) [9]Поищи multimedia timer
← →
ALEIIIKA © (2003-12-23 09:29) [10]Вот простой пример мультимедиа таймера:
uses
mmSystem;
var
uTimerId : uint;
procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD) stdcall;
begin
{твой код}
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
uTimerID := timeSetEvent (12, 0, @FNTimeCallBack, 0, TIME_PERIODIC);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
timeKillEvent(uTimerID);
end;
← →
maxfiles (2003-12-26 00:53) [11]сдается мне, что эта штука выдаст не менее 1 мс...
← →
Brahman © (2003-12-26 10:33) [12]maxfiles (26.12.03 00:53) [11]
Вам правильно "сдается":)
← →
N169 (2003-12-26 10:42) [13]А зачем 1mks, если не секрет?
← →
sAnD (2003-12-26 13:10) [14]Посмотри в MSDN на следующие функции:
KeWaitForSingleObject
KeSetTimer
SetWaitableTimer
← →
nekto (2003-12-26 13:11) [15]в новых компах есть более точный таймер, чем стандартный биосовский, который действительно считает по 11мкс (тактовая частота аппаратного таймера если не ошибаюсь)...
вот тока как пользоватся им я не помню...
← →
N169 (2003-12-26 13:52) [16]Все таймеры привязаны к системным часам и не могут дать разрешение выше 1 мс.
Можно использовать KeStallExecutionProcessor(), до 50 mks. Эта фича гарантированно останавливает пень на указанный интервал, а после продолжает работу.
Дискретность времени - высокая, лучше 500 нс.
Вопрос только в том, насколько часто его придётся останавливать.
Может, не стОит? Поискать типа другое решение...
← →
just me (2003-12-26 17:28) [17]real time clock на материнской плате вполне может дать менее 1 мс, он ни к кому не привязан.
← →
nester © (2003-12-27 02:11) [18]О, я тоже когдато писал такую байду, возьми просто другую душку, например RC5, у нее пакеты длинные и тебе с лихвой хватит обычного TTimer.
Храни гденить предыдущее время срабатывания таймера и смотри скока времени проходит. вот и все.
Душка передает в одном пакете сразу кучу сигналов, т.е. она на одно нажтее генерит тебе сразу кучу сигналов, чтобы избавиться от помех. Поэтому я делал интервалы большие, и если видел сигнал, то резко уменьшал время.
А потом вообще от TTimer отказался, просто сделал поток, а в нем ставил sleep на нужное мне время, если в друг в порту появлялся сигнал, то я переставал делать слип вообще, и в цикли опрашивал состояние порта, пока сигнал не кончался
← →
nester © (2003-12-27 02:25) [19]Блин, както невнятно объяснил, щас еще раз:
При нажатии на кнопку тебе присылается набор переходов(попросту говоря набор бит) причем этот набор за одно нажатие присылается несколько раз с небольшим интервалом. Скажем нажал ты кнопку и себе душка сказала раз эдак 7 что кнопка нажата, ну так для верности.
Мои изыскания привели к тому, что написал я отдельный поток, в нем цикл в цикле делаю sleep(0) - это слип на время, которое определяет система которое ей щас нужно и анализирую состояние порта. Как только я нахожу изменение порта, я сразу перестаю делать sleep и в цикле просто слежу за изменением состояния порта, для пущего ускорения можно потоку отдать приоритет realtime на время анализа, потом когда сигналы окончатся вернуть нормал и опять слипиться начать. В общем все.
Я эту байду не дописал, но посмотреть есть чего, хочешь могу выслать, точнее выслал уже
← →
maxfiles (2003-12-27 03:34) [20]А за каким сигналом конкретно ты следил? У меня информация будет передаваться не совсем обычным путем, ибо порт работает фактически на 2 устройства. Так как у меня свободен DTR и RTS то один из сигналов питает второе устройство, а другой выступает в роли источника информации.
и второе: по плану я должен не принимать, а формировать сигнал. Пока я думаю как это сделать. Короче сформировать сигнал надо на DTR или RTS и очень быстро... Не 1 мкс (это я конечно, загнул), но близко к этой цифре... может от 10 до 50 мкс...
вот... наворотил на свою голову....
← →
nester © (2003-12-27 10:20) [21]Ну я сигнал имеено так и принимал. Выставлял DTR и от него питал схему, а сам сигнал по-моему снимал с RTS или CTS, собсно это и не так важно откуда.
← →
ALEIIIKA © (2003-12-27 11:27) [22]Пиши под DOS! Там проще работать с портами, и временем ты будешь не обделен.
← →
maxfiles (2003-12-27 22:23) [23]Под DOS? Это называется "Назад в будущее"? :)
← →
maxfiles (2003-12-27 22:24) [24]Я очень уважаю DOS, не подумайте ничего такого, просто надо под винды...
← →
ALEIIIKA © (2003-12-29 09:47) [25][23] Новое это хорошо забытое старое.
[24] Если винды, чтож как говорят флаг в руки и барабан на шею!
Используй какое-нибудь буферное устройство, а оттуда считывай с максимально возможной скоростью.
← →
Artog (2003-12-29 11:08) [26]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.
← →
Artog (2003-12-29 11:11) [27]Точность будет зависеть от частоты процессора.
A counter is a general term used in programming to refer to an incrementing variable. Some systems include a high-resolution performance counter that provides high-resolution elapsed times.
If a high-resolution performance counter exists on the system, the QueryPerformanceFrequency function 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.
← →
N169 (2003-12-29 11:36) [28]А как можно события генерить со стабильным периодом с помощью QueryPerformanceFrequency/QueryPerformanceCounter?
Запросить-то можно, сколько времени прошло, а как на его основе генерить события, да со стабильным интервалом? Да с дискретностью 1 мкс?
Вот в чём вопрос.
← →
div (2004-01-08 19:04) [29]Есть еще вариант - пишеш свой TThread а при создании даешь ему максимальный приоритет (tpTimeCritical). В этом случае твой трид задушит всю систему (даже мыша будет глючить) а внутри трида додумаешь сам как осуществить правильный отчет времени. Но есть одно но: win9x - практически перестает работать все, а вот NT/2000 и XP все равно все процессорное время не отдаст, так что будут проблемы под разными осями...( к тому же учти что кванты времени в разных осях разные и от этого тоже могут быть побочные эффекты.
а ваапще задачка несколько сложноватая - винда в принципе не может работать с такими интервалами времени (
эт тебе не ДОС )
← →
y-soft © (2004-01-08 20:54) [30]Такие задачи полноcтью решаются только аппаратно, в некоторых случаях помогает специально написанный драйвер
Windows не является ОС реального времени - измерять время можно с хорошей точностью, но точно выдерживать интервалы нельзя.
Хотя в принципе существуют варианты с очень неплохими характеристиками с ядром реального времени для линии NT, но под них и писать надо особым образом (расширен диапазон приоритетов, используется специальный API...)
← →
miek © (2004-01-08 22:25) [31]На мощной машине в принципе можно такое сделать. Ставишь приоритет RealTime, ставишь хуки на все, чтобы всякую системную хрень выключить, руками смотришь, сколько прошло времени... с помощью того же QueryPerformanceCounter. Осуществимо даже без написания своего драйвера, но геморрою будет много.
← →
Brahman © (2004-01-09 10:07) [32]miek © (08.01.04 22:25) [31]
>На мощной машине в принципе
Бред..
← →
div (2004-01-09 10:16) [33]2 y-soft:
подкинь линку на такое ядро. надо для Win2000.
← →
y-soft © (2004-01-09 10:55) [34]>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 11:18) [35]2 y-soft: спасибо... с меня пиво ))) QNX - это мы знаем. Оно на сколько я помню Unix-клон - не пойдет ))).
Страницы: 1 вся ветка
Текущий архив: 2004.03.28;
Скачать: CL | DM;
Память: 0.55 MB
Время: 0.037 c