Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вс мар 20, 2022 22:07:41

Сколько кадров, кстати, сейчас получается?


Этот цикл отрабатывает за 0.3 сек ( по видеозаписи с телефона)

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Пн мар 21, 2022 08:29:05

64М/320/480*0.3 = 125 тактов на запись 8 констант в порты, адресация которых доступна от одной базы по смещению. Овердофига. Раза в 3-4 быстрее должно быть. Пришло время листинги смотреть.
Спойлер
Код:
//for (auto i = 0; i <= 320*480; i++) {
        LDR.W    R0,??DataTable2
        LDR.W    R1,??DataTable2_1
        LDR.W    R2,??DataTable2_2
        LDR.W    R6,??DataTable2_3
        LDR.W    R5,??DataTable2_4
        LDR.W    R7,??DataTable2_5
        MOV      R4,#+8388608   
        MOV      R3,#+8388736   
        MOV      R12,#+2       
// Запись первого байта
//GPIOA->BSRR =  0x700 << 16 | 0x20700 ;
??main_0:
        STR      R7,[R5, #+0]   
//GPIOB->BSRR = 0x438 << 16 | 0x438;
        STR      R6,[R5, #+1024]
//GPIOC->BSRR = 0x80 << 16 | 0x80;
        STR      R3,[R5, #+2048]
//GPIOA->BSRR = GPIO_BSRR_BS1;
        STR      R12,[R5, #+0] 

//Запись второго байта
//GPIOA->BSRR =  0x700 << 16 | 0x20100 ;
        STR      R2,[R5, #+0]   
//GPIOB->BSRR = 0x438 << 16 | 0x410;
        STR      R1,[R5, #+1024]
//GPIOC->BSRR = 0x80 << 16 | 0x0;
        STR      R4,[R5, #+2048]
//GPIOA->BSRR = GPIO_BSRR_BS1;
        MOV      LR,R12         
//}
        SUBS     R0,R0,#+1     
        STR      LR,[R5, #+0]   
        BNE.N    ??main_0 

В цикле 11 ассемблерных команд.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Пн мар 21, 2022 11:01:23

VladislavS писал(а):64М/320/480*0.3 = 125 тактов на запись 8 констант в порты, адресация которых доступна от одной базы по смещению. Овердофига. Раза в 3-4 быстрее должно быть. Пришло время листинги смотреть.

Пока искал где посмотреть листинг(к сожалению, так и не нашел) увидел коды оптимизации. Сделал -О3 и мой цикл отработал очень быстро, визуально думаю уже будет сложно замерить время при помощи камерой, т.к. он просто моргнул и полностью перекрасился.

Но с листингом думаю будет беда

Замерил мой не оптимизированный вывод(где идет расчёт и тп)
Спойлер
Код:
// Функция заливки области
void TFT9488_Flood(unsigned short color, unsigned long len) {
   unsigned short blocks;
   unsigned char i, hi = color >> 8, lo = color;
   TFT9488_CS_Active();
   TFT9488_RS_Command();
   TFT9488_Write8(0x2C);
   TFT9488_RS_Data();
   TFT9488_Write16BitColor(hi, lo);
   len--;
   blocks = (unsigned short) (len / 64);   //64 pixels/block
   if (hi == lo) {
      while (blocks--) {
         i = 16;
         do {
            // тут было раньше 8 раз TFT9488_WR_Strobe(); но текст ниже в разы быстрее выполняется
            GPIOA->BSRR = GPIO_BSRR_BR1;
            GPIOA->BSRR = GPIO_BSRR_BS1;
            GPIOA->BSRR = GPIO_BSRR_BR1;
            GPIOA->BSRR = GPIO_BSRR_BS1;
            GPIOA->BSRR = GPIO_BSRR_BR1;
            GPIOA->BSRR = GPIO_BSRR_BS1;
            GPIOA->BSRR = GPIO_BSRR_BR1;
            GPIOA->BSRR = GPIO_BSRR_BS1;
            GPIOA->BSRR = GPIO_BSRR_BR1;
            GPIOA->BSRR = GPIO_BSRR_BS1;
            GPIOA->BSRR = GPIO_BSRR_BR1;
            GPIOA->BSRR = GPIO_BSRR_BS1;
            GPIOA->BSRR = GPIO_BSRR_BR1;
            GPIOA->BSRR = GPIO_BSRR_BS1;
            GPIOA->BSRR = GPIO_BSRR_BR1;
            GPIOA->BSRR = GPIO_BSRR_BS1;
         } while (--i);
      }
      //Fill any remaining pixels(1 to 64)
      for (i = (unsigned char) len & 63; i--;) {
         // тут было раньше 2 раз TFT9488_WR_Strobe(); но текст ниже в разы быстрее выполняется
         GPIOA->BSRR = GPIO_BSRR_BR1;
         GPIOA->BSRR = GPIO_BSRR_BS1;
         GPIOA->BSRR = GPIO_BSRR_BR1;
         GPIOA->BSRR = GPIO_BSRR_BS1;
      }
   } else {
      while (blocks--) {
         i = 16;
         do {
            TFT9488_Write16BitColor(hi, lo);
            TFT9488_Write16BitColor(hi, lo);
            TFT9488_Write16BitColor(hi, lo);
            TFT9488_Write16BitColor(hi, lo);
         } while (--i);
      }
      //Fill any remaining pixels(1 to 64)
      for (i = (unsigned char) len & 63; i--;) {
         TFT9488_Write16BitColor(hi, lo);
      }
   }
   TFT9488_CS_Idle();
}
Экран обновился гдето за 0.1 сек, но движение видно.

А максимально скоростной цикл обновляется просто через мигание , был черный -миг - желтый

Добавлено after 25 minutes 33 seconds:
Подскажите пожалуйста ещё, если я например хочу рисовать как бы поверх того что уже отрисовано, правильно ли я понимаю логику?
1. Сначала читаю что находится в памяти дисплея
2. Вычисляю какие ячейки мне нужно перекрасить и формирую новый буфер кадра
3. Этот буфер загоняю на дисплей

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Пн мар 21, 2022 11:10:58

Я в рисовании не силён. Но точно знаю, когда данные перестанут быть константные, то от табличного методы вычисления будет не отвертеться.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Пн мар 21, 2022 11:29:17

VladislavS писал(а):от табличного методы вычисления будет не отвертеться.
обязательно вернусь к этому,сейчас изучаю матрицы
Спойлер
Код:
// В глобальной области
#define MB(X) (((GPIO_PIN_10|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_3) << 16)\
               | ((X&1)?(1<<3):0)\
               | ((X&2)?(1<<5):0)\
               | ((X&4)?(1<<4):0)\
               | ((X&8)?(1<<10):0))

const uint32_t MaskB[16] = { MB(0), MB(1), MB(2), MB(3),
                             MB(4), MB(5), MB(6), MB(7),
                             MB(8), MB(9), MB(10), MB(11),
                             MB(12), MB(13), MB(14), MB(15) };

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Пн мар 21, 2022 11:46:55

Подскажите пожалуйста ещё, если я например хочу рисовать как бы поверх того что уже отрисовано, правильно ли я понимаю логику?

Что рисовать собираешься?

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Пн мар 21, 2022 12:14:36

Подскажите пожалуйста ещё, если я например хочу рисовать как бы поверх того что уже отрисовано, правильно ли я понимаю логику?
Зависит от того что рисовать.
В случае наклонных линий проще рисовать попиксельно. То есть команда "нарисовать область от (x,y) до (x,y)" и 2 байта данных. Потом следующая такая же команда и т.д.
Если прямоугольные картинки (особенно текст), когда можно игнорировать фон, тоже "нарисовать область" и куча данных, без чтения.
Чтение нужно скорее если нужна прозрачность кусков картинки. Тот же текст, если требуется сохранить фон, иногда геометрические фигуры (если окажется, что считать область - модифицировать - записать окажется быстрее работы с отдельными пикселями).
Но вообще-то, я бы таких задач избегал. Если уж текст, то на монотонном фоне. Ради каждой буквы читать ее область или высчитывать по какому-то алгоритму будет слишком медленно.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Пн мар 21, 2022 14:47:13

Демонстрация результата, тут я ещё поставил кварц на 8 MHz и перевел МК на 72 MHz. Огромное всем спасибо, без вас такого результата не было !
VladislavS, Вам отдельное спасибо!
Reflector писал(а):Что рисовать собираешься?

Мне очень интересно сделать любительского уровня Primary Fllight Display (PFD) :) Его и собираюсь обрисовывать
СпойлерИзображение

COKPOWEHEU, огромное спасибо за ценнейшие советы!

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Пн мар 21, 2022 16:25:50

Рисовать цифры под углом будет весело!
А в остальном там же цвет фона заранее задан, даже градиентов нет. Хотя от варианта реализации зависит. В любом случае самое веселье будет скорее с наклонными цифрами, чем с прозрачной картинкой.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Пн мар 21, 2022 20:03:39

к счастью, наклонный шрифт у меня скорее всего будет отсутствовать ) Будут стрелочки

Добавлено after 3 hours 33 minutes 4 seconds:
Посмотрев на картинки PFD, понял как можно ускорить ещё в 2 раза вывод. Если перейти в 8 битный цвет(а этой палитры мне хватит за глаза), то все ускорится.

Добавлено after 1 minute 56 seconds:
8 битный цвет мне пригодится, так как дисплей 800х480 скучает :)

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вт мар 22, 2022 15:11:31

Получил корпус для прибора, теперь не понятно радиационный он или нет. И второе, дисплей мелковат и не хватает яркости. Буду делать при помощи двух дисплеев )
Изображение Изображение

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вт мар 22, 2022 18:49:16

Получил корпус для прибора, теперь не понятно радиационный он или нет.
:shock: :shock: :shock: Вы его с разборки АЭС заказывали???

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вт мар 22, 2022 19:41:04

jcxz писал(а): Вы его с разборки АЭС заказывали???
Нет, в старых прибор применялась светомасса постоянного свечения с радиоактивным радием-226
Ответить