Jump to content
    

DMA и доступ к памяти в Blackfin

Добрый день, форумчане! :)

 

Организую вывод на новый дисплей от BF548. И повторно разбираясь в своем коде подключения дисплея, заметил, что у меня запись картинки в буфер экрана и канал DMA, настроенный на вывод из этого буфера, никак свой доступ не разграничивают по времени. Это допустимо?

 

В большинстве примеров от AD вывод на экран идет с помощью 2-х буферов по типу Ping-Pong. Т.е. после отработки одного буфера, каналу DMA "подсовывается" другой буфер, а в отработавший пишется новая картинка. Но мне это когда-то показалось неудобным, по причине необходимости согласовывать запись в тот или другой буфер с драйвером дисплея и я сделал так, что запись идет всегда в один буфер и вывод с него же. При этом драйвер не "отвлекается" на прерывания об отработке буфера, что положительно сказывается на скорости вывода.

Share this post


Link to post
Share on other sites

Организую вывод на новый дисплей от BF548. И повторно разбираясь в своем коде подключения дисплея, заметил, что у меня запись картинки в буфер экрана и канал DMA, настроенный на вывод из этого буфера, никак свой доступ не разграничивают по времени. Это допустимо?

Если не страшны артефакты от процесса рисования на экране (нет динамической картинки), то допустимо.

Share this post


Link to post
Share on other sites

Ок. спасибо за ответ. Успокоили.

 

Ну непосредственно отрисовка идет в другой буфер. Под программным доступом я подразумевал переброску из буфера отрисовки в буфер экрана. Артефакты есть (ну иногда мелькают кадры с недорисовкой нового кадра. Но это на 100 мс примерно), но очень малозаметные. Скорость вывода при этом возрастает раза в 1.5...2. В приборе будут достаточно статичные картинки, простые меню выбора.

Share this post


Link to post
Share on other sites

"дисплей от BF548", если это про ADI http://www.analog.com/ru/processors-dsp/bl...ts/product.html, то может вы имели в виду котроллер дисплея, а не дисплей?

Share this post


Link to post
Share on other sites

Прошу прощения. перечитал свой вопрос. BF548 - это микроконтроллер.

"Организую вывод на новый дисплей от BF548" надо читать как "Организую вывод изображения на новый дисплей с микроконтроллера BF548".

 

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

Share this post


Link to post
Share on other sites

Прошу прощения. перечитал свой вопрос. BF548 - это микроконтроллер.

"Организую вывод на новый дисплей от BF548" надо читать как "Организую вывод изображения на новый дисплей с микроконтроллера BF548".

 

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

 

Ядро имеет приоритет над каналами DMA при доступе к внешней памяти, поэтому рисование больших полигонов лучше делать с помощью MEMDMA, как и копирование областей. Конечно это не 2D ускоритель, но это сильно ускорит процесс. В этом проце добавили FIFO на чтение буфера, поэтому артефактов быть не должно даже при сильной загрузке. А по времени различные DMA каналы и ядро сами разберутся. Но все это для небольших и средних дисплеев. Для 1024на768 там все хуже будет с производительностью, но заставить сносно работать можно.

Share this post


Link to post
Share on other sites

Недавно был конфликт с одной из библиотечных DSP функций. При расчете FFT экран рассинхронизировался. В регистре статуса DMA появлялась ошибка заполнения буфера DMA. Оказалось, что при интенсивной работе с внешней SDRAM памятью такие ошибки возможны и в контроллере для решения этой проблемы есть даже отдельные битики для установки приоритета DMA параллельного интерфейса EPPI. Если кто столкнется с аналогичной проблемой - то вот решение:

 

*pHMDMA0_CONTROL = *pHMDMA0_CONTROL | ( 1<<10) | ( 1 << 11 );

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...