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

Контроллер дисплея ILI9341: (4-проводный SPI-II): работает только с паузой между байтами ~1 мкс

13 hours ago, jcxz said:

При чём тут DMA?

Разбиваете весь видеобуфер на N частей по M пикселей каждая. Конвертируете (процессором конечно) пиксели из первой части через таблицу преобразования цветов в промежуточный буфер отправки. Запускаете отправку из этого буфера в SPI (посредством DMA). Пока идёт передача пикселей первой части, параллельно конвертируете вторую часть во 2-й промежуточный буфер, в конце конвертирования - ожидание завершения DMA-передачи 1-й части и запуск 2-й части (естественно - на семафоре ОС). И снова - конвертируете следующую часть и так далее. В результате - конвертирование займёт времени намного меньше чем собственно передача по SPI (если конечно писать с умом).

 

PS: Ещё больше эффект от такого метода будет если цветов только 16.

А, ну так и я могу :)

Дополнительная загрузка процессора тут неслабая получается, экономия памяти сомнительная (нужно буфер под оригинальный сжатый массив и под DMA). Но в каких-то ситуациях этот путь может и быть.

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


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

1 час назад, Ruslan1 сказал:

Дополнительная загрузка процессора тут неслабая получается

И как это вычислили? У меня в проекте, сделанном подобным образом (только с 4-битным цветом), загрузка процессора таким выводом на LCD - я точно не помню сколько, но что то меньше 10%. Это при SCLK=40 МГц. На 20МГц будет ещё меньше. Даже на ассемблере не стал оптимизировать, ибо - ерунда.

Это "неслабая"?

1 час назад, Ruslan1 сказал:

экономия памяти сомнительная (нужно буфер под оригинальный сжатый массив и под DMA). Но в каких-то ситуациях этот путь может и быть.

Экономия почти в 2 раза (для 8-битного цвета) или почти в 4 раза (для 4-битного) - это "сомнительная"?

Экономия в несколько десятков КБ внутренней ОЗУ. И рисование не во внешней медленной, а во внутренней, значительно более быстрой памяти. Плюс - отсутствие всяких заполнений одним цветом и связанных с этим тормозов, мерцаний и других артефактов. И то что:

В 27.02.2020 в 16:36, Ruslan1 сказал:

что у этого контроллера ILI9341 нет специальной команда "заполнить CGRAM указанной величиной"

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

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


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

7 hours ago, jcxz said:

И как это вычислили? У меня в проекте, сделанном подобным образом (только с 4-битным цветом), загрузка процессора таким выводом на LCD - я точно не помню сколько, но что то меньше 10%. Это при SCLK=40 МГц. На 20МГц будет ещё меньше. Даже на ассемблере не стал оптимизировать, ибо - ерунда.

Это "неслабая"?

Убить на такую"оптимизацию" дополнительно 10% процессорного времени- это непозволительная роскошь для меня. У меня сейчас там задач 30 крутится, некоторые из них уже довольно ресурсоемкие (DSP).

7 hours ago, jcxz said:

Экономия почти в 2 раза (для 8-битного цвета) или почти в 4 раза (для 4-битного) - это "сомнительная"?

"сомнительная"- потому что не на пустом месте. Нужно дополнительно буфер под DMA, и "почти в два раза" превращается во что? в "почти в полтора раза"? Или предлагается по 1 килобайту гонять и часто отвлекаться на создание буфера? в таком случае нужно будет очень часто в эту низкоприоритетную задачу переходить, тормоза при прорисовки на экране из-за задержек между такими короткими передачами будут видны.

7 hours ago, jcxz said:

И то что:

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

Нет. Это как бы намекает, что если нужна скорость- то нужно использовать параллельный интерфейс (8- или 16- битный), а не последовательный. А уж если выбран последовательный-  то нужно жертвовать ресурсами ведущего процессора,чтоб добится ускорения. Ну и еще разработчики как бы намекают, что эта команда не настолько востребована, чтобы снизить привлекательность этого контроллера на рынке- просто все покупают и выкручиваются как могут, имея то что есть. И я уже писал выше, что даже если не стирать а просто писать- то у меня выигрыш по количестве пересылаемых данных будет 25%, несерьезный профит на фоне увеличения объема нужных  для этого ресурсов (полный экран в RAM ЦП, пусть и сжатый).

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


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

57 минут назад, Ruslan1 сказал:

Убить на такую"оптимизацию" дополнительно 10% процессорного времени- это непозволительная роскошь для меня. У меня сейчас там задач 30 крутится, некоторые из них уже довольно ресурсоемкие (DSP).

Вспоминается поговорка про книгу и фигу... :unknw: Странно - пишу одно, а понимаете совсем другое, такое ощущение, что читали мой пост через слово....

Во-первых: где я писал про 10%? Я писал "не более 10%". Точно сказать не могу, так как девайс далеко. Да и эти 10% - это не "эта оптимизация занимает", это общая загрузка процессора у меня в ПО, когда обновляется только экран, а других тяжёлых задач не выполняется. Т.е. - включает в себя рисование (немножко) и много других мелких задач, в том числе саму пересылку в SPI.

Во-вторых: я писал у меня SCLK=40МГц, соответственно при ваших 20МГц загрузка CPU задачей конвертирования будет в 2 раза ниже.

В-третьих: А сколько у вас сейчас %-ов времени занимает рисование? И это рисование во внешней ОЗУ. А у меня - во внутренней ОЗУ. Надеюсь не нужно говорить, что во внутренней ОЗУ рисование может происходить в разы быстрее (во сколько именно - зависит от процедур рисования). Так что общий суммарный результат рисование+конвертирование+пересылка при переходе на внутренюю память с конвертированием может оказаться не то что не медленнее, а даже быстрее чем рисование+пересылка во внешней памяти.

Цитата

"сомнительная"- потому что не на пустом месте. Нужно дополнительно буфер под DMA, и "почти в два раза" превращается во что? в "почти в полтора раза"? Или предлагается по 1 килобайту гонять и часто отвлекаться на создание буфера? в таком случае нужно будет очень часто в эту низкоприоритетную задачу переходить, тормоза при прорисовки на экране из-за задержек между такими короткими передачами будут видны.

У меня - два DMA-буфера по 2 КБ каждый. Берём калькулятор и считаем: 2048*8/(40e+6)=0.4 мсек - это период активации задачи конвертирования. Это что - "часто"? Затраты процессорного времени на переключение задачи - доли процента. Вобщем - опять приводите надуманные мифические проблемы.

И что за "тормоза при прорисовки на экране"? О чём речь? И что за "задержки между передачами"? У меня в алгоритме нет никаких задержек между передачами - перечитайте внимательнее мой пост, я там специально на этом акцентировал внимание. 

Артефакты на экране будут только при вашем подходе, когда стираете, а потом поверх рисуете по-новой, и вас почему-то совсем не смущает что при выводе динамической картинки, нужная картинка на экране будет присутствовать только половину времени, а другую половину - стёртый фон. А в реале - для пользователя будет вообще не смотрибельный результат.

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


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

4 hours ago, jcxz said:

Вспоминается поговорка про книгу и фигу... :unknw: Странно - пишу одно, а понимаете совсем другое, такое ощущение, что читали мой пост через слово....

Вы правы. Разговор ни о чем. У каждого свои приоритеты и свое видение проблем и решений. 

На этой оптимистической ноте предлагаю закончить дискуссию о "книгах и фигах".

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


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

19 часов назад, Ruslan1 сказал:

Вы правы. Разговор ни о чем. У каждого свои приоритеты и свое видение проблем и решений.

Вот именно. На вашем месте я первым делом задумался бы зачем:

В 05.03.2020 в 12:31, Ruslan1 сказал:

У меня сейчас там задач 30 крутится

в embedded реалтайм системе на Cortex-M. Которые наверняка расходуют ОЗУ под стек несравнимо больше, чем требует мой метод конвертации дополнительной ОЗУ под промежуточные буфера. Тогда может оказаться что и полный видеобуфер легко влезет во внутреннюю ОЗУ.

И вообще - нафига столько независимых задач? Оно реально нужно? Для чего??? Не представляю....  :unknw:

У Вас реально 30 независимых друг от друга процессов?

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


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

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

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

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

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

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

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

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

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

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