Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мега Частота (10-20 кГц), выполнение простых действий с этой скоро 
:(
    Опции темы
Courier
Дата 15.3.2004, 22:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Прошу помочь мне в таком важном для меня деле, как выполнение простых действий каждые 50-100 микросекунд (10-20 кГц). У меня на LPT-порте висит железяка, которую нужно опрашивать, и строить графики по этим данным - зависимость измеряемого напряжения от времени... Как выполнять команду "In port, Data" через эти проклятые 100 микросекунд?
  Вверх
Петрович
Дата 16.3.2004, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
Как выполнять команду "In port, Data" через эти проклятые 100 микросекунд?

Если точно через 100 то никак. Среда многозадачная.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
stab
Дата 16.3.2004, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Может быть попытаться эту железяку к звуковухе подцепить, точнее сам источик сигнала? или LPT нужен обязательно?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 17.3.2004, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Courier, можно сделать примерно так:
Код
var
 NeedFreq, TimerFreq, Count0, Count1, Count2, CountEnd, Period : Int64;
begin
 NeedFreq := 100; // требуемая частота в мкс
 SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
 SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
 QueryPerformanceFrequency(TimerFreq);
 Period := NeedFreq * TimerFreq div 1000000;
 QueryPerformanceCounter(Count1);
 CountEnd := Count1 + Period * 10000; // время цикла = 1 с
 repeat
   Count2 := ((Count1 div Period) + 1) * Period;
   repeat
     Data := < чтение порта >;
     Count0 := Count1;
     QueryPerformanceCounter(Count1);
   until Count1 >= Count2;
   if (Count1 - Count2) <= Abs(Count0 - Count2) then Data := < чтение порта >;
   < занесение Data в буффер для дальнейшего построения графика >;
 until Count1 >= CountEnd;
end;

Давно мучал вопрос, насколько велика погрешность в таких случаях из-за многозадачности. Поэтому решил проверить собственноручно. Поясню на "картинке":
Код

            Count0          Count1
              |                |
0             | 100=Count2     |  200
|             |  |             |   |
------------------------------------------>t, мкс
             80               170
              <================>
                   (Разрыв)

Тут изображен случай, когда на 80 mkсекунде произошло переключение задачи, и выполнение вернулось на 170 mkсекунде.
Программе же требуется замерить данные на 100-ой mkсекунде. Ближайшее замеренное значение - на 80мкс. Его и берем. И так продолжается дальше. Разрывы происходят не так часто (при повышенном приоритете - за 1 секунду всего 40 раз произошли "ощутимые" переключения)...
Ниже приведены результаты теста. По незнанию, как назвать некоторые параметры, обозвал их так:
Переключений задач - сколько обнаруженных переключений произошло за время цикла (обнаружились из-за того, что перескочили во времени за нужный интервал).
Положительная погрешность - разница между текущим временем и требуемым (на рис.: 170-100=70 мкс)
Отрицательная погрешность - разница между требуемым и предыдущем значением времени (на рис.: 100-80=20 мкс)
Просто погрешность - выбирается в каждом такте цикла как наименьшее из полож. и отриц. погрешностей
Пропущеных тактов - сколько пропущено тактов цикла из-за "долгих" чужих процессов. Например, если бы на рисунке выполнение программы продолжилось не на 170 мкс, а на 370 мкс, то было бы пропущено 2 такта.

Результаты:
Код
ОС = WinXP
Частота таймера = 3,58 МГц
Время цикла = 1 с
Время такта = 100 мкс

                            | Norm | High | R-T
----------------------------+------+------+-----
Переключений задач          | 280  | 160  | 35
Пропущеных тактов           | 600  | 55   | 3
Сред. пол. погрешность, мкс | 200  | 60   | 27
Сред. отр. погрешность, мкс | 40   | 40   | 20
Сред. погрешность, мкс      | 35   | 25   | 12
Макс. пол. погрешность, мкс | 2000 | 250  | 210
Макс. отр. погрешность, мкс | 99   | 99   | 95
Макс. погрешность, мкс      | 99   | 90   | 75

Norm = Нормальный приоритет процесса
High = Высокий приоритет процесса
R-T = Real-Time приоритет процесса


Это сообщение отредактировал(а) p0s0l - 17.3.2004, 22:59


--------------------
С уважением, г-н Посол.
PM   Вверх
Vit
Дата 17.3.2004, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Для таких задач надо подумать о смене оси на QNIX


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
remax
Дата 17.3.2004, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Или возложить эти функции на внешний контроллер. Т.е. контроллер работает в реальном времени в синхронном режиме, а управление им и обмен информации осуществляется с персоналки асинхронно.


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
remax
Дата 17.3.2004, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



to p0s0l Для какого процессора приведены данные в таблице? Как влияет применение более слабого/сильного процессора?



--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
p0s0l
Дата 17.3.2004, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



[s]remax, Athlon2000.
Тут зависит от нагрузки системы/типов выполняемых задач/самой ОС. Например, вылез в инет, но всё лишнее поснимал из процессов - и с RealTime приоритетом получилось 200 пропущенных тактов (вместо прежних 35), поднялась макс. положит. погрешность до 700, хотя остальные параметы остались как были...



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 17.3.2004, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Вот, если кто сам захочет у себя сделать замеры - исходник проги (5 кб)...

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  HighFreqTimer.zip


--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.