Pull to refresh
193
0
Павел Локтев @EasyLy

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

Send message
Извините, не так выразился, имею ввиду конечно же подтягивание самого дизайна на чипе к ножкам и timing constraints.

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

Насчёт настройки timing constraints — я читал зубодробительные статьи здесь. Я честно пытаюсь это освоить… И понимаю, что это — для тех, кто делает серьёзные проекты. К счастью, для несерьёзных проектов, есть одна замечательная вещь. Когда у PLL заданы частоты — они автоматически распространяются на все выходящие тактовые линии. Я проверял. Это видно из отчётов по времени (насколько я помню, Timing Analyzer называется). Если просто дорожка — ругаются, что частота неизвестна. Если выход из PLL — пишут и заданную частоту, и какая реально достижима.

Поэтому если всё не уложилось — нас предупредят. И для несложных проектов этого достаточно. А сложные — не для Redd :-).
Поправьте меня, если ошибаюсь, но автор той статьи как раз делает неверный вывод — задержка между фронтами тактовых сигналов должна быть абсолютной величиной в нс, а не пропорциональной в градусах.

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

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

Еще хорошо бы подтянуть эти блоки непосредственно к пинам (constraints),

Я просто в этой статье опустил, как уже привычное действие, но дал ссылку на то место, где всё подтягивается к ножкам (где про Virtual Pin говорится). Причём иначе не получится ни у нас на Redd, ни на какой-либо макетке с Ali Express. Да и на любой другой. Генератор и ОЗУ же уже припаяны. Волей-неволей, а придётся подключвть именно туда, куда разработчики припаяли (а припаяли они, надеюсь, к выделенным тактовым линиям, у нас — точно).

Подскажите, пожалуйста, версию документа, в моей (2017.11.06) это 27.7, например.

У меня версия от среды разработки 18.1, датирована 2018.09.24. Но именно поэтому я дал не только номер раздела, но и название. И именно поэтому я не даю прямых ссылок. Они вечно всё меняют. Лучше давать строки для поиска.
Главное достоинство этого метода — шина тянется в виде одной верёвки, сколько бы разнородных сигналов в ней ни было (при схемотехническом варианте пришлось бы тянуть все сигналы).

А ещё, есть случаи, когда иначе — невозможно. Например, попробовал я положить стандартный библиотечный компонент PCIe ядра на схему… Получился такой ёжик! И все торчащие из него иголки надо куда-то подключить! Стал смотреть учебники, оказалось, что рекомендуемый вариант — именно через процессорную систему. Тогда всё получается красиво и компактно. Причём процессор в ту систему можно не включать, ведущим будет именно блок PCIe.

Второй случай, где без такого варианта не обойтись, я даже описывал. Вот тут. Как раз, когда разбирался с решением той проблемы, узнал, что можно выносить систему на верхний уровень и обходиться в проекте без написания кода на языке (VHDL/Verilog) вообще, так как прослойка — не обязательна.
У нас для этого выбран FT2232H в режиме FT245-SYNC, об этом уже была статья

Для PCIe нужна ПЛИС с индексом GX, а это — сразу другая цена (опыт-то в этом деле есть, подробнее — тут). Мы пока решили обойтись без неё, так как нам кажется, что нет реальных целей, оправдывающих это удорожание. По этой же причине не стали использовать и USB3.0 мост от FTDI (там бы сразу увеличилось число используемых ног ПЛИС, так что кроме цены самого моста набежала бы цена другого класса платы и прочего). Возможно, потом признаем ошибку, но под текущее ТЗ и синхронного параллельного канала FT245-SYNC хватает.

Добавлю ещё, что если писать в память, реализованную на PCIe средствами центрального процессора, то скорость получалась у меня не ахти. 4 мегабайта в секунду, что ли. Дело было в 2012-м году, кое-что уже забылось. Использование простенького блока DMA, как рекомендуется в PCIe примерах от Альтеры давало тот же эффект. SGDMA я тогда не стал осваивать, но сделал свой блок DMA. Он уже выжимал из PCIe 1x нормальную производительность. Но DMA — это всё равно драйвер и прочие извращения. Короче, хрен редьки не слаще. Работа на выделенном процессоре ничуть не хуже.
А уж вы постарайтесь сделать все медленно, но правильно.
Не все готовы ждать. Кто не готов — тем я показываю, как они могут сделать уже сегодня. Причём набросать процессорную систему можно даже не владея Verilogом. Достаточно где-то взять нужные кубики (например, из примеров к этому циклу)

Больше подходов, хороших и разных! Выбор — это всегда замечательно!

И есть ещё одна вещь… Всё, что я рассказываю — не замыкается на Redd. Кто-то прочтёт и применит на макетной плате с Ali Express. Может, даже спасибо скажет.
Больше подходов, хороших и разных! Использование NIOS II — не догма. Redd — это всего лишь железка, от которой каждый может добиться того, что ему нужно. Если Вы знаете, как можно добиться результата иным путём — никто не заставляет идти тем же путём, какой раскрываю я.

Но давайте я обосную свой вариант. Одна из задач, которые решаются комплексом, требует либо генерации каких-то данных, либо их сбора. К концу цикла я как раз планирую сделать собиратель информации. Именно с этой целью, в систему добавлено ОЗУ. Работа с ОЗУ требует какой-то сложной логики. Её можно реализовать на автоматах или в виде программы для процессора. На автоматах всё делается быстро, надёжно и красиво, Но вот модифицируется — долго и со скрипом. Поэтому надо сразу проектировать качественно и вдумчиво, что не согласуется с концепцией быстрой разработки, при которой возможны ошибки и переделка частей кода. Значит, нужен процессор. Под него всё модифицируется быстрее. Но чтобы система на процессоре была более-менее поворотлива по скорости — надо держать в уме некоторые вещи… Вот эти вещи в данном цикле я и рассказываю…

А пользоваться ими или нет — решает каждый сам.

А меандр — он просто красиво на иллюстрациях выглядит. Все разрывы хорошо видны. Поэтому на нём и показываю. Сам меандр ради меандра проще получить в коде на Verilog, о чём в цикле тоже уже были статьи (вот эта и вторая половина вот этой). Но он тут — не цель, а средство для иллюстрирования. Подробности, почему всё показывается на осциллографе — в этой статье. Я пытался получить раскладку по тактам, пока не вышло. Приходится показывать вот так.
В описанной мною ситуации, единственное, что греет душу — система разработки хоть и от крупного производителя, но всё-таки даётся официально бесплатно. То есть, позор им, конечно, но хотя бы за это деньги не берут. Но что-то мне подсказывает, что с атрибутами файлов весёлости могут быть и у тех, кто бешеные деньги не просто платит, а ежегодно платит за полные версии ПО.

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

Ну, и раз уж написал, то попутно отмечу, что для поделок (я специально разделяю изделия и поделки) — в плату по Вашей ссылке выше надо запаять не только контроллер, а ещё конденсаторы (электролиты и керамику), кварц и разъёмы. Всё это тоже денег стоит. Так что деньги будут уже не те. И на фото не видно разъёма USB. Даже если посадочное место под него просто не видно, то запаять его (предварительно купив) тоже всё равно придётся. И там есть ссылка на плату, в которую уже всё запаяно. Она стоит 9 долларов. Так что это уже не является эквивалентом пилюль.

Военные у нас денег не считают. И вот пусть они и не считают. А для дома, для семьи — лучше считать и деньги, и время. Причём время — в большей степени. Купив готовый модуль, получаем экономию этого самого времени.

По крайней мере, не стоит отменять данный подход.
Увы, пока такой способ не найден. Пока только сформулирована проблема. И пока ясно, что:

1) При получении нескольких плат следует проверять не выборочно, а тотально
2) Простое мигание светодиода и осмотр маркировки — не являются достаточным показателем качества платы

При выявлении подделки, стоит попробовать поработать с продавцом. Пока что видно, что один и тот же продавец, даже не зная, что продал подделку, в следующий раз продал нормальный товар (что первая партия была поддельной — я узнал вот только что, когда уже вторая пришла). Получается, что продавцы что купили, то и сбывают. Возможно, они просто не станут работать с плохими производителями (но это не точно, просто пока так всё выглядит).

Также в процессе обсуждения всплыла тема отбраковки. Похоже, надо входной контроль делать очень суровым. Проверять всё. Было бы здорово, если бы кто-то из производителей отечественных ARMов поделился системами тестирования, так как написать всё с нуля — неприемлемо долго. Никто не станет этого делать. Я имею в виду вещи, которые проверяют каждую команду ассемблера, как в своё время было в тесте для ДВК.

Прелесть пилюль в том, что при этом контроле не останется никаких следов пайки. А значит его делать можно. Вот проверка микросхемы — это всегда трудно, без пайки сложно проверить, а со следами припоя уже не возьмут назад. Тут же — всё на SWD разъёме. Осталось только написать соответствующий код. У меня есть кое-какие мысли, как легко и просто проверять ОЗУ/ПЗУ (без написания прошивок). Но сейчас некогда заняться. Возможно, когда-нибудь сделаю, а при успехе — опишу. Но может и не соберусь…
Настоящая современная FT232 — поддерживает (я не помню, какие должны быть буквы в конце). И настоящая PL2303H (именно «H») поддерживает. Но если заказывать на АЛИ — приедет китайская подделка, которая не поддерживает. Я проверял. Даже мой знакомый китаец бросил заказывать в Китае и заказывает для себя в Штатах, но ему для бизнеса, он вынужден. Я же беру для души.

Заказать вариант с гарантированно правильным FTDI/Prolific в России или Европе будет намного дороже, чем взять пилюлю и «прошить» уже отлаженный код в неё. STM32 — весёлый чип, у него коэффициент деления частоты UART дробный. Потому что самое главное при использовании UART на высоких скоростях — это не скорость. Скоростью никого не удивишь. Главное — точность установки этой скорости, чтобы точно быть согласованным с устройством на другом конце кабеля. Вот её у китайских подделок именитых чипов я не наблюдал. Оригинальные же мосты — дороги.
или не получать вообще, чтобы ушел обратно.
У меня пару раз посылки по России на том конце не получали. Когда приходили назад — почта с меня сдирала за обратную пересылку столько же, сколько за пересылку туда. Так что продавец может оказаться не рад, получив товар назад.
Больше подходов, хороших и разных!

Вот я, например — программист. Спаять что-то могу, но это занимает время и тратит нервы (глаза уже не те). Соответственно, когда для какой-то поделки «для дома, для семьи» нужно сначала что-то специально заказать, потом спаять, потом только запрограммировать — я прикидываю время, которое на это будет потрачено и машу рукой.

Если для поделки надо задействовать макетку уровня Discovery — я просто отказываюсь по причине цены и размера (к слову, у меня дома их пять штук имеется, так что я не жадный, я домовитый).

А вот пилюля — это «для дома, для семьи» оптимум. Захотелось что-то сделать, я открыл коробку, взял пилюлю, подключил либо Ардуиновскими проводочками, либо МГТФом, начал творить программную часть. Педаль по ссылке из начала статьи, была спроектирована за вечер. Ещё потом на следующий день 3D принтер жужжал, механику печатал. Если бы по прикидкам разработка заняла бы сильно дольше — я бы просто не начал делать эту поделку чисто из лени. Это не заказ, где «расшибись, а будь добёр», это для себя.

В общем, насчёт изделий — возможно, Вы и правы. А для поделок — коробка с дешёвыми типовыми модулями позволяет не хоронить задумки по причине того, что будет много возни, а внедрять их. Типовая схема же позволяет не тратить время на разработку однотипных, по сути, вещей каждый раз.

Причём одна пилюля уже на крыше одного завода в часах зиму пережила. Оригинальная древняя плата сдохла, начальство велело починить, а новое покупать — не хотело. Мы, опять же, с товарищем с того завода, за пару вечеров сделали свой вариант, с коррекцией от GPS… Так что эти пилюли даже по климатике оказались гораздо устойчивее, чем кажутся.

Ну и да. Насчёт грузовика. На 3D принтер я вместо штатной Ардуинки поставил именно Discovery (это было 3 года назад, тогда готовые ARM платы для принтеров не продавались). И с пеной у рта защищаю, что там нужен обязательно Cortex M4 с плавающей арифметикой. Потому что там в прошивке сплошные типы float. То есть, до маразма я не дохожу. А для некоторых вещей я пропагандирую вообще PSoC от Кипариса (в моём профиле есть море статей на эту тему). Но вот «для дома, для семьи», пилюля — почти всегда самое то. Её достал, подключил, начал творить программистские вещи. Не надо тратить время на подготовку. Закончил — оставил в поделке, ибо она дешёвая, её не жалко.
Они любят пообщаться, попытаться договориться. В каких только ситуациях я ни видел, будучи в Китае, как мои знакомые китайцы с другими китайцами договаривались! Ну, или хотя бы пытались.

С другой стороны, спор — это удар по внутренней репутации продавца. Ему там могут закрыть внутренний кредит и прочее. Он будет рад, если спор официальный не начнётся.

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

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

В общем, китайцы любят договариваться. Если это не влияет на решение проблемы — лучше начать с этого. А перейти к диспуту — всегда можно. Главное — именно сам процесс беседы. У них так принято. Поддаваться, разумеется, не стоит. Но начать лучше именно с прямого общения без привлечения администрации, но с сохранением переписки, привязав её к заказу.
С моей техникой получается вот так:

Как-то у Вас всё сложно… Было намного проще.

Я получаю десяток плат. Собираюсь проверить одну и подтвердить. Включаю — не мигает. А они поставляются прошитыми на мигание. Удивляюсь. Включаю другую — мигает. Проверяю всю партию — три дохлых. Кстати, с тех пор я больше никогда не делаю выборочных проверок, только тотальные…

Так получилось, что я общаюсь с настоящими китайцами, поэтому знаю их традиции. Так что я не стал сразу открывать диспут, а начал переписку с продавцом. Так и написал ему — просто втыкаем в блок питания через USB — семь штук мигает, три — нет. Значит, три неисправны.

Ну, а он сначала обещал пообщаться с поставщиком. Потом — спрашивает, а что ты вообще собрался делать? Я ему повторяю, что я просто собрался проверить, поэтому воткнул на питание, семь мигают, три — нет.

Тогда он начал пытать, что же я собираюсь делать, поясняя, что он мне поможет советом. А я — всё одно про то, что советом я сам кому хочешь помогу, но вот втыкаю… Дальше — несколько итераций этой пары фраз…

Через неделю он сказал, что готов или вернуть 30% денег, или прислать замену. Дальше мы договорились об условиях замены, чтобы и этому продавцу минимизировать убытки, и мне всё получить. Никаких официальных претензий, кроме переписки в рамках заказа (на которую, если что, я бы сослался, если бы открыл диспут) не предъявлялось. Но бодались — неделю.

А, ну и получение всего этого десятка я подтвердил только когда замена доехала.
Наверняка имелся в виду Scatter File. Некоторые среды разработки создают его неявно на основе свойств проекта (но тот же Keil — создаёт, только не все на этот файл обращают внимание). В свойствах проекта у KEIL на вкладке Linker можно переключиться на использование самостоятельно написанного Scatter File.

А вот в некоторых средах его обязательно надо создавать всегда. Например, при разработке Bare-Metal приложений под Альтеровские ARM ядра в среде ADS.

В нём явно или неявно (точнее, автоматически самой средой разработки), прописаны области памяти, отданные под те или иные сегменты программы (в том числе и под ОЗУ данных).

Для макетки STM32F429-DISCO (ну или DISC1) через этот механизм вполне можно раскидать, что помещать в быструю SRAM, а что — в медленную внешнюю SDRAM (опять же, если раскидать всё через свойства проекта — ну они просто неявно будут в этот файл помещены, а компилятор будет пользоваться именно им).
Помню для ДВК была программа, которая проверяла не только память, а ещё и правильность работы каждой команды ассемблера. Чую, что к необходимости этого идёт и тут. Правда, не уверен, что кто-то такое станет писать в наши дни.
Балалаечная педаль и Большая Красная Кнопка — штучные вещи. Они запущены ещё в феврале (просто публикацию решили отложить до подходящей даты — первого апреля). Мало того, если бы я их влил в эту поддельную плату — они бы там прекрасно заработали, они не требовательны к памяти.

Нынче же срочно понадобился ещё один экземпляр переходника USB-UART с поддержкой высоких скоростей UART. Посему ему нужны как можно большие размеры буферов. Вот за имеющиеся размеры кристалла С6 и вылетел (для С8 эти размеры же допустимы).
Если бы было так — стало бы хоть ясно, что производитель на чём-то там сэкономил конкретную сумму (насколько я знаю. разница цен на фирменные чипы и клоны — в 2 раза). А так — копеечная экономия и потраченные силы на перемаркировку. Казалось бы, никто на это не пойдёт… Но жизнь показывает, что пошли.
На фото к статье видно, что у меня добавлен припой на бока USB разъёма. Несколько раз разъёмы со временем откисали от перетыканий. Стал закреплять — проблема ушла. Теперь всегда перед началом работы пропаиваю, вставив кабель в разъём (иначе олово затекает внутрь, а так — штекер его не пускает). Сначала хотел также пропаивать сигнальные ноги разъёма, но они очень хлипкие. Лучше их без нужды не трогать. Время показало, что пропайки боковушек для фиксации — хватает.

Больше никаких претензий к пайке этих плат не имею.

Information

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