Это видео недоступно.
Сожалеем об этом.

Avi playback with audio on stm32. Optimization of the driver and decoder in assembler. Announcement

Поделиться
HTML-код
  • Опубликовано: 17 авг 2024

Комментарии • 67

  • @VadRov
    @VadRov  Год назад +2

    Воспроизведение видео 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

  • @cgnavigator224
    @cgnavigator224 Год назад +2

    Очень интересная тема, Поддерживаю, давай пили видео!

  • @yuriykandiba213
    @yuriykandiba213 Год назад

    Очень круто !!! Вы настоящий интузиаст !!!!

  • @ismailalhajji
    @ismailalhajji 6 месяцев назад

    Thank You VADROV

  • @openFrimeTv
    @openFrimeTv Год назад +2

    ну гнаться за подписчиками и просмотрами это святое дело. Но для этого нужно повышать качество съемки. Говорю так как сам через это прошел. Не помогала ни накрутка ни крутые проекты. И даже сейчас не особо много их, так как контент специфический))

    • @VadRov
      @VadRov  Год назад +3

      Качество съемки и сценарии - это не мое. Я все пишу одним дублем, без подготовки, спичрайтеров и т.п. Я знаю, что у 99% зрителей запрос на "шоу", а не результат. Но я к такому контенту не готов. Меня устраивает текущая ситуация. Обращение о лайках, подписках, комментариях - это мотивирование зрителя на действие. В свою очередь, это действие дает мотивацию мне. Делать из канала коммерческий продукт у меня цели нет. Стать "медийным" и сделать канал доходным цели вовсе нет. Меня устраивает моя жизнь. 😉

  • @igoriskarolaitis3392
    @igoriskarolaitis3392 Год назад +1

    Приветствую. тема интересна и иолезна в плане понимания что к чему. Спасибо за труды.

    • @VadRov
      @VadRov  Год назад

      Спасибо.

  • @user-yr5gf9kw3z
    @user-yr5gf9kw3z Год назад

    Ждём подробнее видео о проекте!

  • @allallall2321
    @allallall2321 Год назад +2

    Асемблер для меня оч тяжело только начинающий в Си)

    • @VadRov
      @VadRov  Год назад +3

      Я уверяю Вас, что это путь к постижению истины 😉 Каждая операция, по сути, элементарное действие. Стек в полной Вашей власти. Чуть не туда записали, и словили "кирпич" на выходе. 😉 А если серьезно, то заблуждение считать ассемблер сложнее языков высокого уровня. Просто на ассемблере код, как правило, выглядит "простыней" на фоне Си-шного эквивалента, но он сама логичность и последовательность. И кстати, бывают и исключения, когда всего одна строчка кода на ассемблере противопоставляется трем на Си, например, т.н., операция насыщения (cortex-m).

  • @victorn1199
    @victorn1199 Год назад

    Нормально. Видно работу и виден интерес автора. Результат понравился. Подписан, буду смотреть дальше. Спасибо.

  • @asdffewfew
    @asdffewfew Год назад

    выглядит очень круто

  • @VasyaPupkinus
    @VasyaPupkinus Год назад

    Здравствуйте. Конечно тема интересная . Лайк поставлен, на канал подписан, Жду продолжения!!!

  • @kokotmkokot4926
    @kokotmkokot4926 Год назад +1

    С познавательной точки зрения безусловно интересно. С практической - сомнительное удовольствие, тк не понятно как это переносить на другие серии с иными ядрами, да и индустрия в другую сторону идет. Лучшее - враг хорошему.
    Кстати, после трагедии с Therac-25 были даны четкие рекомендации писать код на С для медоборудования.

    • @VadRov
      @VadRov  Год назад +1

      А вот от Вас я другого и не ожидал. 😉 И, главное, все, как всегда, по делу "Досадные" ошибки могут быть на любом языке программирования. Вот, кстати, про Therac-25. Банальное, ложь в истину по x = x+1. Такую ошибку можно на любом высокоуровневом языке допустить. Дело во всестороннем многоуровневом тестировании и отладке. По переносимости полностью поддерживаю, но не исключаю того, что ряд современных востребованных библиотек, к примеру, поддерживают, как правило, многие серии/ядра, в т.ч., на низком уровне (те же ассемблерные вставки). Что касается этой "оптимизации", то она точно пойдет на ряде серий и ядер в силу набора thumb-инструкций. Главное требование - поддержка simd инструкций (mul, mla, usat и т.п.). Что касается сравнения с оптимизатором компилятора, то при уровне -Ofast конкурирование с моими вставками было 5-20% в скорости в мою пользу. Ощутимый же прирост (до 50%) был получен вставкой с использованием операций насыщения с одновременным сдвигом при преобразовании цвета из YCrCb в RGB. Кстати, в ходе "эксперимента" было установлено, что оптимизатор не всегда использует "машинные" memset, memcpy, т.е. не всегда распознает инициализирующие циклы, циклы копирования блоков памяти. В этой связи теряется производительность. Так что, рекомендую где можно использовать memset и memcpy их использовать вместо инициализирующих циклов, каковых мне доводилось видеть немало в библиотеках.
      Но я вынужден признать один факт, что компиляторы оЧЧЧень умные. 😉 Чтобы их превзойти, надо попотеть. Особенно, если дело касается совокупности математических вычислений с массой переменных при ограниченном наборе регистров.

    • @kokotmkokot4926
      @kokotmkokot4926 Год назад +1

      @@VadRov
      С огромным удовольствием и , немаловажно, пользой для себя посмотрю Ваш код после того, как Вы его опубликуете)) Спасибо за ценные практические советы!

  • @LeonidBazilevich
    @LeonidBazilevich 3 месяца назад

    Очень круто. Я вот хочу сделать очень похожий проект, но с экраном 240x240 (в китае их полно) и воспроизводить зацикленно буквально 20-30 секунд видео. Не подскажете, где у вас хранятся медиа? SD-карта?

    • @VadRov
      @VadRov  3 месяца назад +1

      Да, на sd-карте. Этот проект поддерживает экраны с разрешением 240x240. О настройке сборки указано в описании на гитхабе (раздел "Выбор контроллера дисплейного модуля и его разрешения"). github.com/vadrov/stm32f4_fast_optimized_avi_player_osd

    • @LeonidBazilevich
      @LeonidBazilevich 3 месяца назад

      @@VadRov Спасибо, посмотрю ваш гитхаб подробнее, когда приедет экран!

  • @DIY-hv2hv
    @DIY-hv2hv Год назад

    Крутяк

  • @primerior
    @primerior Год назад

    Весьма интересно! а какой профит в производительности получается в процентах, если сравнить С и Ассемблер

    • @VadRov
      @VadRov  Год назад +1

      На разных задачах от 5 до 50%, если скрупулезно писать код, пытаясь переиграть оптимизатор (опция -Ofast). В частности, здесь удалось существенно поднять производительность за счет продвинутых simd инструкций, в частности, т.н. операции насыщения, которая за 1 цикл буквально творит чудеса. На некоторых задачах "овчинка выделки не стоит", т.к., надо признать, что оптимизатор штука очень умная и переиграть его очень нелегко. Совокупно, проведя оптимизацию (не только в плане применения ассемблера) здесь удалось увеличить производительность почти в 3 раза от номинала (первой демонстрации), плюс к тому же здесь одновременно декодируется из mp3 и воспроизводится звук.

  • @openFrimeTv
    @openFrimeTv Год назад

    а по поводу ассемблера, я бы посмотрел с радостью. И второе, вот где найти инфу как писать на ассемблере? В тех же авр пример кода на с и ассемблер. В референсе стм32 только с. А так же есть вопрос про сд карту, хочу понять как хранятся данные в фат32, но не знаю как гуглить. Находил общее описание, что типо в одной секции хранятся данные, у них есть ссылка на следующую секцию, а вот где прям до бита можно прочитать? Сорри что так много вопросов, но не знаю кому еще их можно задать. И в телеге комменты отключены

    • @VadRov
      @VadRov  Год назад +2

      Если есть опыт в программировании, то этой информации по ассемблеру хватит с лихвой:
      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 я не стал "изобретать велосипед" и воспользовался готовым решением. Максимум, что я сделал, так это оптимизировал инициализацию массивов в библиотеке, что дало некоторый прирост производительности.

    • @openFrimeTv
      @openFrimeTv Год назад

      @@VadRov спасибо. буду изучать)

  • @vsosacordeev
    @vsosacordeev 7 месяцев назад

    Вчём трудности перевода асм кода? не вникал в архитиктуру arm предшествиники в поздних версиях не поддерживаются? или дело сводится к переферийным ножкам, то тут скрипты будут ,как не как к стате.

    • @VadRov
      @VadRov  7 месяцев назад

      Ядра 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 с библиотеками всегда предпочтительнее.

    • @vsosacordeev
      @vsosacordeev 7 месяцев назад

      В таком случае ,я что то не дагоняю, stm32 -ки младшие пастроинны все на Cortex-M3. то Thumb-1 это 16+16 и Thumb-2 это 16+16 либо 32, взависимости от команды. В чём проблема скомпилировать с атрибутами под Thumb , и под Thumb 2. код по факту не меняется. будет менятся только место во флеше. Надо будет зарубиться, как время будет сним. Для меня пока что, видмо он тёмный лес!

    • @VadRov
      @VadRov  7 месяцев назад

      @@vsosacordeev, нет там темного леса. Просто открываете документацию от ARM и читаете на досуге. Но что-то мне подсказывает, что Вы знаете не меньше моего 😉

    • @vsosacordeev
      @vsosacordeev 7 месяцев назад

      В прошлой жизни, что то знал, сейчас как будто заново радился, две буквы свести не могу, толи время сделало своё время, толи органон отказывается думать! @@VadRov

    • @VadRov
      @VadRov  7 месяцев назад

      @@vsosacordeev, у меня тоже многое из головы вылетает. Зато потом быстро опять инфа восстанавливается, когда возвращаюсь к ранее изученному. В голове все не удержишь. 🙂

  • @sergshramm
    @sergshramm 19 дней назад

    Интересует!!! +++++

  • @ebjikkolu4757
    @ebjikkolu4757 Год назад

    Разбирал как то плеер ,там тоже какой то китайский tft . Там работа с дисплее по 8 битной шине . Что думаете о параллельном интерфейсе?

    • @VadRov
      @VadRov  Год назад

      В данном случае это не даст повышения производительности, т.к. упираемся в производительность jpeg декодера. Например, при 42 Мбит/с spi этот дисплей (320x240) можно заливать 36 раз в секунду, т.е. теоретический максимум для 42 Мбит/с будет 36 кадров с секунду. Это при условии, что посылки (декодированные данные) следуют одна за другой. Но последнее недостижимо из-за недостаточной производительности примененного микроконтроллера (в данном случае stm32f401xx на частоте 84 МГц). stm32f407xx, например, должен выдать до 35 кадров 320 х 240. Конечно, 8 битный интерфейс быстрее 1 битного, но тут (в этой задаче/проекте) нет недостатка в скорости передачи информации на дисплей. А так применять можно дисплей и с параллельным интерфейсом. Кстати, этот дисплей (на ili9341 spi) и бОльшую скорость передачи по spi поддерживает. Вот если бы мы упирались в скорость передачи декодированной информации на дисплей, т.е. имел бы место простой в ожидании разрешения вывода декодированных данных, то тогда нам надо было бы задуматься о дисплее с другим интерфейсом - параллельным, а не последовательным.

  • @andromeddka
    @andromeddka Год назад

    Было бы круто посмотреть пример подключения библиотеки lvgl к stm32. Я сам пробовал запускать эту либу, но скорость обновления экрана низковатая получилась

    • @VadRov
      @VadRov  Год назад

      Я месяц-полтора назад кому-то помогал подключать свой драйвер дисплея к lvgl на 411 МК. Достаточно быстро получилось с учетом использования DMA.

    • @andromeddka
      @andromeddka Год назад

      Я вот на 411 делаю, используя дма. Драйвер дисплея st7789. Мне интересно как вы отправляли данные, построчно или несколькими буфферами?

    • @VadRov
      @VadRov  Год назад

      @@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);
      }

    • @andromeddka
      @andromeddka Год назад

      @@VadRov ага, я понял, вы отправляете как картинку. Я пытался так, но получалась ерунда. Попробую еще значит. Спасибо!!

    • @VadRov
      @VadRov  Год назад

      @@andromeddka , да, только так и надо. У нас есть координаты прямоугольника на дисплее и данные, которые надо обновить. У нас есть два буфера, так как мы используем DMA, т.е. внутреннему драйверу lvgl не надо ждать пока мы обновим картинку в указанном прямоугольнике, и он готовит во втором буфере нам следующие данные для обновления. Только так, по схеме с двойной буферизацией и DMA можно получить внятную производительность на spi дисплее.

  • @80cahek
    @80cahek Год назад

    411? 411 умеет в 100Мгц и памяти там больше. Может 401?

    • @VadRov
      @VadRov  Год назад

      Да, здесь 401 применен. Частота 84 МГц. Может работать в разгоне свободно и на 110 МГц. Больше не пробовал.

  • @Alexandrsssd
    @Alexandrsssd Год назад

    Можно было предоставить возможность посмотреть хоть несколько секунд мульта без посторонних звуков?

    • @VadRov
      @VadRov  Год назад

      В скором времени при большом желании Вы сможете повторить проект и смотреть без моих посторонних звуков не только этот, но и многие другие мультики, клипы, фильмы. 🙂

    • @Alexandrsssd
      @Alexandrsssd Год назад

      @@VadRov В чём смысл снимать воспроизведение мультика со звуком, если звука не слышно? Можно просто сказать: я сделал, всё ок. Можете и сами сделать, кому интересно.

    • @VadRov
      @VadRov  Год назад

      @@Alexandrsssd , я не знаю, почему Вы не слышите звука. Но звук есть и он слышен. Это видео из трейлера, но с наложенным саундтреком (где-то взял в инете, не помню), без оригинального звука. Так что, "посторонние звуки" - это звуки из видео.

  • @kokotmkokot4926
    @kokotmkokot4926 Год назад

    и...? слишком заблаговременно размещен анонс...ИМХО🙂

    • @VadRov
      @VadRov  Год назад +1

      Приветствую. 🙂 Жизнь вносит коррективы в запланированные мероприятия. Приходится решать задачи согласно приоритетам. Все будет, как и озвучено.

    • @kokotmkokot4926
      @kokotmkokot4926 Год назад

      @@VadRov безусловно, но люди ждут, а дороже нет ничего)