Обновить

Комментарии 3

Пара мыслей спросонок. Не претендуя на глубокий смысл, конечно же.

> Max Burst Size – ... Пока этот размер ... записан или прочитан, другие ... не смогут обратиться... .

Наверное, всё-таки, это (по аналогии с сетями) объём данных "сверх пропускной способности", который модуль может прожевать. Но не должен. Иначе бы назывался как-нибудь вроде Min Frame Size (и не имел понятного, по крайней мере для меня, функционального смысла).

В вашем примере с launch_dma_includes() с указателями нигде не используется volatile. Они там все передаются в Xil-функции, где, наверняка, приводятся, но всё же. Возможно, из-за подобного подхода в C-коде у вас не получается работать с кэшами, и приходится их отключать.

Очень интересно было бы посмотреть сколько тактов займёт этот лаунч, если указателям натыкать volatile. По идее столько же, но компилеры умеют удивлять, а любопытство это двигатель прогресса. Впрочем, как и причина травм и преждевременной смерти)))

Сто лет как не занимаюсь ПЛИСами, так что "прошу отнестись с пониманием" ©

  1. Нет, это как раз таки max burst size. Например хотим передать 100 байт, а max burst size равен 64байта, тогда на адресной шине увидем два запроса, один на 64 байта а после короткой паузы ещё один запрос на 36 байт.

  2. Зачастую видел примеры при работе с дма, после его настройки вызывается функция Flush(), которая должна актуализировать все что в кэше. Так что думаю volatile не спасет)

ВНИМАНИЕ!!!
В статье я предоставил код функции launch_dma_registers() , в ней я делаю сброс ДМА. Как я уже писал я редко использую сброс для ДМА, в итоге решил проверить как работает сброс в разных режимах работы.
В ИТОГЕ: код со сбросом ДМА лишний, приводит к зависанию самого ДМА. Для разовой отправки все нормально но вот при много кратном повторении все зависает.

Статью редактировать уже не буду, надеюсь этот комментарий заметят)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации