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

Кто любит RISC в жизни, заходим, не стесняемся.
The Rock
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт июн 05, 2012 23:32:13

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

Сообщение The Rock »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4201400#p4201400"]Сколько кадров, кстати, сейчас получается?[/uquote]

Этот цикл отрабатывает за 0.3 сек ( по видеозаписи с телефона)
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение 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 ассемблерных команд.
Реклама
The Rock
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт июн 05, 2012 23:32:13

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

Сообщение 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. Этот буфер загоняю на дисплей
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Я в рисовании не силён. Но точно знаю, когда данные перестанут быть константные, то от табличного методы вычисления будет не отвертеться.
Реклама
Эиком - электронные компоненты и радиодетали
The Rock
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт июн 05, 2012 23:32:13

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

Сообщение 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) };
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="The Rock",url="/forum/viewtopic.php?p=4201507#p4201507"]Подскажите пожалуйста ещё, если я например хочу рисовать как бы поверх того что уже отрисовано, правильно ли я понимаю логику?[/uquote]
Что рисовать собираешься?
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

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

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

Сообщение The Rock »

Демонстрация результата, тут я ещё поставил кварц на 8 MHz и перевел МК на 72 MHz. Огромное всем спасибо, без вас такого результата не было !
VladislavS, Вам отдельное спасибо!
Reflector писал(а):Что рисовать собираешься?
Мне очень интересно сделать любительского уровня Primary Fllight Display (PFD) :) Его и собираюсь обрисовывать
СпойлерИзображение
COKPOWEHEU, огромное спасибо за ценнейшие советы!
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Рисовать цифры под углом будет весело!
А в остальном там же цвет фона заранее задан, даже градиентов нет. Хотя от варианта реализации зависит. В любом случае самое веселье будет скорее с наклонными цифрами, чем с прозрачной картинкой.
The Rock
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт июн 05, 2012 23:32:13

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

Сообщение The Rock »

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

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

Добавлено after 1 minute 56 seconds:
8 битный цвет мне пригодится, так как дисплей 800х480 скучает :)
The Rock
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт июн 05, 2012 23:32:13

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

Сообщение The Rock »

Получил корпус для прибора, теперь не понятно радиационный он или нет. И второе, дисплей мелковат и не хватает яркости. Буду делать при помощи двух дисплеев )
Изображение Изображение
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="The Rock",url="/forum/viewtopic.php?p=4202105#p4202105"]Получил корпус для прибора, теперь не понятно радиационный он или нет.[/uquote] :shock: :shock: :shock: Вы его с разборки АЭС заказывали???
The Rock
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт июн 05, 2012 23:32:13

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

Сообщение The Rock »

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

Вернуться в «ARM»