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

 
 
 
Reply to this topicStart new topic
> Xilinx Microblaze + DMA(Scatter/Gather)
Denis C
сообщение Oct 6 2015, 21:26
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 9-06-06
Из: Saint-Petersburg
Пользователь №: 17 924



Здравствуйте! Хотелось бы спросить у знатоков о следующей ситуации:
Используется DMA в режиме Scatter/Gather. Отлаживаю канал S2MM. Софт написан на основе примера от Xilinx'а "xaxidma_multichan_sg_intr".
Завел к примеру 8 дескрипторов (1 дескриптор = 1 внешний AXI-stream пакет, кончающийся по сигналу TLAST).
Приходят 8 пакетов. После чего все дескрипторы становятся обработанными (post-processed). Если потом не освободить и не передать корке DMA новые дескрипторы, то естественно пропадает сигнал TREADY и еще неожиданно появляется ошибка-прерывание(флаг Err_irq в 14 бите регистра S2MM_DMASR) и после этого корка не работает без сброса.
Тем, что я не даю корке новые дескрипторы, я пытался эмулировать задержку дальнейшей обработки данных (некий Flow-control организовать). При этом я расчитывал, что корка просто не будет давать сигнал TREADY источнику данных.
Вопрос: как в данной ситуации правильно организовать flow-control S2MM в данном случае ? Ведь могут быть ситуации, когда записанные в память данные, потребитель обрабатывает с меньшей скоростью.
Go to the top of the page
 
+Quote Post
doom13
сообщение Oct 10 2015, 07:35
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Denis C @ Oct 7 2015, 00:26) *
Если потом не освободить и не передать корке DMA новые дескрипторы, то естественно пропадает сигнал TREADY и еще неожиданно появляется ошибка-прерывание(флаг Err_irq в 14 бите регистра S2MM_DMASR) и после этого корка не работает без сброса.

В моём случае нормально работает: закончились дескрипторы - DMA остановился (состояние IDLE), добавили новые дескрипторы - работает дальше (использую свой драйвер).
Go to the top of the page
 
+Quote Post
Denis C
сообщение Oct 11 2015, 11:43
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 9-06-06
Из: Saint-Petersburg
Пользователь №: 17 924



Цитата(doom13 @ Oct 10 2015, 10:35) *
В моём случае нормально работает: закончились дескрипторы - DMA остановился (состояние IDLE), добавили новые дескрипторы - работает дальше (использую свой драйвер).


Подскажите плз какие прерывания разрешаете в регистре DMACR, все 3 (ERR_IrqEn, Dly_IrqEn, IOC_IrqEn) ?
Go to the top of the page
 
+Quote Post
doom13
сообщение Oct 11 2015, 12:06
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Denis C @ Oct 11 2015, 14:43) *
Подскажите плз какие прерывания разрешаете в регистре DMACR, все 3 (ERR_IrqEn, Dly_IrqEn, IOC_IrqEn) ?

ERR_IrqEn, IOC_IrqEn
Go to the top of the page
 
+Quote Post
Denis C
сообщение Oct 13 2015, 12:00
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 9-06-06
Из: Saint-Petersburg
Пользователь №: 17 924



Немного уточню вопрос после поисков проблемы. Суть в том, что DMA загружает ранее уже обработанные дескрипторы (в которых я не очистил флаг CMP). Из-за этого возникает ошибка SGIntErr. Т.е. DMA по дескрипторной цепочке возвращается к началу.
Возникает вопрос по регистрам S2MM_CURDESC и S2MM_TAILDESC:
Допустим выделил 2 дескриптора, установил регистры CURDESC = adr, TAILDESC = adr + 64. После прихода первого пакета CURDESC = TAILDESC = adr+64. После прихода второго пакета регистры вновь CURDESC = adr, TAILDESC = adr + 64.
Хотя в ДШ пишут: "The tail pointer is initialized by software to point to the end of the descriptor chain. This becomes the pause point for hardware. When
hardware begins running, it fetches and processes each descriptor in the chain until it reaches the tail pointer. The AXI DMA then pauses descriptor processing."
Т.е. когда указатели CURDESC и TAILDESC сравняются DMA должно остановиться, а не продолжать загружать дескрипторы. А я вижу противоположное.
Что-то я не так видимо понимаю...
Go to the top of the page
 
+Quote Post
doom13
сообщение Oct 13 2015, 14:53
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Что-то похожее возникало в начале работы с DMA, сейчас даже не могу повторить данную ошибку. Может быть всё дело в последовательности настройки/запуска DMA, у меня всё сделано по даташиту:
0) Инициализация кольца дескрипторов
1) Сброс DMA
2) Запись Current Descriptor
3) Установка Start-bit
4) Разрешение прерываний
5) Запись Tail Descriptor

Далее софт просто возвращает обработанные дескрипторы, стирает в дескрипторе бит Compl и записывает дескриптор в Tail.
Go to the top of the page
 
+Quote Post
Denis C
сообщение Oct 14 2015, 11:07
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 9-06-06
Из: Saint-Petersburg
Пользователь №: 17 924



В принципе также настраиваю. Ваш драйвер не тормозит S2MM канал обнулением бита Start ? И кстати какая версия DMA используется (у меня 6.03а)?
Go to the top of the page
 
+Quote Post
doom13
сообщение Oct 14 2015, 14:37
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Denis C @ Oct 14 2015, 14:07) *
В принципе также настраиваю. Ваш драйвер не тормозит S2MM канал обнулением бита Start ? И кстати какая версия DMA используется (у меня 6.03а)?

Нет не тормозит, генератор трафика работает в непрерывном режиме TCOUNT = 0. Тормозит его TREADY, если закончились дескрипторы.
Версия DMA 7.1 (Vivado 2015.2).


Похоже, нашёл Вашу проблему, поймал ту ситуацию, что была в начале работы с DMA. При Cyclic = 0, если драйвер успевает вычитывать и обновлять дескрипторы, всё работает нормально. Если заканчиваются дескрипторы, то останавливается (Halted = 1) и выдаёт ошибку (SGIntErr = 1).

Эта проблема решается установкой бита Cyclic = 1. Но система работает немного отлично от режима описанного в даташите на DMA. Т.е. у меня используется кольцо дескрипторов, задаю начальный и конечный адрес. Когда дескрипторы заканчиваются DMA останавливается и ждёт (Idle = 1), в Tail Descriptor софт записывает уже обработанные дескрипторы - DMA продолжает работу. Получается, DMA по кругу гоняет дескрипторы, бит Cyclic установлен, а DMA останавливается если Current == Tail.
В Tail Descriptor всегда записываем дескриптор из кольца, немного не соответствует описанию работы в документе, но работает. Может у Вас такая же ситуация?
Go to the top of the page
 
+Quote Post
Denis C
сообщение Oct 14 2015, 19:03
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 9-06-06
Из: Saint-Petersburg
Пользователь №: 17 924



Спасибо за информацию! Почитал ДШ на 7.1. В моей версии 6.03а еще нету настройки режима Cyclic.
Тут дело оказалось в другом. Первоначально я настроил корку в режим Multichannel. Сегодня перевел в одноканальный режим для теста, и о чудо - корка начала тормозиться, когда доходит до последнего дескриптора и продолжает работать после обновления TAIL'а! Как в ДШ описано.
Нашел неприятное ограничение для многоканального режима : "Does not support descriptor queuing in S2MM path for multichannel mode". В 7.1 оно тоже есть. Видимо это и есть тот случай, когда корка непрерывно дескрипторы загружает.

Сообщение отредактировал Denis C - Oct 14 2015, 19:06
Go to the top of the page
 
+Quote Post
doom13
сообщение Oct 14 2015, 19:56
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



А какую производительность DMA получаете для Вашей шины данных и частоты тактирования?
Go to the top of the page
 
+Quote Post
Denis C
сообщение Oct 14 2015, 21:08
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 9-06-06
Из: Saint-Petersburg
Пользователь №: 17 924



В Simple Mode было что-то типа ~550 Мбайт/c. В SG режиме еще не измерял. Все шины данных по 32 бита на частоте 200 Мгц.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2025 - 20:49
Рейтинг@Mail.ru


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