Медленный вывод на STM32 8 битной шины (дисплей)
Re: Медленный вывод на STM32 8 битной шины (дисплей)
[uquote="VladislavS",url="/forum/viewtopic.php?p=4201400#p4201400"]Сколько кадров, кстати, сейчас получается?[/uquote]
Этот цикл отрабатывает за 0.3 сек ( по видеозаписи с телефона)
Этот цикл отрабатывает за 0.3 сек ( по видеозаписи с телефона)
- Реклама
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Медленный вывод на STM32 8 битной шины (дисплей)
64М/320/480*0.3 = 125 тактов на запись 8 констант в порты, адресация которых доступна от одной базы по смещению. Овердофига. Раза в 3-4 быстрее должно быть. Пришло время листинги смотреть.
В цикле 11 ассемблерных команд.
Спойлер
Код: Выделить всё
//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 Re: Медленный вывод на STM32 8 битной шины (дисплей)
Пока искал где посмотреть листинг(к сожалению, так и не нашел) увидел коды оптимизации. Сделал -О3 и мой цикл отработал очень быстро, визуально думаю уже будет сложно замерить время при помощи камерой, т.к. он просто моргнул и полностью перекрасился.VladislavS писал(а):64М/320/480*0.3 = 125 тактов на запись 8 констант в порты, адресация которых доступна от одной базы по смещению. Овердофига. Раза в 3-4 быстрее должно быть. Пришло время листинги смотреть.
Но с листингом думаю будет беда
Замерил мой не оптимизированный вывод(где идет расчёт и тп)
Спойлер
Код: Выделить всё
// Функция заливки области
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();
}А максимально скоростной цикл обновляется просто через мигание , был черный -миг - желтый
Добавлено after 25 minutes 33 seconds:
Подскажите пожалуйста ещё, если я например хочу рисовать как бы поверх того что уже отрисовано, правильно ли я понимаю логику?
1. Сначала читаю что находится в памяти дисплея
2. Вычисляю какие ячейки мне нужно перекрасить и формирую новый буфер кадра
3. Этот буфер загоняю на дисплей
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Я в рисовании не силён. Но точно знаю, когда данные перестанут быть константные, то от табличного методы вычисления будет не отвертеться.
Re: Медленный вывод на STM32 8 битной шины (дисплей)
обязательно вернусь к этому,сейчас изучаю матрицы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 битной шины (дисплей)
[uquote="The Rock",url="/forum/viewtopic.php?p=4201507#p4201507"]Подскажите пожалуйста ещё, если я например хочу рисовать как бы поверх того что уже отрисовано, правильно ли я понимаю логику?[/uquote]
Что рисовать собираешься?
Что рисовать собираешься?
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Зависит от того что рисовать.Подскажите пожалуйста ещё, если я например хочу рисовать как бы поверх того что уже отрисовано, правильно ли я понимаю логику?
В случае наклонных линий проще рисовать попиксельно. То есть команда "нарисовать область от (x,y) до (x,y)" и 2 байта данных. Потом следующая такая же команда и т.д.
Если прямоугольные картинки (особенно текст), когда можно игнорировать фон, тоже "нарисовать область" и куча данных, без чтения.
Чтение нужно скорее если нужна прозрачность кусков картинки. Тот же текст, если требуется сохранить фон, иногда геометрические фигуры (если окажется, что считать область - модифицировать - записать окажется быстрее работы с отдельными пикселями).
Но вообще-то, я бы таких задач избегал. Если уж текст, то на монотонном фоне. Ради каждой буквы читать ее область или высчитывать по какому-то алгоритму будет слишком медленно.
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Демонстрация результата, тут я ещё поставил кварц на 8 MHz и перевел МК на 72 MHz. Огромное всем спасибо, без вас такого результата не было !
VladislavS, Вам отдельное спасибо!
Его и собираюсь обрисовывать
COKPOWEHEU, огромное спасибо за ценнейшие советы!
VladislavS, Вам отдельное спасибо!
Мне очень интересно сделать любительского уровня Primary Fllight Display (PFD)Reflector писал(а):Что рисовать собираешься?
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Рисовать цифры под углом будет весело!
А в остальном там же цвет фона заранее задан, даже градиентов нет. Хотя от варианта реализации зависит. В любом случае самое веселье будет скорее с наклонными цифрами, чем с прозрачной картинкой.
А в остальном там же цвет фона заранее задан, даже градиентов нет. Хотя от варианта реализации зависит. В любом случае самое веселье будет скорее с наклонными цифрами, чем с прозрачной картинкой.
Re: Медленный вывод на STM32 8 битной шины (дисплей)
к счастью, наклонный шрифт у меня скорее всего будет отсутствовать ) Будут стрелочки
Добавлено after 3 hours 33 minutes 4 seconds:
Посмотрев на картинки PFD, понял как можно ускорить ещё в 2 раза вывод. Если перейти в 8 битный цвет(а этой палитры мне хватит за глаза), то все ускорится.
Добавлено after 1 minute 56 seconds:
8 битный цвет мне пригодится, так как дисплей 800х480 скучает
Добавлено after 3 hours 33 minutes 4 seconds:
Посмотрев на картинки PFD, понял как можно ускорить ещё в 2 раза вывод. Если перейти в 8 битный цвет(а этой палитры мне хватит за глаза), то все ускорится.
Добавлено after 1 minute 56 seconds:
8 битный цвет мне пригодится, так как дисплей 800х480 скучает
Re: Медленный вывод на STM32 8 битной шины (дисплей)
[uquote="The Rock",url="/forum/viewtopic.php?p=4202105#p4202105"]Получил корпус для прибора, теперь не понятно радиационный он или нет.[/uquote]
Вы его с разборки АЭС заказывали???
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Нет, в старых прибор применялась светомасса постоянного свечения с радиоактивным радием-226jcxz писал(а): Вы его с разборки АЭС заказывали???


