Перейти к содержанию
    

Проблемы с DMA для PCI-express

Привет, всем! :help:

Нужна помощь по DMA для PCI-express!

Я уже замаялся, но в толк не возьму почему все так плохо...

Сделал проект с DMA для PCI-express на базе XAPP1052 для виртекс 6. Где-то слышал, что он кривенько

написан... может быть, вопрос не в этом... Вопрос или даже проблема в том, что пакеты ядро

посылаются, а оттуда ну очень медленно выходят и не освобождают буфер. При чем чем длиннее пакет

тем быстрее "затык".

Для наглядности прикрепляю скрины с чипскопа.

Я в ступоре... Мыслей умных нет...что делать и куда смотреть уже и не знаю...

Кто может толкните :twak: , чуствую, что решение под ногами, но где :wacko:

Прикол в том, что модель на симуляторе такого не показывает, там все ок...

post-54-1342204650_thumb.jpg

post-54-1342204657_thumb.jpg

post-54-1342204662_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В картинках с ходу разобраться не могу. Можно пояснить что собственно происходит и что ожидается.

 

А посмотреть можно у меня в проекте: http://ds-dev.ru

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В картинках с ходу разобраться не могу. Можно пояснить что собственно происходит и что ожидается.

 

А посмотреть можно у меня в проекте: http://ds-dev.ru

 

Ваш проект смотрел... аналогично с ходу разобраться не могу :)... (но может быть придется)

На картинках относительно :) все просто... это я так для наглядности...

Глобально проблема и вопрос по функционированию pci-express корки ибо это она (точнее я и не знаю почему) глючит.

Предистория:есть плата с виртексом 6-м и источником информации которую надо передавать в память компа, есть программа для ее управления, сделал проект на базе XAPP1052 (убрал остановку после передачи пакета и формирования прерывания), странслировал, прошил, запустил, все ок! Чипскоп показал, что пакеты летят, trn_tbuf_av (в связи с большой скоростью пакетов) постепенно доходит до 0 и затем меняется 1 (передаю пакет), 0 (жду пока корка передаст его в память) , 1 и т.д. Начинаю дополнять проект, разными своими необходимостями (обработка, фифо и т.д.) автомат формирования пакетов не трогаю (прерывания вообще заблокировал) и вдруг!!! получаю то что на картинках:

trn_tbuf_av начинает показывать, что буферы в корке начинают освобождаться о-очень медленно, значение доходить до 0 , после чего выставляется trn_dst_rdy в 1 и гудбай :(, на этом и стоит, корка ничего не передает, более того, если в этот момент, программа читает чего из платы... комп зависает намертво...

Вот такая суть проблемы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может поможет то, что напишу)

Работал с ПЛИС Altera Stratix IV.

Терминология у них такая:

tx_st_ready - сигнал готовности принимать данные коркой,

tx_st_data - 128-битное слово для передачи.

Для передачи данных я формировал пакет максимум из девяти 128-битных слов:

первое слово - заголовок, 8 последующих - непосредственно данные.

В заголовке указывался адрес, куда на ПК надо складывать данные, ну и другая службная информация (все в соответствии со спецификацией на PCIE и описанием корки).

 

Данные вычитывались из некого буфера размером 150 слов (каждое слово по 128 бит).

Пересылать нужно было разное количество слов, как меньше 150 слов, так и больше 150.

 

Если меньше 150 - никаких проблем, ready - иногда скакало, буфер заполнялся/освобождался, но все работало.

Если больше 150, то посылалось так (150 разбивал на 8 слов и еще довесок в 6 слов):

8 8 8 8 8 8 8 6, потом у меня была пауза на ожидание, пока вновь заполнится буфер, после опять 8 8 8 ... Х. Х- не имеет значения.

При этом адресацию данных не нарушал, то есть последовательно заполнял выделенную мне память на стороне ПК, не обращая внимания на остановки и паузы.

В этом случае ready скакал ужасно. Если передавал много пачек по 150 слов, то корка PCIE падала на мертво (ready в ноль) после 7 пачки (точно не помню), вешая в последствии комп.

 

Побядил эту байду так: увеличил буфер до 152 слов, сделав его кратным 8.

Теперь передаю так:

8 8 8 8 8 8 8 8, пауза на заполнение буфера, 8 8 8 8 8 8 8 8, пауза, ..., 8 8 8 ... Х.

 

Корка с тех пор уже не вешалась)))

 

Для себя решил, что проблема в какойто хитрож..умной адресации данных, которую я нарушал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Хм-м, возможно, хотя на модели как раз все супер :(, да и формирование пакетов, я не трогаю... данные другие идут, ну и что (мысли вслух)...

Интересно, что при коротких пакетах корка дольше "держится", а при более длинных - как на картинке - один пакет передала и все...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я тоже думаю, что дело в формировании пакета. Может ошиблись размером или адресом.

Вопрос к вам: куда передаете данные? данные доходят все или есть потери?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...