|
Система сбора данных, 60 дифференциальных каналов, дискретизация 500-2500гц |
|
|
|
Aug 25 2010, 08:16
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Клим @ Aug 25 2010, 11:42)  Требуется система сбора данных в комп. Необходимо с частотой дискретизации до 2500гц получать аналоговые данные с ~60 дифференциальных каналов. Точности 12 бит вполне достаточно. Есть куча решений в виде плат PCI/PCIex, но смущает размер буфера в 1-4к. Будут ли такие карточки обеспечивать непрерывный сбор данных под windows? Пока нашел приличные платы от NI и Advantech, но хотелось бы подешевле. Если PCI master - при правильно написанных драйверах будут. Если режима master нет, то таже при правильно написанных драйверах можно придумать ситуацию, приводящую к потере данных.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Aug 25 2010, 08:31
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(DS @ Aug 25 2010, 12:16)  Если режима master нет, то таже при правильно написанных драйверах можно придумать ситуацию, приводящую к потере данных. При правильно написанных и при отсутствии в системе неправильно написанных - сложно придумать такую ситуацию. Это ведь нужно, чтобы DPC находилось в очереди несколько миллисекунд. Ну а задержка больше 10 микросекунд на транзакцию - это очень глубокая PCI шина.
--------------------
Пишите в личку.
|
|
|
|
|
Aug 25 2010, 08:54
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(DS @ Aug 25 2010, 12:39)  1.5 мс всего. Каналов то 60. А родной драйвер windows для com порта умудряется терять байты (очень иногда, но имеет место быть), уже на скорости 115200. 1/(60*2500*2/4)=13 микросекунд. А если считывать сразу 128-битными родными для процессора типами, то еще в 4 раза больше. У родной микросхемы компорта буфер всего 16 байт. Там реально меньше миллисекунды на обработку прерывания. Тоже в принципе достаточно, но первые драйвера от MS были сами очень кривыми. Посмотрите на примеры в старых DDK. Майкрософты не зря новую модель драйверов придумывали, так как правильно написать WDM драйвер с нуля довольно сложно..
--------------------
Пишите в личку.
|
|
|
|
|
Aug 25 2010, 09:21
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Oldring @ Aug 25 2010, 13:16)  1/(2500*60*2/4096) = 13 мс Это порядок разницы. Причины необслуживания прерывания в течение более чем миллисекунды могут быть самыми разными. Например, ошибки в самом драйвере. Например, невовремя лочит новые буфера в памяти. Да, прошу прощения, обсчитался в уме. Это, кончено, резко снижает вероятность потери данных. Но тем не менее, если нужна надежность, я бы не стал закладываться и на 13 мс - именно из-за возможного наличия кривизны в других драйверах. По моему опыту, ошибка "переполнение буфера" исчезает полностью, если его хватает больше, чем на 100, а лучше 500 мс. Если меньше 100 мс, то при эксплуатации разными людьми на разных компьютерах иногда кто-то нарывается на переполнение.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Aug 25 2010, 09:24
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(DS @ Aug 25 2010, 13:21)  Да, прошу прощения, обсчитался в уме. Это, кончено, резко снижает вероятность потери данных. Но тем не менее, если нужна надежность, я бы не стал закладываться и на 13 мс - именно из-за возможного наличия кривизны в других драйверах. Мастер с буфером 4К от этого всё равно не спасет. Инициирует обмен мастера всё равно ЦП, указав место в памяти, куда именно складировать данные.
--------------------
Пишите в личку.
|
|
|
|
|
Aug 25 2010, 09:26
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Oldring @ Aug 25 2010, 13:24)  Мастер с буфером 4К от этого всё равно не спасет. Инициирует обмен мастера всё равно ЦП, указав место в памяти, куда именно складировать данные. Ну так при разумном подходе ему можно назначить мегабайтный, например, буфер. Еще лучше, если кольцевой.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Aug 25 2010, 09:47
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Oldring @ Aug 25 2010, 13:32)  Кольцевидность буфера не имет отношения к вероятности потери данных.
Возможность назначения мегабайтного буфера зависит от способностей аппаратного мастера. В любом случае, даже если аппаратный мастер позволяет использовать очередь пересылок, инициируемых по событию на плате без вмешательства ЦП, это существенно усложнит его настройку по сравнению с классическим описанным в учебниках для драйверописателей использованием DMA. Косвенно имеет, так как не надо реинициализировать DMA по заполнению буфера. Ну мегабайт - это по нынешним временам совсем не много. Правильное написание драйвера с точки зрения потери данных требует усилий, тут да.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Aug 25 2010, 09:53
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(DS @ Aug 25 2010, 13:47)  Косвенно имеет, так как не надо реинициализировать DMA по заполнению буфера. Не имеет. Потому что из циклического буфера нужно считывать куда-то. Если не считать вовремя - данные будут потеряны. Правильное решение - цепочка буферов, передаваемых драйверу из пользовательского кода асинхронными IO вызовами. Очередной буфер локируется в памяти и добавляется в конец списка DMA. После заполнения буфера происходит прерывание и IO обмен с этим буфером комплитится. Цитата(DS @ Aug 25 2010, 13:47)  Ну мегабайт - это по нынешним временам совсем не много. Правильное написание драйвера с точки зрения потери данных требует усилий, тут да. IMHO идея явно противоречит KISS
--------------------
Пишите в личку.
|
|
|
|
|
Aug 25 2010, 09:57
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Oldring @ Aug 25 2010, 13:53)  Не имеет. Потому что из циклического буфера нужно считывать куда-то. Если не считать вовремя - данные будут потеряны. Правильное решение - цепочка буферов, передаваемых драйверу из пользовательского кода асинхронными IO вызовами. Очередной буфер локируется в памяти и добавляется в конец списка DMA. После заполнения буфера происходит прерывание и IO обмен с этим буфером комплитится.
IMHO идея явно противоречит KISS Если начинать куда-то копировать по прерыванию при половинном заполнении, то запас получается нормальный. При Вашем предложении все равно возникает момент простоя DMA между выставлением прерывания и перезапуском DMA в новый буфер. Если этот процесс задержать, произойдет потеря данных. Ну или нужен более сложный алгоритм DMA с двумя или больше буферами, что есть эквивалент работы с кольцом. А что такое KISS ?
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Aug 25 2010, 10:04
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(DS @ Aug 25 2010, 13:57)  Если начинать куда-то копировать по прерыванию при половинном заполнении, то запас получается нормальный. При Вашем предложении все равно возникает момент простоя DMA между выставлением прерывания и перезапуском DMA в новый буфер. Если этот процесс задержать, произойдет потеря данных. Ну или нужен более сложный алгоритм DMA с двумя или больше буферами, что есть эквивалент работы с кольцом. Если DMA не поддерживает списки обменов, то всё равно размер обмена до прерывания без потери ограничен 4 килобайтами. ЦП должен успеть инициировать обмен для каждого 4-килобайтного буфера (или же 2-килобайтного полубуфера) заново. Если поддерживает - то всё равно, кольцевой там буфер или пинг-понг, или список буферов. С другой стороны, список буферов - это традиционно правильное решение, которое к тому же позволяет избежать лишних копирований данных в памяти. Данные в конце концов должен получить из драйвера пользовательский код. Цитата(DS @ Aug 25 2010, 13:57)  А что такое KISS ? http://en.wikipedia.org/wiki/KISS_principle
--------------------
Пишите в личку.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|