Проблемы с настройкой надежной передачи DMA между двумя контроллерами TSI148 VMEbus.

Я обращаюсь за помощью, прежде всего к экспертам VMEbus.

Я работаю над проектом, целью которого является настройка канала связи от контроллера PowerPC реального времени (Emerson MVME4100), работающего под управлением vxWorks 6.8, до компьютера Intel с Linux (Xembedded XVME6300), работающего под управлением Debian 6 с ядром 2.6.32. Этот канал работает по шине VME; оба компьютера находятся в корпусе VME и оба используют набор микросхем Tundra Tsi148. Компьютер Intel явно настроен как системный контроллер, а компьютер реального времени — нет.

Установка: Для компьютера Intel я написал специальный драйвер, который создает буфер ядра размером 4 МБ и передает его по шине VME посредством подчиненного окна; Для компьютера реального времени я настраиваю передачу DMA для многократной пересылки блоков размером ровно 48640 байт; заполняется байтами тестовых данных (нули, единицы, двойки и т. д.) в быстрой последовательности (раз в 32 миллисекунды, если возможно). Для компьютера Intel я читаю буфер ядра из драйвера, чтобы увидеть, правильно ли поступают данные, с запускаемая вручную программа Python.

Ожидание: я ожидаю увидеть те же данные (нули, единицы и т. д.) из программы Python. Я ожидаю, что время передачи примерно соответствует выбранной скорости шины (обычно 290 мкс или 145 мкс, в зависимости от скорости шины), плюс разумные накладные расходы на настройку DMA (до 10 мкс? Я готов принять большие числа, скажем, сотни мкс, если это то, что обычно нужно автобусу)

Результат:

  • Иногда данные вообще не приходят, а время "передачи" ~2000 мкс.
  • Иногда данные приходят надежно, но время передачи составляет ~98270 мкс или 98470 мкс, в зависимости от выбранной скорости шины.

Вопросы: Как я могу сделать передачу надежной и уменьшить эти ужасные задержки? В каком общем направлении мне следует искать дальше?

(Я хотел бы пометить VMEbus, если бы мог)

Большое спасибо


person Martijn Smitshoek    schedule 07.09.2012    source источник
comment
Я обнаружил, что 98470 мс было связано с недопустимой настройкой на компьютере реального времени. Я использовал модификацию примера передачи VME DMA, в которой я попытался позволить tsi148 использовать размер блока 8192 байта и значение задержки 64 мкс между каждыми двумя блоками. Размер блока 8192 является недопустимым значением, которое код транслировал таким образом, что фактически стало 32 байта, что составляет примерно 97 из 98 миллисекунд задержки.   -  person Martijn Smitshoek    schedule 19.09.2012
comment
Было обнаружено, что невозможность пересылки данных с задержкой ~ 2000 мкс связана с несоответствием скоростей и эндинга на объединительной плате VME. Если транзакция DMA 2eSST320 пытается обратиться к окну, настроенному на 2eSST160, транзакция терпит неудачу, и подпрограмме требуется примерно столько же времени, чтобы обнаружить сбой.   -  person Martijn Smitshoek    schedule 19.09.2012
comment
Martijn, я ничего не знаю об этой теме, я просто хотел похвалить вас за хорошо сформулированный и обстоятельный вопрос.   -  person Ben Graham    schedule 05.10.2012


Ответы (1)


Мои комментарии к вопросу описывают, как я заставил шину работать: - убедитесь, что 2eSST320 с обеих сторон шины - убедитесь, что транзакция DMA использует допустимый размер блока (самый большой допустимый размер - 4096 байтов)

Я достиг эффективной скорости 150 Мбайт/с (шина может достигать 320 Мбайт/с, но известно, что чип tsi148 вызывает значительные накладные расходы). Этого достаточно для меня.

person Martijn Smitshoek    schedule 19.09.2012