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

Cortex A8 L1 Cache mode

Приветствую.

 

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

Изменено пользователем mantech

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


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

Кэш плюc DMA - хардкор, но попробовать стоит, в худшем случае экспириенс получите :)

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


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

Приветствую.

 

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

 

Если позволяет ОЗУ, то я бы создал экранную область еще и там, а содержимое целиком переносил бы в экранную область дисплея по DMA.

Причем, это не обязательно делать с частотой обновления экрана, а желательно синхронизировать с частотой обновления дисплея.

Скажем, частота "кадровой развертки" дисплея 60 Гц, то обновление картинки можно сделать и 20 Гц и даже 10 Гц.

Визуально это будет оч. сложно заметить. Разумеется, если нет видео-анимации и т.п.

В этом случае можно спокойно и фактически не спеша рисовать в этом импровизированном видео-ОЗУ, а в определенные моменты запускать по DMA переброс всего этого ОЗУ во внутреннюю память дисплея.

Если эти две "процедуры" "разнести" во времени, то визуально не будет видно, как например, прорисовывается текст.

К тому же это дает очень строгую детерменированность при обращении к функциям, рисующим/печатающим на дисплее - ведь по сути пишем в собственное ОЗУ, а не куда-то там.

И поэтому уже не нужны мьютексы, чтобы обращаться к этим функциям безопасно из разных RTOS потоков (про printf не вспоминаем - это отдельная "песня").

Фишка тут в том, что скорость записи напрямую во внешний интерфейс всегда будет ниже обращения к собственному ОЗУ, да и она зачастую не детерминирована по времени.

 

Я так делал даже на обычных копеечных графических монохромных ЖК (без DMA на частоте обновления 10Гц).

Но повторюсь - если есть лишнее ОЗУ и, конечно, если позволяет производительность МК.

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


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

Включите для этой области кэш в режиме write-through.

Можно по-подробнее, что будет в этом случае, как это работает. Просто с режимами кэша серьезно не имел отношения, достаточно было просто включить его и указать на кэшируемые и некэшируемые регионы...

ЗЫ Сейчас режим кэша Writeback.

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


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

Можно по-подробнее, что будет в этом случае, как это работает.

В режиме write-through записанные данные немедленно отправляются в память, а не оседают в кэше.

Если экранную область не предполагается читать, то логичнее будет использовать просто режим

буферизованной записи без кэширования.

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


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

В режиме write-through записанные данные немедленно отправляются в память, а не оседают в кэше.

Если экранную область не предполагается читать, то логичнее будет использовать просто режим

буферизованной записи без кэширования.

На сколь я понимаю ускорение записи в экранную область производится в основном не из за ее кэширования, а блочной записи в память всей линии кэша (burst mode). В кэш контроллерах случаем нет такого режима, чтоб он просто накапливал 32-64 байта и потом одной транзакцией скидывал в память, НО при чтении читал из памяти, а не кэша?

 

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


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

В кэш контроллерах случаем нет такого режима, чтоб он просто накапливал 32-64 байта и потом одной транзакцией скидывал в память, НО при чтении читал из памяти, а не кэша?

Я же только что о нем написал, а Вы процитировали: буферизация без кэширования. Есть такой режим.

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


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

Я же только что о нем написал, а Вы процитировали: буферизация без кэширования. Есть такой режим.

Может, конечно что-то не так сделал, но флаг bufferable устанавливал - только прироста скорости нет никакого...

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


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

Может, конечно что-то не так сделал, но флаг bufferable устанавливал - только прироста скорости нет никакого...

Когда-то давно экспериментировал, скорость последовательной записи в bufferable соответствовала таковой в режимах с кэшированием. Какие цифры получаются?

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


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

Когда-то давно экспериментировал, скорость последовательной записи в bufferable соответствовала таковой в режимах с кэшированием. Какие цифры получаются?

Пока только "на глазок" Отрисовывается мгновенно или разворачивается заметно на глаз... Надо как-то скорость замерить...

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


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

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

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

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

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

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

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

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

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

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