mantech 53 19 августа, 2018 Опубликовано 19 августа, 2018 (изменено) · Жалоба Приветствую. Есть задумка ускорить печать текста в экранной области (framebuffer), которая некэширована. Рисование прямоугольников сейчас выполняется с помощью ДМА, а вот текст приходится печатать просто записью в эту область цветовую составляющую пикселя (24бита+альфа). Вопрос, можно каким-либо образом ускорить этот процесс, кэшированием данной области или еще чем-то, но так, чтобы это не отражалось на выводе на дисплей? Например, использование ускорения кэша только для записи в данную область? Изменено 19 августа, 2018 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 19 августа, 2018 Опубликовано 19 августа, 2018 · Жалоба Включите для этой области кэш в режиме write-through. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 19 августа, 2018 Опубликовано 19 августа, 2018 · Жалоба Кэш плюc DMA - хардкор, но попробовать стоит, в худшем случае экспириенс получите :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 19 августа, 2018 Опубликовано 19 августа, 2018 · Жалоба Приветствую. Есть задумка ускорить печать текста в экранной области (framebuffer), которая некэширована. Рисование прямоугольников сейчас выполняется с помощью ДМА, а вот текст приходится печатать просто записью в эту область цветовую составляющую пикселя (24бита+альфа). Вопрос, можно каким-либо образом ускорить этот процесс, кэшированием данной области или еще чем-то, но так, чтобы это не отражалось на выводе на дисплей? Например, использование ускорения кэша только для записи в данную область? Если позволяет ОЗУ, то я бы создал экранную область еще и там, а содержимое целиком переносил бы в экранную область дисплея по DMA. Причем, это не обязательно делать с частотой обновления экрана, а желательно синхронизировать с частотой обновления дисплея. Скажем, частота "кадровой развертки" дисплея 60 Гц, то обновление картинки можно сделать и 20 Гц и даже 10 Гц. Визуально это будет оч. сложно заметить. Разумеется, если нет видео-анимации и т.п. В этом случае можно спокойно и фактически не спеша рисовать в этом импровизированном видео-ОЗУ, а в определенные моменты запускать по DMA переброс всего этого ОЗУ во внутреннюю память дисплея. Если эти две "процедуры" "разнести" во времени, то визуально не будет видно, как например, прорисовывается текст. К тому же это дает очень строгую детерменированность при обращении к функциям, рисующим/печатающим на дисплее - ведь по сути пишем в собственное ОЗУ, а не куда-то там. И поэтому уже не нужны мьютексы, чтобы обращаться к этим функциям безопасно из разных RTOS потоков (про printf не вспоминаем - это отдельная "песня"). Фишка тут в том, что скорость записи напрямую во внешний интерфейс всегда будет ниже обращения к собственному ОЗУ, да и она зачастую не детерминирована по времени. Я так делал даже на обычных копеечных графических монохромных ЖК (без DMA на частоте обновления 10Гц). Но повторюсь - если есть лишнее ОЗУ и, конечно, если позволяет производительность МК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 19 августа, 2018 Опубликовано 19 августа, 2018 · Жалоба Включите для этой области кэш в режиме write-through. Можно по-подробнее, что будет в этом случае, как это работает. Просто с режимами кэша серьезно не имел отношения, достаточно было просто включить его и указать на кэшируемые и некэшируемые регионы... ЗЫ Сейчас режим кэша Writeback. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 19 августа, 2018 Опубликовано 19 августа, 2018 · Жалоба Можно по-подробнее, что будет в этом случае, как это работает. В режиме write-through записанные данные немедленно отправляются в память, а не оседают в кэше. Если экранную область не предполагается читать, то логичнее будет использовать просто режим буферизованной записи без кэширования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 19 августа, 2018 Опубликовано 19 августа, 2018 · Жалоба В режиме write-through записанные данные немедленно отправляются в память, а не оседают в кэше. Если экранную область не предполагается читать, то логичнее будет использовать просто режим буферизованной записи без кэширования. На сколь я понимаю ускорение записи в экранную область производится в основном не из за ее кэширования, а блочной записи в память всей линии кэша (burst mode). В кэш контроллерах случаем нет такого режима, чтоб он просто накапливал 32-64 байта и потом одной транзакцией скидывал в память, НО при чтении читал из памяти, а не кэша? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 19 августа, 2018 Опубликовано 19 августа, 2018 · Жалоба В кэш контроллерах случаем нет такого режима, чтоб он просто накапливал 32-64 байта и потом одной транзакцией скидывал в память, НО при чтении читал из памяти, а не кэша? Я же только что о нем написал, а Вы процитировали: буферизация без кэширования. Есть такой режим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 19 августа, 2018 Опубликовано 19 августа, 2018 · Жалоба Я же только что о нем написал, а Вы процитировали: буферизация без кэширования. Есть такой режим. Может, конечно что-то не так сделал, но флаг bufferable устанавливал - только прироста скорости нет никакого... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 19 августа, 2018 Опубликовано 19 августа, 2018 · Жалоба Может, конечно что-то не так сделал, но флаг bufferable устанавливал - только прироста скорости нет никакого... Когда-то давно экспериментировал, скорость последовательной записи в bufferable соответствовала таковой в режимах с кэшированием. Какие цифры получаются? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 19 августа, 2018 Опубликовано 19 августа, 2018 · Жалоба Когда-то давно экспериментировал, скорость последовательной записи в bufferable соответствовала таковой в режимах с кэшированием. Какие цифры получаются? Пока только "на глазок" Отрисовывается мгновенно или разворачивается заметно на глаз... Надо как-то скорость замерить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться