Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Cortex A8 L1 Cache mode
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
mantech
Приветствую.

Есть задумка ускорить печать текста в экранной области (framebuffer), которая некэширована. Рисование прямоугольников сейчас выполняется с помощью ДМА, а вот текст приходится печатать просто записью в эту область цветовую составляющую пикселя (24бита+альфа). Вопрос, можно каким-либо образом ускорить этот процесс, кэшированием данной области или еще чем-то, но так, чтобы это не отражалось на выводе на дисплей? Например, использование ускорения кэша только для записи в данную область?
aaarrr
Включите для этой области кэш в режиме write-through.
VladislavS
Кэш плюc DMA - хардкор, но попробовать стоит, в худшем случае экспириенс получите sm.gif
Forger
Цитата(mantech @ Aug 19 2018, 18:05) *
Приветствую.

Есть задумка ускорить печать текста в экранной области (framebuffer), которая некэширована. Рисование прямоугольников сейчас выполняется с помощью ДМА, а вот текст приходится печатать просто записью в эту область цветовую составляющую пикселя (24бита+альфа). Вопрос, можно каким-либо образом ускорить этот процесс, кэшированием данной области или еще чем-то, но так, чтобы это не отражалось на выводе на дисплей? Например, использование ускорения кэша только для записи в данную область?


Если позволяет ОЗУ, то я бы создал экранную область еще и там, а содержимое целиком переносил бы в экранную область дисплея по DMA.
Причем, это не обязательно делать с частотой обновления экрана, а желательно синхронизировать с частотой обновления дисплея.
Скажем, частота "кадровой развертки" дисплея 60 Гц, то обновление картинки можно сделать и 20 Гц и даже 10 Гц.
Визуально это будет оч. сложно заметить. Разумеется, если нет видео-анимации и т.п.
В этом случае можно спокойно и фактически не спеша рисовать в этом импровизированном видео-ОЗУ, а в определенные моменты запускать по DMA переброс всего этого ОЗУ во внутреннюю память дисплея.
Если эти две "процедуры" "разнести" во времени, то визуально не будет видно, как например, прорисовывается текст.
К тому же это дает очень строгую детерменированность при обращении к функциям, рисующим/печатающим на дисплее - ведь по сути пишем в собственное ОЗУ, а не куда-то там.
И поэтому уже не нужны мьютексы, чтобы обращаться к этим функциям безопасно из разных RTOS потоков (про printf не вспоминаем - это отдельная "песня").
Фишка тут в том, что скорость записи напрямую во внешний интерфейс всегда будет ниже обращения к собственному ОЗУ, да и она зачастую не детерминирована по времени.

Я так делал даже на обычных копеечных графических монохромных ЖК (без DMA на частоте обновления 10Гц).
Но повторюсь - если есть лишнее ОЗУ и, конечно, если позволяет производительность МК.
mantech
Цитата(aaarrr @ Aug 19 2018, 18:37) *
Включите для этой области кэш в режиме write-through.

Можно по-подробнее, что будет в этом случае, как это работает. Просто с режимами кэша серьезно не имел отношения, достаточно было просто включить его и указать на кэшируемые и некэшируемые регионы...
ЗЫ Сейчас режим кэша Writeback.
aaarrr
Цитата(mantech @ Aug 19 2018, 20:14) *
Можно по-подробнее, что будет в этом случае, как это работает.

В режиме write-through записанные данные немедленно отправляются в память, а не оседают в кэше.
Если экранную область не предполагается читать, то логичнее будет использовать просто режим
буферизованной записи без кэширования.
mantech
Цитата(aaarrr @ Aug 19 2018, 20:48) *
В режиме write-through записанные данные немедленно отправляются в память, а не оседают в кэше.
Если экранную область не предполагается читать, то логичнее будет использовать просто режим
буферизованной записи без кэширования.

На сколь я понимаю ускорение записи в экранную область производится в основном не из за ее кэширования, а блочной записи в память всей линии кэша (burst mode). В кэш контроллерах случаем нет такого режима, чтоб он просто накапливал 32-64 байта и потом одной транзакцией скидывал в память, НО при чтении читал из памяти, а не кэша?
aaarrr
Цитата(mantech @ Aug 19 2018, 21:18) *
В кэш контроллерах случаем нет такого режима, чтоб он просто накапливал 32-64 байта и потом одной транзакцией скидывал в память, НО при чтении читал из памяти, а не кэша?

Я же только что о нем написал, а Вы процитировали: буферизация без кэширования. Есть такой режим.
mantech
Цитата(aaarrr @ Aug 19 2018, 21:24) *
Я же только что о нем написал, а Вы процитировали: буферизация без кэширования. Есть такой режим.

Может, конечно что-то не так сделал, но флаг bufferable устанавливал - только прироста скорости нет никакого...
aaarrr
Цитата(mantech @ Aug 19 2018, 21:37) *
Может, конечно что-то не так сделал, но флаг bufferable устанавливал - только прироста скорости нет никакого...

Когда-то давно экспериментировал, скорость последовательной записи в bufferable соответствовала таковой в режимах с кэшированием. Какие цифры получаются?
mantech
Цитата(aaarrr @ Aug 19 2018, 21:41) *
Когда-то давно экспериментировал, скорость последовательной записи в bufferable соответствовала таковой в режимах с кэшированием. Какие цифры получаются?

Пока только "на глазок" Отрисовывается мгновенно или разворачивается заметно на глаз... Надо как-то скорость замерить...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.