Обновить
193
0
Павел Локтев @EasyLy

TinyML, исполнение нейросетей на микроконтроллерах

Отправить сообщение
Спасибо за идею. Правда, имеющаяся у меня версия ST LINK Utility выдала только половину нужной информации. Она показала, что ПЗУ действительно 32К и чип — Low Dencity Device (что подтверждает тот факт, что перед нами STM32F103C6, а не C8), но так в явном виде и не показала имя чипа «для бюрократов». Но в целом — буду иметь в виду.

Забавно. Сколько «голубых пилюль» в свои поделки вставил — до сих пор ни одного случая проблем не было. Был случай, когда три платы из десятка сразу не мигали светодиодами. Но там после недели пререканий, продавец прислал замену. И всё. В остальном — не видел проблем с ними. Поэтому и был шокирован сейчас. Особенно если учесть, сколько именно производитель сэкономил, сделав такую подмену…
Тут лотерея. Потому что тот же самый конечный продавец потом прислал десяток нормальных плат. Что первый десяток был проблемный — вот, случайно сейчас выяснилось.
Такой вопрос уже задавали в комментариях под статьёй про DMA. Так что там уже собраны и развёрнутый ответ, и ссылка на исходники, которые автор разрешил выложить без каких-либо гарантий.

Чего там не рассказано, так того, что приложение хоть и WinForms, а отображение идёт через OpenGL. Потому что штатная графика не давала приемлемого FPS.
Они не со зла. Просто в данном конкретном примере — они не ожидали, что кто-то может сделать систему без средств вывода хоть куда-то. В результате, их шаблонный код стал неработоспособным — шаблон считает, что хоть какой-то вывод, а есть. Вот и пришлось убрать соответствующую функцию. Аналогично — и другие проблемы. Всё от того, что они не всегда учитывают возможное отсутствие тех или иных вещей. Почему у меня вещей не было — статья и так распалась от тяжести на две части. Мне показалось, что не стоит пытаться объять необъятное и здесь грузить читателя ещё одной новой для него вещью. Вставил только самое необходимое, чтобы новых сущностей было как можно меньше. Отладочный вывод можно будет ввести позже, когда новички уже освоятся.

Но как бывший профессиональный тестер, всё-таки отмечу, что код у них получился неработоспособным. А могли бы и предусмотреть такой вариант.

Блок трассировки довелось активно применять на ARM ядре, чтобы понять, где же всё тормозит. После изучения растактовки, выводы были такими, что пока что мы отказались от использования Cyclone V SoC в наших задачах (подробнее об аргументации было в прошлой статье и чуть-чуть — в ответе ниже). Как бы я без него решил проблему, когда вливаешь код на SDшку, включаешь, а он вылетает в исключение — ума не приложу. А так — берём трассу в режиме с точностью до команды, и смотрим, как же код докалился до такой жизни. Но всё это было на Cyclone V SoC с тем ядром.
К слову о доступе к FPGA части на Cyclone V SoC. После кучи опытов, я выяснил, что там по тактам будет быстрее ловить прерывание от своего FPGA компонента, чем опрашивать его регистр состояния. После перехода на прерывания, система стала работать веселей, но всё равно асимметрия тактов на запись, на вторую и последующие записи в серии и на чтение, заставила сильно усложнять код. Когда условностей стало слишком много, я плюнул и переделал ту разработку на PSoC с его слабеньким Cortex M3. Код стал линейным и простым. Надо было думать о логике, а не о тонкостях возникающих задержек.

В общем, ПЛИС с ядром Cortex A, на мой взгляд — не для управления, а для обработки больших потоков данных. Там им равных я не вижу. Но в рамках рассуждений о комплексе Redd — нужно управление.
Ножку дёргал в FPGA части. С HPS частью ограничился работой с UART. Когда на трассе JTAG отладки увидел, сколько тактов занимает постановка байта в FIFO штатной API функцией, проверяющей его переполнение — мне стало плохо. При том, что очередь была заведомо пуста. Функция, не проверяющая переполнения, до инфаркта не доводила, но всё равно была не ахти, ведь FIFO придумали, чтобы туда бросил байт и забыл. Сотни тактов на эту операцию — ужас.

В общем, я во всём виню латентность (много одиночных записей подряд и на Cyclone V SoC не очень плохо бегают, а когда процессору надо дождаться считанных данных — они придут только когда закончатся все отложенные записи). Запрос там проходит через слишком большое количество мостов, это следует из документации. В HPS аппаратуру — поменьше, в FPGA — побольше. Для больших объёмов данных в едином пакете латентность не страшна, для одиночных обращений — плоха, для смешанных одиночных чтений и записей — вообще убийственна.
Стиль документации Кипариса — отдельная грустная песня. Я выл от их стиля ещё когда FX2LP изучал. Причём в итоге оказалось, что про FX2LP у них написано всё, но как оно тяжело читалось! Тут же и описано не всё. И когда мы этот перевод делали — у нас целые дискуссии возникали, что именно имели в виду авторы в той или иной фразе. Так что частично наш перевод чуть отличается на уровне слов от оригинала. Но не на уровне мыслей. Где сохранить мысль в духе оригинала было невозможно — появлялись примечания переводчика…
Ну и в качестве напоминания тем, кому интересна тема ОСРВ: мы готовим к 31 мая ОСРВ МАКС для публикации на гитхабе. Планируем полностью бесплатное использование, в том числе в любых коммерческих проектах.
Подробнее здесь: www.astrosoft.ru/about/press_room/news/37184
Там на рисунке у контролов и шифтов коды Ex. Как я заметил, x — это номер бита, который можно поместить в нулевой байт отсылаемого репорта. То есть, чтобы послать правые Ctrl+Shift — надо положить туда константу 0x30 (биты 5 и 4). Именно поэтому я не стал помещать вот это дело в основной текст:

// Bit  Key
// 0    LEFT CTRL
// 1    LEFT SHIFT
// 2    LEFT ALT
// 3    LEFT GUI
// 4    RIGHT CTRL
// 5    RIGHT SHIFT
// 6    RIGHT ALT
// 7    RIGHT GUI 

Для переключателя же раскладок это пригодится.
«Золушку» и «Ваню» тот самый Сергей Воронцов разбирает в своих видео (на ЮТубе поиск на них выведет). По ссылкам из-под видео можно скачать укороченные ноты с табами(разбираются именно укороченные варианты). Полные — в комментариях под роликами упоминается, что можно купить.
ну, статья вполне серьезная, в том смысле, что реально такая педаль сделана и реально сделана в помощь себе для просмотра видео уроков игры на балалайке.
Это уже — высший пилотаж. Для многих применений подойдёт и простой UDB Editor. По крайней мере, все реальные разработки, которые приходилось делать — сделаны в нём. Просто не хотелось бросать изучение на полпути, а раз изучил — почему бы не выложить результаты?

Ещё одна причина, по которой эта статья сделана — очень многие чужие вещи написаны именно через Datapath Config Tool. И их надо уметь читать, если есть желание учиться на чужом опыте. Следующая статья (финальная в цикле) задумана именно про это. А как её писать, если не показано, что за инструмент используется?

Но в целом — UDB Editor накрывает довольно широкий диапазон задач. Так что бояться не надо.

Планов по переводам или авторскому описанию аналоговой части пока нет. Не было нужды в неё играть пока что. Присматриваюсь к программированию DFB (Digital Filter Block), но фирменных примеров практически нет. Освоение идёт очень тяжело. А хочется сделать аппаратный PID регулятор для 3D принтера на нём. Вернее, три (два для экструдеров и один для стола). Не уверен, хватит ли ресурсов, но присматриваюсь к этой части, связанной с аналоговым сигналом.
Добавил в текст фотографию внешней платы с разъемами интерфейсов:
image
Плисоводы есть ) Тут немного о нашем опыте: habr.com/ru/post/345638 и habr.com/ru/post/352666
Но всегда будем рады хорошим новым людям )
Спасибо! выключить удаленно можно, т.к. устройство запитано от самого Redd. А вот заметить/почувствовать запах дыма… в коробке сейчас такого нет, хотя тоже, конечно, можно что-то придумать, если вероятность такого сценария и его цена высоки.
Да, эмуляция возможна, но встаёт вопрос трудозатрат по разработке такого решиния. Нужно считать, насколько оправданно.
Возможно, к этому в далёком будущем и придём ))
Сейчас не умеет, хотя реализовать возможно, через ПЛИС… ну и вопрос поиска финансирования под такую задачу.

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Зарегистрирован
Активность