Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Несколько вопросов по DMA и передаче данных  (Прочитано 19914 раз)
0 Пользователей и 1 Гость смотрят эту тему.
NeStor46
Интересующийся

ru
Offline Offline

« : 18-09-2014 16:47 » 

Здравствуйте, раньше уже писал о проблеме с контроллером DMA, но их решить удалось (пишу на WDF). Посмотрел на то, как он работает, какие скорости получаются и возникло несколько вопросов, на которые пока не нашел ответа, может быть Вы сможете помочь.

В общем заметил, что максимальное количество Scatter/Gather элементов (SgList->Elements) равно 256, не больше, а максимальный объем передаваемых 1020кб (1044480 байт). В общем максимальная длина передаваемых данных за одну транзакцию равно ~1МБ. Допустим, мне надо передать 10МБ данных, на это уходит примерно 10 транзакций, т.е. каждый раз заполнять заполнять таблицу дескрипторов, запускать транзакцию, ждать прерывание, обрабатывать его, проверять переданы ли все данные, запускать следующую транзакцию и так до тех пор, пока все данные не будут переданы. На это же уходит очень много времени, в итоге получаемая скорость передачи получается около 500-600 МБ/с.

Сами вопросы:
1) Так и должно быть, или же это ограничение можно убрать или обойти, увеличив максимальный объем передаваемых данных за одну транзакцию?
2) Думаю все было бы быстрее, если б можно было просто выделить непрерывный буфер и связать его с пользовательской программой, тогда и вся инициализация почти времени не занимала бы и скорость, наверное, увеличилась бы, но можно ли это провернуть? Нашел следующую тему - https://forum.shelek.ru/index.php/topic,28511.0.html , там случайно не так реализовано?

Теперь несколько вопросов общего плана:
3) Один день сталкивался с проблемой, когда при определенных размерах передаваемого буфера, например ~9000 байт вылетал синий экран с ошибкой bugcode_usb_driver, при этом при 10000 байт такого не было. Сейчас такого в принципе нет, но просто интересно как это было связано и сталкивались ли Вы с таким?
4) Еще один непонятный момент. При объемах передаваемых буферов ~4МБ все работает стабильно, но при их увеличении начинаются чудеса. При 16 МБ может нормально работать, а может просто зависнуть вся система, намертво. Есть подозрение, что плата вешает слишком частыми прерываниями, которые не успевают обрабатываться, но почему же иногда работает, а иногда нет. Не сталкивались с таким?

P.S. Вообще очень интересное приключение получается у меня с этим драйвером, каждый день старые ошибки уходят, но приходят новые, хотя ничего глобального, да и локального тоже не меняется.
P.S.S. Извините, не совсем понимаю почему текст в курсив свалился и как это исправить.
« Последнее редактирование: 18-09-2014 16:51 от NeStor46 » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 18-09-2014 16:58 » 

1. ваши ограничения скорее всего связаны с аппаратной реализацией контроллера.
2. можно попробовать. да та тема была про это. кстати а вам какая скорость нужна?
3. почти все "плавающие" проблемы обычно говорят о какой то глобальной ошибке в архитектуре драйвера) у меня такое бывало.  (не понял при чем тут USB? и что за 9 или 10кбайт?)
4. частота прерываний - запуститите оснастку счетчиков производительности. там можно загруженность измерить на обработке прерываний. а так же число IPC/DPC. в свое время вешал машину при помощи 40кГц прерываний, но это было давно)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
NeStor46
Интересующийся

ru
Offline Offline

« Ответ #2 : 18-09-2014 17:41 » 

Ochkarik, спасибо за быстрый ответ.
1. Насчет ограничений из-за аппаратной реализации есть сомнения, завтра уточню этот вопрос у железняков. Т.е. по идее такого ограничения в 1020 кб на одну транзакцию быть не должно и система может предоставлять больше 256 элеметов скаттер/гаттер? (Если системе удается выдать несколько физических страниц, идущих подряд (например 4 страницы подряд - SgList->Elements.Length=16384), то элементов скаттер/гаттер будет меньше, т.е. ограничение именно на максимальную длину одной транзакции).
2. Тестовое приложение, которое шло в комплекте с платой показывало скорость порядка 1300 МБ/с, думаю неплохо было бы получить примерно такие же (правда не знаю как именно так считается скорость, может не учитывают время на инициализацию).
3. При чем тут USB я тоже не понял, самое интересное, что когда мышь переставил в другой разъем - ошибка на какое-то время прошла. 9 и 10 кб - при объеме передаваемого буфера в 9 кб - ошибка была, при 10 кб - ошибки не было. В принципе последние пару дней этой ошибки не было, но она меня как-то смутила.
4. Вы о каких-то системных счетчиках - http://www.oszone.net/12948/perfmon3 о таких? Они помогут понять, что дело именно в частоте прерываний, если систему попросту приходится перезагружать, когда она зависает и никак не реагирует? (Извините, если много лишних вопросов, просто на работе не слишком удобно сидеть в интернете)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 18-09-2014 20:12 » 

быстрый - это я с работы уходил как раз быстро))) обычно из дома уже не захожу)
1. уточните. может дело не в транзакции а в кратности чему либо с чем либо...
2. тут как измерять) если потоковая передача - тогда  пофиг. имеет смысл просто зависимость посмотреть - быстро растет или не очень?
3. видимо дело в нагрузке прерываниями. USB на нем же сидит? сколько у вас сейчас частота прерываний идет?
4. да про них. там многое посмотреть можно. в том числе и всякие прерывания, переключения контекстов, скорости ввода вывода и т.п. бывает интересно)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
NeStor46
Интересующийся

ru
Offline Offline

« Ответ #4 : 03-12-2014 09:14 » 

Ochkarik, Доброго времени) Почему-то некоторое время не мог авторизоваться на сайте, потом подзабыл, но вот я снова с вами.
По прошлым вопросам некоторые аспекты прояснились, может кому пригодится:
1. Насчет ограничения на транзакцию. Она присутствует, если устройство описывать как 32-разрядное (WdfDmaProfileScatterGather), если же описать его WdfDmaProfileScatterGather64, то никакого ограничения нет и за один вызов можно спокойно прокрутить всю транзакцию.
2. Насчет скорости... фиг её знает, что там со скоростью. Слишком много времени на инициализацию транзакции тратится (пока все элементы SgList переберет, да еще и запишет по нужным регистрам.... ну очень долго выходит).
3 и 4. Пункты были глюками системы, потому что при тестировании на другом компьютере всё нормально стало.


Но это всё строе, сейчас же новая проблемка. Необходимо передавать данные между двумя платами. И вот тут я немного присел, ибо с передачей "система-устройство" всё просто, адреса буферов дает система и пиши туда спокойно, но с передачей "устройство-устройство".. Где взять адреса, по которым необходимо писать, чтобы данные попали в другое устройство? Я пока пробую записать по тем, что показаны в диспетчере устройств, но что-то подсказывает, что это пустая трата времени. Как можно передавать данные напрямую между устройствами в обход ОЗУ? И как узнать адреса, по которым следует писать? Да и как вообще можно осуществить передачу "устройство-устройство"?
Заранее спасибо за потраченное время.
Записан
NeStor46
Интересующийся

ru
Offline Offline

« Ответ #5 : 08-12-2014 21:16 » 

В одной из тем  вы писали: "вызываем драйвер: мапируем буфер в системную память. делаем ее NonPageble. получаем физические адреса на нее, и сообщаем их плате.
инициализируем начало транзакции на плате." Но это касалось выделенного с помощью "DMAAdapter->DmaOperations->AllocateCommonBuffer" общего буфера. А законно ли сделать что-то подобное с памятью, которая была отображена с помощью "MmMapIoSpace" во время инициализации устройства? У меня пока выходило налетать только на синие экраны, но непонятно из-за того ли, что так вообще нельзя или же я что-то не так делаю.

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

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 09-12-2014 08:20 » 

так сходу не знаю... если получится и время будет постараюсь поискать...

Добавлено через 5 часов, 7 минут и 59 секунд:
а собственно... подумал.
может быть вы должны на одной плате сделать отображаемую память.
а ее физические адреса на шине узнать и передать второй плате. пусть она в них и пишет.
вроде шина ж общая я так понимаю...

Добавлено через 1 минуту и 19 секунд:
а винда тут вроде как и ни при чем получается...
« Последнее редактирование: 09-12-2014 13:29 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
NeStor46
Интересующийся

ru
Offline Offline

« Ответ #7 : 09-12-2014 15:16 » 

Ochkarik, всё оказалось как-то слишком просто... сегодня попробовал записать из одной платы в другую  по адресам, которые показаны в диспетчере устройств и вуаля! Вышло! Вроде бы, по крайней мере. Оказывается раньше этого не получалось, потому что проблема с самим драйвером была, а не в адресах: он перестал писать и  читать почему-то. Откатил на рабочую версию, поменял адреса на те, что отображаются в диспетчере и получилось. Завтра буду проверять реально ли это все так работает, или же что-то где-то упустил и рано радуюсь.
Простите за потраченное время.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 09-12-2014 15:59 » new

да нет, почему потраченное, все полезно) но вроде ж тут драйвер данные не участвует в передаче данных? почему он влиял то?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
NeStor46
Интересующийся

ru
Offline Offline

« Ответ #9 : 09-12-2014 17:02 » 

Ochkarik, видимо что-то где-то не туда записывалось при инициализации транзакции и DMA впустую гонял или нули гонял, или что-то вроде того. Как назло еще и тестовая программа от Altera, которая позволяет читать и писать по определенным адресам в PCIe и вообще тестировать скорости передачи и прочее, не запускается на рабочем компе, выдавая синие экраны. Поэтому точно сказать не могу, что конкретно там не работало.
Как подробней разберусь, так сразу отпишусь, вдруг кому интересно будет)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines