Страница 3 из 3

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

Добавлено: Вс мар 20, 2022 22:07:41
The Rock
[uquote="VladislavS",url="/forum/viewtopic.php?p=4201400#p4201400"]Сколько кадров, кстати, сейчас получается?[/uquote]

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

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

Добавлено: Пн мар 21, 2022 08:29:05
VladislavS
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
The Rock
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
VladislavS
Я в рисовании не силён. Но точно знаю, когда данные перестанут быть константные, то от табличного методы вычисления будет не отвертеться.

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

Добавлено: Пн мар 21, 2022 11:29:17
The Rock
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
Reflector
[uquote="The Rock",url="/forum/viewtopic.php?p=4201507#p4201507"]Подскажите пожалуйста ещё, если я например хочу рисовать как бы поверх того что уже отрисовано, правильно ли я понимаю логику?[/uquote]
Что рисовать собираешься?

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

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

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

Добавлено: Пн мар 21, 2022 14:47:13
The Rock
Демонстрация результата, тут я ещё поставил кварц на 8 MHz и перевел МК на 72 MHz. Огромное всем спасибо, без вас такого результата не было !
VladislavS, Вам отдельное спасибо!
Reflector писал(а):Что рисовать собираешься?
Мне очень интересно сделать любительского уровня Primary Fllight Display (PFD) :) Его и собираюсь обрисовывать
СпойлерИзображение
COKPOWEHEU, огромное спасибо за ценнейшие советы!

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

Добавлено: Пн мар 21, 2022 16:25:50
COKPOWEHEU
Рисовать цифры под углом будет весело!
А в остальном там же цвет фона заранее задан, даже градиентов нет. Хотя от варианта реализации зависит. В любом случае самое веселье будет скорее с наклонными цифрами, чем с прозрачной картинкой.

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

Добавлено: Пн мар 21, 2022 20:03:39
The Rock
к счастью, наклонный шрифт у меня скорее всего будет отсутствовать ) Будут стрелочки

Добавлено 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
The Rock
Получил корпус для прибора, теперь не понятно радиационный он или нет. И второе, дисплей мелковат и не хватает яркости. Буду делать при помощи двух дисплеев )
Изображение Изображение

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

Добавлено: Вт мар 22, 2022 18:49:16
jcxz
[uquote="The Rock",url="/forum/viewtopic.php?p=4202105#p4202105"]Получил корпус для прибора, теперь не понятно радиационный он или нет.[/uquote] :shock: :shock: :shock: Вы его с разборки АЭС заказывали???

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

Добавлено: Вт мар 22, 2022 19:41:04
The Rock
jcxz писал(а): Вы его с разборки АЭС заказывали???
Нет, в старых прибор применялась светомасса постоянного свечения с радиоактивным радием-226