реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Система сбора данных, 60 дифференциальных каналов, дискретизация 500-2500гц
Клим
сообщение Aug 25 2010, 07:42
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 7-04-08
Из: Украина, Запорожье
Пользователь №: 36 541



Требуется система сбора данных в комп. Необходимо с частотой дискретизации до 2500гц получать аналоговые данные с ~60 дифференциальных каналов. Точности 12 бит вполне достаточно.
Есть куча решений в виде плат PCI/PCIex, но смущает размер буфера в 1-4к. Будут ли такие карточки обеспечивать непрерывный сбор данных под windows?
Пока нашел приличные платы от NI и Advantech, но хотелось бы подешевле.
Go to the top of the page
 
+Quote Post
DS
сообщение Aug 25 2010, 08:16
Сообщение #2


Гуру
******

Группа: СуперМодераторы
Сообщений: 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 нет, то таже при правильно написанных драйверах можно придумать ситуацию, приводящую к потере данных.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Aug 25 2010, 08:31
Сообщение #3


Гуру
******

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



Цитата(DS @ Aug 25 2010, 12:16) *
Если режима master нет, то таже при правильно написанных драйверах можно придумать ситуацию, приводящую к потере данных.


При правильно написанных и при отсутствии в системе неправильно написанных - сложно придумать такую ситуацию.
Это ведь нужно, чтобы DPC находилось в очереди несколько миллисекунд.
Ну а задержка больше 10 микросекунд на транзакцию - это очень глубокая PCI шина.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
DS
сообщение Aug 25 2010, 08:39
Сообщение #4


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Цитата(Oldring @ Aug 25 2010, 12:31) *
При правильно написанных и при отсутствии в системе неправильно написанных - сложно придумать такую ситуацию.
Это ведь нужно, чтобы DPC находилось в очереди несколько миллисекунд.
Ну а задержка больше 10 микросекунд на транзакцию - это очень глубокая PCI шина.


1.5 мс всего. Каналов то 60. А родной драйвер windows для com порта умудряется терять байты (очень иногда, но имеет место быть), уже на скорости 115200.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Aug 25 2010, 08:54
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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 драйвер с нуля довольно сложно..


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
DS
сообщение Aug 25 2010, 08:59
Сообщение #6


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Цитата(Oldring @ Aug 25 2010, 12:54) *
1/(60*2500*2/4)=13 микросекунд.


Я считал, за какое время 4 Кбайтный буфер переполнится. Это то же время, за которое заполняется 16 байтный буфер com порта. А он в XP иногда теряет байты. Так что ситуации, когда не обслуживается прерывание в течении 1.5 мс точно есть.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Aug 25 2010, 09:16
Сообщение #7


Гуру
******

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



Цитата(DS @ Aug 25 2010, 12:59) *
Я считал, за какое время 4 Кбайтный буфер переполнится. Это то же время, за которое заполняется 16 байтный буфер com порта. А он в XP иногда теряет байты. Так что ситуации, когда не обслуживается прерывание в течении 1.5 мс точно есть.



1/(2500*60*2/4096) = 13 мс Это порядок разницы.
Причины необслуживания прерывания в течение более чем миллисекунды могут быть самыми разными. Например, ошибки в самом драйвере. Например, невовремя лочит новые буфера в памяти.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
DS
сообщение Aug 25 2010, 09:21
Сообщение #8


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Цитата(Oldring @ Aug 25 2010, 13:16) *
1/(2500*60*2/4096) = 13 мс Это порядок разницы.
Причины необслуживания прерывания в течение более чем миллисекунды могут быть самыми разными. Например, ошибки в самом драйвере. Например, невовремя лочит новые буфера в памяти.


Да, прошу прощения, обсчитался в уме. Это, кончено, резко снижает вероятность потери данных. Но тем не менее, если нужна надежность, я бы не стал закладываться и на 13 мс - именно из-за возможного наличия кривизны в других драйверах. По моему опыту, ошибка "переполнение буфера" исчезает полностью, если его хватает больше, чем на 100, а лучше 500 мс. Если меньше 100 мс, то при эксплуатации разными людьми на разных компьютерах иногда кто-то нарывается на переполнение.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Aug 25 2010, 09:24
Сообщение #9


Гуру
******

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



Цитата(DS @ Aug 25 2010, 13:21) *
Да, прошу прощения, обсчитался в уме. Это, кончено, резко снижает вероятность потери данных. Но тем не менее, если нужна надежность, я бы не стал закладываться и на 13 мс - именно из-за возможного наличия кривизны в других драйверах.


Мастер с буфером 4К от этого всё равно не спасет. Инициирует обмен мастера всё равно ЦП, указав место в памяти, куда именно складировать данные.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
DS
сообщение Aug 25 2010, 09:26
Сообщение #10


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Цитата(Oldring @ Aug 25 2010, 13:24) *
Мастер с буфером 4К от этого всё равно не спасет. Инициирует обмен мастера всё равно ЦП, указав место в памяти, куда именно складировать данные.


Ну так при разумном подходе ему можно назначить мегабайтный, например, буфер. Еще лучше, если кольцевой.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Aug 25 2010, 09:32
Сообщение #11


Гуру
******

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



Цитата(DS @ Aug 25 2010, 13:26) *
Ну так при разумном подходе ему можно назначить мегабайтный, например, буфер. Еще лучше, если кольцевой.



Кольцевидность буфера не имет отношения к вероятности потери данных.

Возможность назначения мегабайтного буфера зависит от способностей аппаратного мастера. В любом случае, даже если аппаратный мастер позволяет использовать очередь пересылок, инициируемых по событию на плате без вмешательства ЦП, это существенно усложнит его настройку по сравнению с классическим описанным в учебниках для драйверописателей использованием DMA.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
DS
сообщение Aug 25 2010, 09:47
Сообщение #12


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Цитата(Oldring @ Aug 25 2010, 13:32) *
Кольцевидность буфера не имет отношения к вероятности потери данных.

Возможность назначения мегабайтного буфера зависит от способностей аппаратного мастера. В любом случае, даже если аппаратный мастер позволяет использовать очередь пересылок, инициируемых по событию на плате без вмешательства ЦП, это существенно усложнит его настройку по сравнению с классическим описанным в учебниках для драйверописателей использованием DMA.


Косвенно имеет, так как не надо реинициализировать DMA по заполнению буфера.

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


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Aug 25 2010, 09:53
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
DS
сообщение Aug 25 2010, 09:57
Сообщение #14


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Цитата(Oldring @ Aug 25 2010, 13:53) *
Не имеет. Потому что из циклического буфера нужно считывать куда-то. Если не считать вовремя - данные будут потеряны. Правильное решение - цепочка буферов, передаваемых драйверу из пользовательского кода асинхронными IO вызовами. Очередной буфер локируется в памяти и добавляется в конец списка DMA. После заполнения буфера происходит прерывание и IO обмен с этим буфером комплитится.

IMHO идея явно противоречит KISS


Если начинать куда-то копировать по прерыванию при половинном заполнении, то запас получается нормальный. При Вашем предложении все равно возникает момент простоя DMA между выставлением прерывания и перезапуском DMA в новый буфер. Если этот процесс задержать, произойдет потеря данных. Ну или нужен более сложный алгоритм DMA с двумя или больше буферами, что есть эквивалент работы с кольцом.

А что такое KISS ?


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Aug 25 2010, 10:04
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 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


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01504 секунд с 7
ELECTRONIX ©2004-2016