Итак, имеется устройство: китайский LCD дисплейчик TXW200035P0-CD (320 Х 240) IC:ILI9342C, управляется по SPI чипом от Nordic - NRF52832 (получаю по BLE файл, сохраняю в дополнительную Flash и с помощью этого же чипа передаю файл на дисплей). Сам NRF52832 не блещет быстродействием (пока получил только 5 кадров в секунду), но уверен, что можно и без дополнительных элементов ускориться.
Подскажите, пожалуйста, как добиться хорошей скорости (использование DMA, конвертация и пр.)?
Насколько мне известно, максимальная частота SPI у NRF52832 8 МГц. Теперь считаем сколько кадров можно отрисовать за1 секунду с помощью DMA или CPU:
1 кадр: 320x240x16 = 1228800 бит данных SPI дает 8000000 бит/c
Поделив одно на другое получим: 0.1536 с - или 6,5 FPS. Выше этого не прыгнешь. И то это без учёта assert-ов и deassert-ов линии !CS, которая как правило тоже занимает некоторое время.
Тут как либо менять дисплей, либо контроллер. Лучше - и то и другое.
Конвертация тут не поможет, если дисплей не поддерживает приём данных в режиах меньшей разрядности, чем 16 бит. Старые дисплеи могут работать в 8 битовом режиме.
Менять на дисплей с меньшим разрешением? Или что вы имеете ввиду?
Gospodin_Riba, знаю я этот Tunnel. Только он OpenGL-вский.. Интересовал кстати больше Ваш, порт под DOS, как я понял он собран на Watcom C99. Данного компилятора не было, но тем не менее код был успешно собран как на GCC3.4.6 так и на Intel C++ 8.0 .
Полученые O/OBJ-ы были не менее успешно слинкован внутренним COFF компоновщиком FreePascal 3.0.4 в Win32 прикладуху. Через вот такой вот враппер: https://pastebin.com/0ge66y8z и вау - оно даже стартануло. но не надолго - потом ошибка какаято в делении на 0 С ходу не смог разобраться в том число и мозгодробительном кодесе. Ну да ладно, хоть так
Присоединённое изображение (Нажмите для увеличения)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Рекомендую плотно освоить C(просто С без ++), потому что у Pascal очень сильно хромает оптимизация и адресная арифметика указателей у него очень слабая.
Единственный способ расшевелить паскалевские программы - переписать на ассемблере критичные части кода. На Си это делается проще: -Ofast -O3. У меня тотже туннель идёт на C быстрее чем паскалевские варианты с асм-вариантом линии
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Gospodin_Riba, произошла некоторая непонятка. Код для DOS был взят из темы "дисплеи от сотиков". Компилировал tunnel.c довольно мегамощными компиляторами Cи, а фри-паскаль использовался как COFF линковщик PE Win32приложения и выводильщик BMP имеджа на HDC окна FAR)))) Поэтому и вверх тормашками получилось Так что никакой Vesa и паскаль указателей...
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Я долго думал какой кодек использовать для звука и пришёл к выводу, что они все избыточны: хренова туча каналов: на вход, на выход. Большое число ног, внутренняя сложность!
Хотелось чего-то простого и в то же время отличного по характеристикам.
Потом вспомнил, что у меня есть несколько комплектов для сборки Adlib (OPL 2/3) и OPL4 + MPU401 MIDI.
Вот таких:
Присоединённое изображение
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Пришлось пободаться в полный рост с McASP и сопутствующей ему периферией (Audio FIFO, прерывания, DMA). Всё очень сложно. Пришлось вкуривать мануалы, примеры в интернете есть, но они есть калокубовские нагромождения CSL или TI-BIOS.
Проблемы были такие:
1) Непропай ноги питания и одной управляющей (YAC516) - заметил не сразу, так как был уставший.
2) Непонимание трактовки делителей частоты в мануале - пришлось вооружится частотомером/периодометром и смотреть каждую ножку McASP.
Добился того, чтобы MCLK=12 МГц, BITCLK=MCLK/4=3 МГц, LRCLK=BITCLK/(2 slot * 32 bit) = 46.875 кГц - отличается от стандартных 48 кГц немного. На слух не особо заметно.
Это соответствует режиму: MCLK=256*fs.
Можно выставить режим MCLK=384*fs (MCLK/BITCLK=6), тоже работает (проверял), но тогда число вариантов частот семплирования уменьшается. Оставил первый вариант.
3) Отсутствие потока данных на SDATA - осциллографа у меня нет, пришлось понижать частоты до звуковых (выставил большие делители) и с помощью наушников, резистора и конденсатора - на слух слушал частоты со всех ног McASP:
- MCLK - частота самая высокая - BITCLK - частота в 4 разаниже - LRCLK - очень низкая частота - SDATA - шум
4) Подбор полярности/фазы бит-клока, подбор источников сигнала (ножка/делитель) - вначале биты были перекручены, местами шипело и воспроизведение было грязным.
5) Подбор остальных параметров формата. В этом аудио-ЦАП (YAC516) - не совсем чисто-I2S, скорее пародия на него (например, нет синк-бита перед сигналом фрейма, защёлкивание данных по спаду, не по фронту,... ит.п.)
6) Запуск DMA и буфер FIFO с максимальной настройкой в 64 аудио-слова. Выпило всю кровь! Автомат настолько сложный, что на его освоение потратил 2 дня.
7) Особый геморой доставило включение прерывания ОТ DMA - не хотело долго включаться, так как в мануалах расплывчато сказано о взаимосвязи теневых регионов и разрешением прерывания..... Проехали, включилось!
В итоге, всё пашет, как было и задумано!
Вот такая "звуковая карта" вышла:
Это сообщение отредактировал Gospodin_Riba - Apr 2 2019, 01:32 PM
Присоединённое изображение
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Пруф и исходники ниже.
Из недостатков McASP - двойной перерасход буфера на Stereo, в случае если нужно Mono. А так всё пашет здОрово, пришлось применить трюк со смещением в трансмиссии DMA, чтобы воспроизводить 16-битные семплы, вместо 32-битных.
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE (Gospodin_Riba @ Apr 2 2019, 01:27 PM)
Из недостатков McASP - двойной перерасход буфера на Stereo, в случае если нужно Mono.
Удалось обойти этот недостаток, путём задания одного тайм-слота. Получается из I2S сделал I1S И на второй канал память не требуется.
Кроме того, наконец-то покорил EDMA3 полностью - включил его в режиме 3D - теперь доступны все три измерения (ACNT, BCNT и CCNT) А это значит, что в случае аудио, нам доступно разом передать блок размером:
2..4 байта (семпл) * 64 семпла (Audio FIFO) * 65535 порций - это около 8 МБ !!! Только вдумайтесь - одна транзакция через DMA максимально длинной около 8 МБайт!!! Такого DMA я ещё не видел... Во всех ARM-ах, включая STM32 максимальный размер блока всего 64 кБ.
Проверял на загрузке больших аудиоданных - работает. Основная проблема была перевести EDMA3 в режим ABC- через Self-Chained, чтоб по трём измерениям работал и тактировался от эвентов McASP (а не сам по себе копировал данные)
STM32 очередной раз курит в сторонке, нервно кусая ногти
Переношу H264 проигрыватель...
Это сообщение отредактировал Gospodin_Riba - Apr 3 2019, 04:39 PM
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Сделал балалайку. Всё отлично работает!
Параметры такие:
MP4: 400x240 16 бит на точку, 27 FPS. MP3: 32 кГц 48 кбит/с, 1 канал SD: 4 класс скорости , SPI 22.8 МГц
Я думал, что SPI не протащит два потока, а оказалось, что всё ОК
Задействовал PRUSS (точнее PRU0) для конвертации кадров YUV в RGB и отправкой их в дисплей. Параллельность даёт выигрыш!
Только PRUSS не поддерживает плавающую точку и работает с внешней памятью без кеширования. Даже умножать не умеет Но это не беда - логический сдвиг + суммирование прекрасно делает умножение на любое число! Чисто RISC и Real-Time. Работает на частоте вдвое меньшей, чем C6745: 228 МГц.
Компилятор C для PRUSS от TI: clpru - говно редкостное и сырое, пришлось немного повоевать, так как делает неоптимальным код, если глядеть ассемблерный листинг.
Программирование PRUSS чем-то Z80 напомнило.
Cделал замеры - функция для отрисовки и конвертации та же самая(для C6745 и PRUSS) :
Шина дисплея 114 МГц: декод CPU + рендер CPU : всего 29FPS декод CPU + рендер PRUSS: всего 38 FPS
Шина дисплея 152 МГц: декод CPU + рендер CPU : всего 31FPS декод CPU + рендер PRUSS: всего 38 FPS
Из замеров делаем вывод: использование PRUSS позволяет снизить тактовую частоту шины LCD с сохранением производительности - потому что отрисовка идет параллельно и занимает меньше времени, чем само декодирование.,,,,
Пруф:
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Наконец-то это случилось! Написан свой загрузчик, который может загружать программы с SD-карты во внешнюю динамическую память. Загрузчик также инициализирует почти всю периферию (Остается не проиниченным FPU, половинка кеша L2 и DMA для McASP - по ряду причин).
Работа на уровне файловой системы. Прикручен FatFs.
Управление- от 6-кнопочного джойстика СЕГи. Опрос кнопок висит на PRUSS и работает впараллель программам.
Присоединённое изображение
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE (microxa @ Apr 22 2019, 03:49 PM)
QUOTE
Эмулятор NES.
А синтез, чего, пиликает? А работает такой новодел как этот
Super Bat Puncher - Morphcat Games morphcat.de/superbatpuncher/ Super Bat Puncher is an original homebrew game for the NES. там музычка хорошая.
Я не понял прикола. Скачал этот новодел, но там в демоверсии совсем не то что на видеоролике, а более лажовее - нету той музычки что на видео. Запускал на ПК, эмуль FCEUX.
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Сразу скажу, что STM-ы тут никакие не катят вообще, по причине того, что 400 МГц не хватит чтобы воспроизводить эмуляцию тяжелых игр на фреймрейте 60 FPS.
Поэтому был задействован со-процессор (PRUSS) внутри C6745 и распараллелить алгоритм. Теперь отрисовкой занимается PRUSS, а логикой эмулятора - C6745.
Несколько лет назад делал на BF532 эмулятор SEGA, так пришлось разгонять до 600 - 700 МГц чтобы нормально шло. А тут C6745 на своих 456 МГц нормально работает впараллель с PRUSS на 228 МГц )))
Так что BlackFin BF532 сосёт, и STM32H7 тем более сосёт )))
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Здесь показана максимальная производительность всей системы (CPU+PRUSS), убрана кадровая синхронизация. Чисто для наглядности, на практике конечно, надо с синхронизацией играть
Gospodin_Riba да уж... вот это нифига сеге... .. не смог удержатся, чтоб не пройти квест по сборке эмуля Gens в архидревней ламповой шизюал студио 6.. до этого почемуто не получалось. какойто заклин, происходил.. а тут собралось .. аж самому странно.. Ну специфика тут больше х86-ая..
Присоединённое изображение (Нажмите для увеличения)