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

|
А откуда ограничение на 4 Кбайта ? В PLX, например, 16 мегабайт за раз можно передать. А кольцевой буфер легче реализуется вместо списков, если, например, логика DMA делается руками. Может, Вы какую-то конкретную реализацию контроллера имеете в виду ?
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Aug 25 2010, 10:35
|

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

|
Цитата(DS @ Aug 25 2010, 14:27)  А откуда ограничение на 4 Кбайта ? В PLX, например, 16 мегабайт за раз можно передать. А кольцевой буфер легче реализуется вместо списков, если, например, логика DMA делается руками. Может, Вы какую-то конкретную реализацию контроллера имеете в виду ? Ограничение на пересылку в 4 килобайта следует из размера памяти на плате. Руками проще делается пинг-понг, чем полноценный кольцевой буфер. Но и для него обычно стартовый адрес очередного свободного буфера легко прописывается ЦП при обработке прерывания, превращая пинг-понг в список из двух буферов.
--------------------
Пишите в личку.
|
|
|
|
|
Aug 25 2010, 10:43
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Так память на плате для DMA обычно вообще прозрачна - это FIFO на случай приостановки DMA. DMA шпарит со скоростью поступающих данных, длина ограничивается только физической длиной счетчика контроллера. Зачем же копить 4К, а потом спешно их выпихивать в шину ? Для реализации кольцевого DMA вообще кроме счетчика ничего не нужно, для двухбуферной схемы нужны доп. регистры. В серийных контроллерах, конечно, используются очереди DMA, поскольку это позволяет минимизировать пересылку данных. Но для низкосокоростной платы сбора данных можно и кольцо сделать для упрощения драйвера.
В общем, дальше уже холивар, поскольку конечный результат можно получить и так и так, например отдавая пользователю указатель на кусок данных в кольцевом буфере.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Aug 25 2010, 10:55
|

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

|
Цитата(DS @ Aug 25 2010, 14:43)  Для реализации кольцевого DMA вообще кроме счетчика ничего не нужно, для двухбуферной схемы нужны доп. регистры. Допустим, кроме счетчика еще нужны пороги для генерации прерываний и контроль переполнений, чтобы знать, что данные запороты, в случае чего. И регистр адреса начала буфера - тоже. Нет большой разницы, один или два. Цитата(DS @ Aug 25 2010, 14:43)  В общем, дальше уже холивар, поскольку конечный результат можно получить и так и так, например отдавая пользователю указатель на кусок данных в кольцевом буфере. Вы знаете простой способ отдать пользователю указатель на кусок памяти в буфере, не аллокированного ранее самим пользователем?
--------------------
Пишите в личку.
|
|
|
|
|
Aug 25 2010, 10:55
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Oldring @ Aug 25 2010, 14:49)  Допустим, кроме счетчика еще нужны пороги для генерации прерываний и контроль переполнений, чтобы знать, что данные запороты, в случае чего. И регистр адреса начала буфера - тоже. Нет большой разницы, один или два. Прерывание генерится по установке в 1 старшего разряда счетчика, регсистр начала обязателен в любом случае. Контроль переполнений производит драйвер, считывая значение счетчика при выходе из прерывания. Удобство в том, что запустил один раз - и забыл. Но, еще раз повторюсь, можно реализовать бесчисленным множеством вариантов. Главное - размер буфера данных должен предусматривать большую задержку обработки прерывания. Не знаю. Я сам программизмом под Windows стараюсь поменьше вообще не заниматься. Хотя вот последние пару месяцев пришлось разбираться - умер программист, программа большая, писалась и дописывалась около 8 лет, надо хотя бы разобрать все до состояния, когда можно поручить вновь взятому человеку.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Aug 25 2010, 11:05
|

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

|
Цитата(DS @ Aug 25 2010, 14:55)  Прерывание генерится по установке в 1 старшего разряда счетчика, регсистр начала обязателен в любом случае. Контроль переполнений производит драйвер, считывая значение счетчика при выходе из прерывания. Удобство в том, что запустил один раз - и забыл. Что, одно прерывание на весь буфер? Не очень надежный контроль переполнения. При длительных задержках (а если переполнение произойдет - наверняка задержка будет длительной) переполнение таким образом детектируется ненадежно. Если я Вас правильно понял. "Запустил один раз - и забыл" - так не бывает, так как всё равно есть поток запросов к драйверу от пользовательского кода. Цитата(DS @ Aug 25 2010, 14:55)  Я сам программизмом под Windows стараюсь поменьше вообще не заниматься. Хотя вот последние пару месяцев пришлось разбираться - умер программист, программа большая, писалась и дописывалась около 8 лет, надо хотя бы разобрать все до состояния, когда можно поручить вновь взятому человеку. Соболезную. Желаю Вам всё же в программе успешно разобраться в конце концов. Если там применены какие-то нестандартные приемы по передаче информации из драйвера в пользовательскпий код - это может оказаться непросто.
--------------------
Пишите в личку.
|
|
|
|
|
Aug 25 2010, 11:08
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Oldring @ Aug 25 2010, 15:03)  Что, одно прерывание на весь буфер? Не очень надежный контроль переполнения. При длительных задержках (а если переполнение произойдет - наверняка задержка будет длительной) переполнение таким образом детектируется ненадежно. Если я Вас правильно понял.
"Запустил один раз - и забыл" - так не бывает, так как всё равно есть поток запросов к драйверу от пользовательского кода. Ну можно в счетчик несколько лишних разрядов + сбрасываемый чтением залипающий старший разряд для 100% обнаружения переполнения сделать. Это всего пяток триггеров. Обычно при таком переполнении это уже все лишнее. Запустил - имелся ввиду процесс DMA. Пользователю дальше только надо будет указатели отдавать / в буфер копировать. В любом случае думаю, что на исходный вопрос человек ответ получил.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|