Это видео недоступно.
Сожалеем об этом.
Avi playback with audio on stm32. Optimization of the driver and decoder in assembler. Announcement
- Добавить в
- Мой плейлист
- Посмотреть позже
- Поделиться
Поделиться
HTML-код
Размер видео:
- Опубликовано: 17 авг 2024
Комментарии • 67
Следующие
Автовоспроизведение
STM32 AVI video player with OSD menu. jpeg decoder optimization in assemblerVadRov
Просмотров 2,6 тыс.
Зачем нужен ассемблер на примере. Соглашения о вызовах в разных архитектурахVadRov
Просмотров 1,1 тыс.
Звуковой процессор, который взорвёт рынок! Контур Аудио А8OnFires
Просмотров 40 тыс.
I Build 3 Cutting Boards - 5 Min vs. 5 Hour vs. 5 DayJohn Malecki
Просмотров 136 тыс.
Kurtis Conner | PYTHON | Full Comedy SpecialKurtis Conner
Просмотров 347 тыс.
Earth Defense Force 6videogamedunkey
Просмотров 898 тыс.
Aphmau SLAYS Dress To ImpressAphmau Shuki
Просмотров 742 тыс.
Sound recording and playback through stm32 DAC. Opus codec encoding and decoding of speech.ElectroHobby
Просмотров 7 тыс.
20 ИЗОБРЕТЕНИЙ ДЛЯ АВТОМОБИЛЯ, КОТОРЫЕ ВЫШЛИ НА СЛЕДУЮЩИЙ УРОВЕНЬTechZone
Просмотров 48 тыс.
Прошиваем BIOS программатором CH341A с прищепкой на любую китайскую платуMik Gambit
Просмотров 119 тыс.
Как проверить микроконтроллер, процессор?РСМ
Просмотров 254 тыс.
Вскрываем сейф с Flipper ZeroПавел Жовнер
Просмотров 134 тыс.
Подключение дисплея ST7789 к микроконтроллеру STM32 по SPI c DMA без HAL: явное преимущество DMAVadRov
Просмотров 10 тыс.
Как проверить активность БИОСа материнской платы, без осцилографа.PWM
Просмотров 212 тыс.
ESP32 против STM32F4. Xtensa LX6 против Cortex-M4F. Наглядная демонстрация силы двух ядерVadRov
Просмотров 1,2 тыс.
БУРБОНЫ. Эту династию боялись даже Габсбурги | ФАЙБФайб
Просмотров 602 тыс.
Что НЕ НУЖНО покупать в Японии 🇯🇵🙅🏼♀️❌ #япония #токио #shorts #косметика #travelХолли Лолли Live
Просмотров 319 тыс.
⚡"УДАЧІ, БАТЯ!": воїни ЗСУ і місцевий мешканець у м. Суджа Курської областіYanina Sokolova
Просмотров 859 тыс.
Батя учит французский #батя #орешекВиталий Оpехов
Просмотров 140 тыс.
ВСУ в Судже, Нойз оправдывается, Долина и мошенники, конец Олимпиады. Мобилизация? Разбор новостейОсторожно: Собчак
Просмотров 845 тыс.
Она точно продавец ? 🥲 #юмор #автоКирюнчик
Просмотров 74 тыс.
【搞笑漁民真實生活】日出日落,勤勤恳恳!#fishing #shorts搞笑渔民生活
Просмотров 1,6 млн
ПЕРЕЖИЛ 100 ЛЕТ ЛЕДНИКОВОГО ПЕРИОДА В МАЙНКРАФТЕ!Бурёночек🛑
Просмотров 212 тыс.
Воспроизведение видео avi со звуком на stm32. Оптимизация драйвера и декодера на ассемблере. Это видео - анонс проекта, о котором будет рассказано более подробно в одном из следующих выпусков на канале.
Видео с ранней версией: ruclips.net/video/ih6ErwXwGcE/видео.html
Поддержать канал:
donate.qiwi.com/payin/VadRov
yoomoney.ru/to/4100117522443917
Покупал:
программатор ST-Link alii.pub/6fdujg
плата разработки stm32f401ccu6 alii.pub/6fdumy
плата разработки stm32f411ceu6 alii.pub/6fduop
аудио-ЦАП pcm5102a alii.pub/6fdurf
макетная плата alii.pub/6fduuq
провода для макетной платы alii.pub/6fduwo
3.2" дисплей с тачскрином ILI9341 spi alii.pub/6fdvcf
Контакты:
www.youtube.com/@VadRov
dzen.ru/vadrov
t.me/vadrov_channel
Очень интересная тема, Поддерживаю, давай пили видео!
Очень круто !!! Вы настоящий интузиаст !!!!
Thank You VADROV
ну гнаться за подписчиками и просмотрами это святое дело. Но для этого нужно повышать качество съемки. Говорю так как сам через это прошел. Не помогала ни накрутка ни крутые проекты. И даже сейчас не особо много их, так как контент специфический))
Качество съемки и сценарии - это не мое. Я все пишу одним дублем, без подготовки, спичрайтеров и т.п. Я знаю, что у 99% зрителей запрос на "шоу", а не результат. Но я к такому контенту не готов. Меня устраивает текущая ситуация. Обращение о лайках, подписках, комментариях - это мотивирование зрителя на действие. В свою очередь, это действие дает мотивацию мне. Делать из канала коммерческий продукт у меня цели нет. Стать "медийным" и сделать канал доходным цели вовсе нет. Меня устраивает моя жизнь. 😉
Приветствую. тема интересна и иолезна в плане понимания что к чему. Спасибо за труды.
Спасибо.
Ждём подробнее видео о проекте!
Асемблер для меня оч тяжело только начинающий в Си)
Я уверяю Вас, что это путь к постижению истины 😉 Каждая операция, по сути, элементарное действие. Стек в полной Вашей власти. Чуть не туда записали, и словили "кирпич" на выходе. 😉 А если серьезно, то заблуждение считать ассемблер сложнее языков высокого уровня. Просто на ассемблере код, как правило, выглядит "простыней" на фоне Си-шного эквивалента, но он сама логичность и последовательность. И кстати, бывают и исключения, когда всего одна строчка кода на ассемблере противопоставляется трем на Си, например, т.н., операция насыщения (cortex-m).
Нормально. Видно работу и виден интерес автора. Результат понравился. Подписан, буду смотреть дальше. Спасибо.
выглядит очень круто
Здравствуйте. Конечно тема интересная . Лайк поставлен, на канал подписан, Жду продолжения!!!
С познавательной точки зрения безусловно интересно. С практической - сомнительное удовольствие, тк не понятно как это переносить на другие серии с иными ядрами, да и индустрия в другую сторону идет. Лучшее - враг хорошему.
Кстати, после трагедии с Therac-25 были даны четкие рекомендации писать код на С для медоборудования.
А вот от Вас я другого и не ожидал. 😉 И, главное, все, как всегда, по делу "Досадные" ошибки могут быть на любом языке программирования. Вот, кстати, про Therac-25. Банальное, ложь в истину по x = x+1. Такую ошибку можно на любом высокоуровневом языке допустить. Дело во всестороннем многоуровневом тестировании и отладке. По переносимости полностью поддерживаю, но не исключаю того, что ряд современных востребованных библиотек, к примеру, поддерживают, как правило, многие серии/ядра, в т.ч., на низком уровне (те же ассемблерные вставки). Что касается этой "оптимизации", то она точно пойдет на ряде серий и ядер в силу набора thumb-инструкций. Главное требование - поддержка simd инструкций (mul, mla, usat и т.п.). Что касается сравнения с оптимизатором компилятора, то при уровне -Ofast конкурирование с моими вставками было 5-20% в скорости в мою пользу. Ощутимый же прирост (до 50%) был получен вставкой с использованием операций насыщения с одновременным сдвигом при преобразовании цвета из YCrCb в RGB. Кстати, в ходе "эксперимента" было установлено, что оптимизатор не всегда использует "машинные" memset, memcpy, т.е. не всегда распознает инициализирующие циклы, циклы копирования блоков памяти. В этой связи теряется производительность. Так что, рекомендую где можно использовать memset и memcpy их использовать вместо инициализирующих циклов, каковых мне доводилось видеть немало в библиотеках.
Но я вынужден признать один факт, что компиляторы оЧЧЧень умные. 😉 Чтобы их превзойти, надо попотеть. Особенно, если дело касается совокупности математических вычислений с массой переменных при ограниченном наборе регистров.
@@VadRov
С огромным удовольствием и , немаловажно, пользой для себя посмотрю Ваш код после того, как Вы его опубликуете)) Спасибо за ценные практические советы!
Очень круто. Я вот хочу сделать очень похожий проект, но с экраном 240x240 (в китае их полно) и воспроизводить зацикленно буквально 20-30 секунд видео. Не подскажете, где у вас хранятся медиа? SD-карта?
Да, на sd-карте. Этот проект поддерживает экраны с разрешением 240x240. О настройке сборки указано в описании на гитхабе (раздел "Выбор контроллера дисплейного модуля и его разрешения"). github.com/vadrov/stm32f4_fast_optimized_avi_player_osd
@@VadRov Спасибо, посмотрю ваш гитхаб подробнее, когда приедет экран!
Крутяк
Весьма интересно! а какой профит в производительности получается в процентах, если сравнить С и Ассемблер
На разных задачах от 5 до 50%, если скрупулезно писать код, пытаясь переиграть оптимизатор (опция -Ofast). В частности, здесь удалось существенно поднять производительность за счет продвинутых simd инструкций, в частности, т.н. операции насыщения, которая за 1 цикл буквально творит чудеса. На некоторых задачах "овчинка выделки не стоит", т.к., надо признать, что оптимизатор штука очень умная и переиграть его очень нелегко. Совокупно, проведя оптимизацию (не только в плане применения ассемблера) здесь удалось увеличить производительность почти в 3 раза от номинала (первой демонстрации), плюс к тому же здесь одновременно декодируется из mp3 и воспроизводится звук.
а по поводу ассемблера, я бы посмотрел с радостью. И второе, вот где найти инфу как писать на ассемблере? В тех же авр пример кода на с и ассемблер. В референсе стм32 только с. А так же есть вопрос про сд карту, хочу понять как хранятся данные в фат32, но не знаю как гуглить. Находил общее описание, что типо в одной секции хранятся данные, у них есть ссылка на следующую секцию, а вот где прям до бита можно прочитать? Сорри что так много вопросов, но не знаю кому еще их можно задать. И в телеге комменты отключены
Если есть опыт в программировании, то этой информации по ассемблеру хватит с лихвой:
github.com/blackav/hse-caos-2020/blob/master/99-arm/README.md
www.ethernut.de/en/documents/arm-inline-asm.html
Козаченко В.Ф., Алямкин Д.И., Анучин А.С., Жарков А.А., Лашкевич М.М., Савкин Д.И., Шпак Д.М. Практический курс микропроцессорной техники на базе процессорных ядер ARM-CortexM3/M4/M4F. И приложения к нему (Приложение 1. Иллюстрированный справочник по системе команд процессорных ядер CortexM3/M4/M4F).
Про fat32. Если есть желание разобраться "как оно работает", то следует посмотреть библиотеку от ChaN. Его код легко читается. Библиотека FatFS от ChaN работает через пользовательский драйвер c любым носителем. В одном из видео я рассказывал про такой драйвер для FatFS для SD карты (с DMA): ruclips.net/video/z99bLhlnukM/видео.html В вопросе FAT я не стал "изобретать велосипед" и воспользовался готовым решением. Максимум, что я сделал, так это оптимизировал инициализацию массивов в библиотеке, что дало некоторый прирост производительности.
@@VadRov спасибо. буду изучать)
Вчём трудности перевода асм кода? не вникал в архитиктуру arm предшествиники в поздних версиях не поддерживаются? или дело сводится к переферийным ножкам, то тут скрипты будут ,как не как к стате.
Ядра Cortex-M0/M0+/M1 реализуют архитектуру ARMv6-M, Cortex-M3 - ARMv7-M, Cortex-M4/M7 - ARMv7E-M, Cortex-M23/M33/M35P - ARMv8-M, Cortex-M55/M85 - ARMv8.1-M. Архитектуры совместимы с машинными инструкциями от ARMv6-M до ARMv7-M и ARMv7E-M. Инструкции для Cortex-M0/M0+/M1 могут выполняться на Cortex-M3/M4/M7. Инструкции для Cortex-M3, могут выполняться на Cortex-M4/M7/M33/M35P. В архитектурах Cortex-M поддерживаются только наборы инструкций Thumb-1 и Thumb-2. Устаревший 32-битный набор инструкций ARM не поддерживается. Ассемблер целесообразно использовать в специфических задачах. Например, в этом проекте, так как не хватает производительности. При этом стоит учитывать привязку к "железу". Во всех остальных случаях использование C с библиотеками всегда предпочтительнее.
В таком случае ,я что то не дагоняю, stm32 -ки младшие пастроинны все на Cortex-M3. то Thumb-1 это 16+16 и Thumb-2 это 16+16 либо 32, взависимости от команды. В чём проблема скомпилировать с атрибутами под Thumb , и под Thumb 2. код по факту не меняется. будет менятся только место во флеше. Надо будет зарубиться, как время будет сним. Для меня пока что, видмо он тёмный лес!
@@vsosacordeev, нет там темного леса. Просто открываете документацию от ARM и читаете на досуге. Но что-то мне подсказывает, что Вы знаете не меньше моего 😉
В прошлой жизни, что то знал, сейчас как будто заново радился, две буквы свести не могу, толи время сделало своё время, толи органон отказывается думать! @@VadRov
@@vsosacordeev, у меня тоже многое из головы вылетает. Зато потом быстро опять инфа восстанавливается, когда возвращаюсь к ранее изученному. В голове все не удержишь. 🙂
Интересует!!! +++++
Разбирал как то плеер ,там тоже какой то китайский tft . Там работа с дисплее по 8 битной шине . Что думаете о параллельном интерфейсе?
В данном случае это не даст повышения производительности, т.к. упираемся в производительность jpeg декодера. Например, при 42 Мбит/с spi этот дисплей (320x240) можно заливать 36 раз в секунду, т.е. теоретический максимум для 42 Мбит/с будет 36 кадров с секунду. Это при условии, что посылки (декодированные данные) следуют одна за другой. Но последнее недостижимо из-за недостаточной производительности примененного микроконтроллера (в данном случае stm32f401xx на частоте 84 МГц). stm32f407xx, например, должен выдать до 35 кадров 320 х 240. Конечно, 8 битный интерфейс быстрее 1 битного, но тут (в этой задаче/проекте) нет недостатка в скорости передачи информации на дисплей. А так применять можно дисплей и с параллельным интерфейсом. Кстати, этот дисплей (на ili9341 spi) и бОльшую скорость передачи по spi поддерживает. Вот если бы мы упирались в скорость передачи декодированной информации на дисплей, т.е. имел бы место простой в ожидании разрешения вывода декодированных данных, то тогда нам надо было бы задуматься о дисплее с другим интерфейсом - параллельным, а не последовательным.
Было бы круто посмотреть пример подключения библиотеки lvgl к stm32. Я сам пробовал запускать эту либу, но скорость обновления экрана низковатая получилась
Я месяц-полтора назад кому-то помогал подключать свой драйвер дисплея к lvgl на 411 МК. Достаточно быстро получилось с учетом использования DMA.
Я вот на 411 делаю, используя дма. Драйвер дисплея st7789. Мне интересно как вы отправляли данные, построчно или несколькими буфферами?
@@andromeddka , вот "внедрение" моего драйвера в lvgl:
#include "../../lv_conf.h"
#include "../../lvgl/lvgl.h"
#include "display.h"
#include "st7789.h"
#define DISP_HOR_RES 240
#define DISP_VER_RES 240
static lv_disp_draw_buf_t buf;
static lv_disp_drv_t disp_drv;
static lv_color_t disp_buf1[DISP_HOR_RES * 10];
static lv_color_t disp_buf2[DISP_HOR_RES * 10];
static volatile uint32_t t_saved = 0;
void monitor_cb(lv_disp_drv_t * d, uint32_t t, uint32_t p)
{
t_saved = t;
}
static void tft_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p)
{
if(area->x2 < 0) return;
if(area->y2 < 0) return;
if(area->x1 > DISP_HOR_RES - 1) return;
if(area->y1 > DISP_VER_RES - 1) return;
uint16_t w = area->x2 - area->x1 + 1;
uint16_t h = area->y2 - area->y1 + 1;
LCD_DrawImage(lcd, area->x1, area->y1, w, h, (uint16_t*)color_p, 1);
lv_disp_flush_ready(drv);
}
void Display_init(int rotation)
{
LCD_DMA_TypeDef dma_tx = { DMA1,
LL_DMA_STREAM_4 };
LCD_BackLight_data bkl_data = { TIM1,
LL_TIM_CHANNEL_CH1,
0,
0,
70 };
LCD_SPI_Connected_data spi_con = { SPI2,
dma_tx,
LCD_RES_GPIO_Port,
LCD_RES_Pin,
LCD_DC_GPIO_Port,
LCD_DC_Pin,
LCD_CS_GPIO_Port,
LCD_CS_Pin };
LCD = LCD_DisplayAdd(LCD,
DISP_HOR_RES,
DISP_VER_RES,
ST7789_CONTROLLER_WIDTH,
ST7789_CONTROLLER_HEIGHT,
0,
0,
PAGE_ORIENTATION_PORTRAIT,
ST7789_Init,
ST7789_SetWindow,
ST7789_SleepIn,
ST7789_SleepOut,
&spi_con,
LCD_DATA_16BIT_BUS,
bkl_data );
LCD_Init(LCD);
lv_disp_draw_buf_init(&buf, disp_buf1, disp_buf2, DISP_HOR_RES * 10);
lv_disp_drv_init(&disp_drv);
disp_drv.draw_buf = &buf;
disp_drv.flush_cb = tft_flush;
disp_drv.monitor_cb = monitor_cb;
disp_drv.hor_res = DISP_HOR_RES;
disp_drv.ver_res = DISP_VER_RES;
disp_drv.rotated = rotation;
disp_drv.offset_y = 0;
lv_disp_drv_register(&disp_drv);
}
@@VadRov ага, я понял, вы отправляете как картинку. Я пытался так, но получалась ерунда. Попробую еще значит. Спасибо!!
@@andromeddka , да, только так и надо. У нас есть координаты прямоугольника на дисплее и данные, которые надо обновить. У нас есть два буфера, так как мы используем DMA, т.е. внутреннему драйверу lvgl не надо ждать пока мы обновим картинку в указанном прямоугольнике, и он готовит во втором буфере нам следующие данные для обновления. Только так, по схеме с двойной буферизацией и DMA можно получить внятную производительность на spi дисплее.
411? 411 умеет в 100Мгц и памяти там больше. Может 401?
Да, здесь 401 применен. Частота 84 МГц. Может работать в разгоне свободно и на 110 МГц. Больше не пробовал.
Можно было предоставить возможность посмотреть хоть несколько секунд мульта без посторонних звуков?
В скором времени при большом желании Вы сможете повторить проект и смотреть без моих посторонних звуков не только этот, но и многие другие мультики, клипы, фильмы. 🙂
@@VadRov В чём смысл снимать воспроизведение мультика со звуком, если звука не слышно? Можно просто сказать: я сделал, всё ок. Можете и сами сделать, кому интересно.
@@Alexandrsssd , я не знаю, почему Вы не слышите звука. Но звук есть и он слышен. Это видео из трейлера, но с наложенным саундтреком (где-то взял в инете, не помню), без оригинального звука. Так что, "посторонние звуки" - это звуки из видео.
и...? слишком заблаговременно размещен анонс...ИМХО🙂
Приветствую. 🙂 Жизнь вносит коррективы в запланированные мероприятия. Приходится решать задачи согласно приоритетам. Все будет, как и озвучено.
@@VadRov безусловно, но люди ждут, а дороже нет ничего)