MicroCHIP.RU
Главная Документация Отладочные средства Справочник Поиск Ссылки
 Новости   Конференция   Контакты 
 

Возможно я не прав, но

 Нoвaя темa  |  Наверх  |  Перейти к теме  |  Поиск  |  Правила  |  Вход 

ВНИМАНИЕ!
Вы просматриваете архив форума.

Этот форум работает только в режиме просмотра и поиска.

Действующий форум переведен на новый движок и
находится по адресу www.microchip.su

 Вопрос про windows
Автор: Sergeant ()
Дата:   22/11/2006 22:01

Застрял по полной, вопрос конечно не по теме форума, но наверно здесь есть люди, которые с этим
сталкивались. Есть устройство, которое примерно каждую 1 мс по RS232 передает данные на компьютер. Однако
мне важно не только (и не столько) содержимое пакета, сколько момент времени когда он пришел. Функция
GetTickCount (вызванная сразу после прихода пакета) точностью не устраивает (только порядка 20 мс) и
получается, будто несколько пакетов приходят одновременно. Как мне в windows:
1)мгновенно отреагировать на приход символа
2)максимально точно засечь время прихода.

С этим наверняка кто-нибудь связывался, поэтому, пожалуйста, поделитесь опытом...
П.С. Привязывать к пакетам метки времени можно не предлагать...


 
 Возможно я не прав, но
Автор: Picozoid ()
Дата:   22/11/2006 22:27

Многозадачная Windows и измерение точных временных интервалов, к тому же по приходу
байта в COM-порт - мне кажется задачи несовместимые. Мне пакеты тоже валятся кучей.
Когда запускаю что-то тяжёлое в фоновом режиме, вообще невозможно отследить какой
когда пришёл. Выгребаю из буфера и всё - дескать и на том спасибо, что пришли :)


 
 Именно как сказал Picozoid (+)
Автор: Petr_ ()
Дата:   22/11/2006 22:41

до единиц мс отследить символ не получится.
Можно конечно начать фантазировать....
типа писать свой драйвер (а там можно это сделать) для
работы с портом.
Но намного проще изменить построение системы.
Я не представляю, зачем это отслеживание может пригодиться.


 
 +1
Автор: buka_2004 ()
Дата:   23/11/2006 10:32

При времени между пакетами меньше 50 мс уже проблеммы начинаются.
По нескольку пакетов в буфере. А если еще пакеты
длинные (больше 10 байт)
то тогда вообще не получается время отследить.




 
 Спросите Леонида Юрьева
Автор: hutorny ()
Дата:   23/11/2006 12:04

автора SerialXp. Может быть в его драйвере есть такая возможность.
http://leo.yuriev.ru/SerialXp


 
 Re: Спросите Леонида Юрьева
Автор: Sergeant ()
Дата:   23/11/2006 14:00

К сожалению там такой возможности нет, но они обищают более высокую скорость
обработки, поэтому все равно установлю...


 
 Как вариант (+)
Автор: MikePic ()
Дата:   23/11/2006 14:12

Как вариант - ввести в устройство, которое посылает пакеты,
измерение времени между ними и это значение отправлять в тех
же пакетах.
Если это невозможно, то тогда - нечто вроде промежуточного
устройства между компом и передающим девайсом. Задача этого
"Нечта" будет измерение времени между пакетами и пристыковка
к ним временнЫх меток.


 
 Таймеры в Windows (+)
Автор: Ecole ()
Дата:   23/11/2006 15:23

Мультимедиа таймер (см. функции timeBeginPeriod, timeSetEvent, timeEndPeriod,
timeKillEvent) способен под Windows 2000 отсчитывать время с максимальной точностью
1 миллисек (сам лично проверял, см. http://www5.domaindlx.com/cprime/lesson/48.htm )
Правда возможно это только когда система не слишком загружена (крутится только одна ваша
задача).
Кроме того, можно измерять время и точнее, если заглянуть сюда:
http://leo.yuriev.ru/ExactPerformance
К сожалению в связке с СОМ-портом это наверное мало что даст из-за буферизации и др.
Как вариант можно попробовать организовать обмен данными с компьютером через LPT-порт. Там
есть возможность и прерывания использовать. Правда по-хорошему драйвер придется писать...

------------------------------------------------------
http://www5.domaindlx.com/cprime/lesson/dir2.htm
http://www5.domaindlx.com/cprime/
обновление: новый раздел в Уроках С++


 
 A если
Автор: Артём ()
Дата:   24/11/2006 03:29

передавать в пакете время?


 
 Отвечаю
Автор: ly ()
Дата:   24/11/2006 18:51

Точно замерить время приёма символа (или пакета) на COM-порт
можно только опрашивая его в цикле при запрещенных
прерываниях. Точность - одна итерация, порядка 1 мкс.

Самое правильное решение IMHO - вставить отметку времени в
сами пакеты, но скорее всего это не возможно.

Точность измерений из usermode программы под Windows 2000/XP будет
зависеть от целого ряда факторов. Прежде всего, от наличия
"плохих" (а-ля китайских драйверов), которые на долгое время
блокируют прерывания или долго возятся на уровне IRQL >
PASSIVE_LEVEL. Например, это будет зависеть от продуманности
чипа и драйвера сетевой карты, и конечно от объёма трафика.
Тоже самое можно сказать и о других компонентах системы.
Вывод
видео через PCI - будет просто жуть…

Если от этих проблем избавиться, то вы сможете достаточно
точно определять время приёма пакетов. Точность будет
определяться
латентностью прерываний и времени пробуждения ядром задачи
(переключения) либо вызова асинхронного уведомления. Для
этого вам нужно:
1) Использовать для взаимодействия с COM-портом
асинхронный (overlapped) обмен, см. ReadEx() и WriteEx();
2) Правильно организовать обмен с COM-портом, желательно
через Ioctl() + Read() + Write(), а не кривую win32-обертку и DCB;
3) Использовать для засечки времени NtQueryPerformanceCounter() из
ntdll.dll, либо счетчик тактов процессора;
4) Установить наивысший приоритет для вашего процесса и
треда (только после отладки!);

Думаю на CPU порядка 1000 MHz вы сможете получить точность 100-250
мкс.


 
 Re: Отвечаю
Автор: Sergeant ()
Дата:   25/11/2006 08:26

В общем попробовал много вариантов. Посчитать точное время в windows еще можно
(QueryPerformanceCounter), НО - самая большая загвоздка - это задержка реагирования на приход пакета,
т.е. windows (падла) может до сотен байт накапливать трафик где-то у себя, а потом передавать и их
обрабатывающей программе. Выглядит это так - я выдергиваю шнур из моего устройства, а программе еще около
5!!!! секунд продолжают приходить пакеты. Этот эффект еще можно свести к минимуму, но искоренить - мне н
е под силу (да и времени нет).

Как правильно здесь отметили - можно начать фантазировать... Но по-моему лучше будет смириться,
пожертвовать частью информации и передавать еще и метки времени...


 
 Re: Отвечаю
Автор: ly ()
Дата:   26/11/2006 00:00

Windows не накапливает трафик и не делает никаких чудес. Важно
просто понимать, что и как работает, и соответственно
представлять как на самом деле работает ваша программа.

Скорее всего, у вас обработка данных увязана с UI, что и
обеспечивает неадекватное поведение. Крайне важно
правильно организовать асинхронную обработку данных и их
асинхронное отображение в UI (в треде с меньшим приоритетом).

Знакомы ли вам понятия dead lock, live lock и priority inversion? Если
нет, то очень маловероятно, что ваша программа будет
правильно организована. Еще советую изучить принцип RCU, без
этого вы скорее всего не сможете избавиться от инверсии
приоритетов под Windows.

Кроме этого, важно правильно работать с COM-портом. Реально в
спецификацию интерфейса заложено очень многое, драйвер COM-
порта в Windows сложнее своего аналога в любой другой ОС, и
соответственно может гораздо больше.