All streams
Search
Write a publication
Pull to refresh
193
0
Павел Локтев @EasyLy

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

Send message
1) Сейчас открыл ту свою статью, которая в столе лежит, проверил. Там этому посвящён целый раздел, который говорит, что строгая типизация действительно затрудняет именно хранение в массиве но в принципе — это возможно.

2) А вот у самого автора той библиотеки зато есть более интересная штука — PinList. Ноги, объявленные таким методом, объединяются в группу, которую можно заполнять занесением двоичной константы. Я в своих статьях как раз извращаюсь с их заполнением и смотрю, что выдаёт оптимитзатор. А оптимизатор там даёт идеальный код. На ассемблере с этой группой контактов обычно лучше не получится работать. Правда, в Кейле надо включить обязательно оптимизацию по времени. Если по размеру — всё будет хуже.

Собственно, из статьи про эти группы контактов я и узнал о существовании той библиотеки. Но когда скачал с Гитхаба, оказалось, что она — это не только GPIO, а ещё и масса других вещей. Надеюсь, за ссылку на очень старую статью на другой ресурс, меня не расстреляют. Она реально старая. Тогда библиотека ещё называлась avrcpp. Сегодня её надо гуглить по имени mcucpp. Вот, нагуглил текущее состояние.
Кстати, а измеряет Ваша программа или чужая? Просто подумалось, а не вещественные ли числа там делятся? Если они, то при росте порядка, идёт загрубление, что может приводить к интересным результатам.

А так — выше я в комментариях отписался (и новый раздел ближе к концу текста вставил), как удалось разогнать на любых объёмах. Тот же метод, что и у китайцев, но не абстрактное «Мы сделали», а скачана конкретная библиотека от отечественного автора. И получившиеся осциллограммы соответствуют предсказанным. Ну, и с USB 2.0 хабом, предсказуемо ничего не улучшилось.
Не так совсем другое. Вот это не так. Остальное — просто замечательно. И эти 10 копеек наоборот внушают оптимизм. что всё наладится.
Когда ориентируемся на частоту генератора — я уже привык на реальные тысячи умножать. Потому что там все эти биты в секунду от кварца пляшут. Так что все программистские вычисления тут только всё запутают.
Вот конкретно у товарища Чижова всё идеально читается. Намного легче, чем макросы. Везде надо знать меру. И он её знает.
Да, но остальные или хуже, или дороже… Понятно, что они не вечны… Но вот прямо сейчас, если бы не дефицит на фоне пандемии, они популярны. А лет 10 назад я Мегу восьмую любил. Причём писал на ассемблере для неё.

У NXP библиотеки лучше сделаны. Да и сами они неплохи. Но ценаааааа… Я просто сейчас Teensy 4.1 по проектной необходимости изучаю. Но когда надо круть — можно и переплатить. Когда не надо — зачем переплачивать?
Вы про 10 лет? Вот ссылка

Слева сверху зелёненькая надпись Active. Чуть правее от неё монетка десятикопеечная. Наведите на неё курсор…
В своё время, конкретно F103C8T6 на сайте обещали не снимать с производства в ближайшие 10 лет. Так что если сама фирма не развалится, то должно быть всё хорошо. Будем хотя бы на это надеяться.

Но как человек, живший при дефиците, я несколько десятков Пилюль купил давно. Для дома, для семьи… Уж больно они замечательные.
Как это делается в mcucpp — есть в тексте статьи.

Где-то объявляем
typedef Mcucpp::IO::Pa0 oscOut;	

Потом можно всегда поименять на другое

Затем — где надо, инициализируем
	oscOut::ConfigPort::Enable();
	oscOut::SetDirWrite();

Первая строка нужна, чтобы на порт тактирование включить, оно там само определит, на какой GPIO подать, для более сложных блоков — и на GPIO ног, и на блоки подаст.

Ну, и работаем
oscOut::Set();
oscOut::Clear();

Обратите внимание, что никаких переменных не заводится. Там работа через статические функции идёт. Как макросы, только легко читаются реализующие функции, и всё строго типизировано. И при вводе текста часто подсказки IntelliSense хорошие выдаёт, не надо всё помнить.

Оптимизируются так, что руками на ассемблере лучше не написать. Я проверял.
Для всего, кроме USB Middleware я использую mcucpp Константина Чижова. Она довольно здорово оптимизирует код, а также делает простой работу со сложными блоками (я использовал GPIO, таймеры, в том числе, в режиме ШИМ, UART, SPI). При этом ноги перекидывать при переразводке платы — сплошное удовольствие.

Правда, я давно не заглядывал, что у него там сейчас. Лет 5 назад скачал и развивал свой вариант. В столе даже есть пара статей про эту библиотеку, но знакомые отговорили от их публикации. Она же не моя. И типа нечего тут…

USB — приходилось пользоваться тем, что есть… Но буду изучать библиотеки, с которыми познакомился сегодня. Сейчас вставлю дополнение в текст…
Огромное спасибо!
Больше библиотек, хороших и разных!
Ну, дешёвый контроллер с FS — это всё тот же F103. Он замечательный по большинству параметров. А дикая скорость нужна не всегда. Чуть выше я в комментарии привёл график, полученный с использованием библиотеки EddyEm — с нею можно получить полноценную скорость. Я верил, что в комментариях мне подкинут идею (правда, для этого пришлось пошерстить его комментарии к чужим статьям, чтобы найти ссылку на эту библиотеку). Чуть позже дополню статью ссылкой на эту библиотеку.

EHCI — вот эта плата, процессор NXP IMXRT1062. Скоро выложу несколько статей со своими первыми впечатлениями о работе с нею. Но по цене это совсем разные весовые категории… И отладочного порта на этой плате нет. А так — забавная штучка.
В общем, всё здорово!

Это было (для меня) нелегко, но я справился со сборкой Вашего проекта /F1-nolib/CDC_ACM под Windows. Результат при прямом подключении к материнке — просто замечательный. Через хаб — предсказуемо такой же, какой был.

image

Сделаю несколько замеров — дополню статью ссылкой на российского автора полезной библиотеки в Вашем лице…
Оптимизация на размер именно в Кейле даёт массу CALLов вместо автоматических инлайнов. Так что она точно на скорость в лучшую сторону не может повлиять.

Что до постепенного разгона — вопрос интересный. По крайней мере, я замерял для нескольких мегабайт.
В readme сказано, что это для F3. ld файл тоже для большой памяти, в makefile всё тоже для f3.
Порылся по Вашему профилю. Нашёл Вашу USB библиотеку на Гитхабе. Выглядит забавно. Настолько забавно (в хорошем смысле этого слова), чтобы показать всем. Будем измеряяяять. По результатам — отпишусь.
Сложный вопрос. Давным-давно, лет 5 назад, играл я в CMSIS RTOS. В те времена её вызовы проваливались в ту же самую MiddleWare, что и у Кубика используется. Дрйверы для ОС же поставляли те же самые STшники. Возможно, с тех пор что-то изменилось, но мне это было уже не интересно.

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

В общем, единственные, кто целенаправленно давил эту проблему — те самые китайские товарищи. Но тот самый USB 2.0 хаб испортил бы результаты и им… И это в статье доказано.
Может когда-нибудь руки и дойдут… Или кто ещё сделает это. А я сейчас весь в играх с Teensy 4.1. Последние графики сняты на ней. Скоро планирую результаты своих осмотров той платы опубликовать. Спасибо Заказчику Тинсевого проекта, разрешил все находки в публикацию пускать.
Спасибо! Действительно что-то я неверно перевёл байты в таблице в килобайты в тексте. 56X_XXX байт. Примерно 560 килобайт в секунду, конечно же.

560 * 8 = 4 480 килобит, грубо 4.5 мегабита.

Сейчас поправлю текст. Ещё раз спасибо.
Спасибо!

Скачал. На выходных погляжу, насколько легко или сложно пройти этим путём.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity