Сегодня я начну рассказывать, как изучал протокол программного управления блоком питания Fnirsi DPS 150. До подробного описания всех команд и откликов мы в этот раз, правда, не дойдём, но зато рассмотрим шаги, которые обязательно в итоге приведут нас к успеху. То есть, эта часть – не руководство, как программировать блок, а описание, как вскрывался протокол. Кому это интересно – начинаем.
TinyML, исполнение нейросетей на микроконтроллерах
Будущее наступило, восстание машин уже идёт. Просто ползучим методом
Я простой системный программист. В нашем низкоуровневом мире царит красота и порядок. А если что-то этот порядок нарушает, то всегда под рукой есть отладчики (включая аппаратные) и всякие измерительные приборы. С их помощью, проблему можно быстро найти и устранить.
Но так получилось, что довелось мне заглянуть в мир ИИ не через популярные статьи, а покопаться во всём руками… И пообщаться с теми, кто там давно копается… Тут-то и полезли в голову разные интересные мысли. Возникло у меня ощущение, что восстание машин уже идёт, но оно не такое, что разом все машины восстали, а просто имеется медленный и незаметный процесс. О том, что я вижу и какие, как мне кажется, есть пути решения, сейчас и буду рассказывать.
В погоне за скоростью. Оптимизация нейросетевых вычислений на процессоре К1967ВН044 компании «Миландр»
Поскольку теперь будут появляться примеры кода на ассемблере, придётся хотя бы в общих чертах его понимать. Как было совершенно справедливо отмечено, данный процессор является развитием архитектуры TigerSHARC, так что программисты, знакомые с ним, без труда узнают этот код. Для тех, кто не имел с ним дела, можно порекомендовать «Руководство по программированию» (https://ic.milandr.ru/upload/iblock/77f/77fac90e79704374aaccc4b44f3244d6.pdf), в котором дано подробное описание всех возможностей процессора, причём с учётом многочисленных доработок, выполненных фирмой «Миландр».
Впрочем, основные идеи кочуют из одного DSP в другой, так что такие особенности, как наличие большого количества регистров, выполнение операций с данными только на регистрах, «хитрые» инструкции и т.д. не должны вызвать удивления. Кроме того, по ходу дела будут даваться краткие пояснения.
Почему может не работать отладка на плате XIAO BLE
Но что нам стоит восстановить загрузчик? С сайта производителя был скачан актуальный HEX-файл, он был залит в плату… Дальше был собран типовой демо проект Blinky… И вечер перестал быть томным, так как проект не запустился на отладку.
Почему именно он не запустился, как я это выявлял, и как с этим бороться, будет рассказано в этой статье.
Второе рождение DSP или запуск нейросетей на процессорах К1967ВН044 от «Миландр»
И если для первых логично использовать специализированную аппаратуру, то вторые вполне могут работать на обычных микроконтроллерах.
В этой статье поделюсь нашим опытом запуска нейросетей на DSP процессоре фирмы «Миландр» К1967ВН044, тем более что в новой ревизии появился Ethernet и можно организовать быстрый обмен данными, например, с ПК.
Нейросетевой чип с интерфейсом, привычным Embedded программисту
В сегодняшней статье (которая, надеюсь, разрастётся до цикла) всё несколько иначе. Поделка сама нашла меня. Её разрабатывают в другом отделе нашей же компании. Но именно в соседнем отделе, не в моём. Как она устроена внутри, мне знать не положено. Зато я могу, вдобавок к чтению документации, не просто расспрашивать авторов про пользовательский интерфейс, а ещё и давать им советы, как его изменить.
Речь пойдёт про чип, который по задумке разработчиков должен помочь Embedded-программистам начать работу с Искусственным Интеллектом, не погружаясь в его недра, а оперируя только привычными им сущностями. Давайте разбираться более детально.
Контроллер CH579. Начинаем работу и избавляемся от закрытой сетевой библиотеки
Сегодняшняя статья – не восклицание: «Смотрите, какой мне красивый проц попался». Это скорее просто упорядочивание накопленных сведений о конкретном процессоре CH579. Вдруг кому пригодится. Ну, и, если через годы мне потребуется, я сам буду восстанавливать знания по этой статье. Просто так получилось, что по проекту Заказчик велел освоить его… Это недорогой микроконтроллер на базе ядра Cortex M0. После освоения Заказчик же и сказал, что мы всё будем делать на китайском клоне STM32. Характеристики же самобытного CH579 он признал недостаточными.
Но с другой стороны… Сегодня эта микросхема стоит 120-150 рублей за штуку на Ali Express. А у неё имеется не только встроенный PHY для десятимегабитного Ethernet, но и всё для работы по BLE. По-моему, не самая плохая цена. Кажется, для Интернета вещей может пригодиться. Но это цены за микросхему. Макетки безобразно дороги.
Ещё на многих форумах народ возмущается, что сетевая библиотека для этого контроллера поставляется не в виде исходных кодов. Китайцы отвечают, что они не собираются ничего менять. Наш Заказчик тоже возмущался. Поэтому в статье я покажу, каким путём мы шли, чтобы сделать исходный код. Любой сможет повторить этот путь буквально за пару дней. Там скорее обидно, чем сложно.
В общем, сегодня мы пробежимся по работе с китайским контроллером CH579. Будет немного практических сведений и немного мемуаров, как пришлось вскрывать библиотеки.
Сразу три причины, из-за которых контроллер GD32F450 теряет UDP пакеты
Подключаем Master устройство на шину Wishbone в системе LiteX
Давно я ничего не писал про LiteX. Во-первых, очень много работы. Во-вторых, пришлось почитать курс студентам, подготовка тоже дико отвлекала, но наконец семестр подходит к концу. Ну, и в-третьих, в своих опытах я на пару шагов дальше того, что описываю, и вот эти опыты меня затянули. Пока что там всё выглядит достаточно мрачно. Производительность там такая, что плакать хочется. В общем, было трудно прерваться, чтобы описать то, что находится ещё на гарантированно светлой стороне. Но если вы читаете эти строки, то я себя пересилил.
Я уже многократно писал, что рассматриваю LiteX как некий аналог подсистемы Qsys из среды разработки Quartus. То есть, как удобное средство составить шинно-ориентированную систему из множества готовых ядер. Но если Qsys – он только для Альтер, то LiteX – он подходит и для Altera (Intel), и для Xilinx, и для Lattice. А сейчас я по работе плотно вожусь именно с Латтисами. У Латтисов самое узкое место – это параметр FMax. И вот построение базовых систем на базе шины Wishbone у Litex получается очень красиво. Там FMax выходит достаточно высоким. Даже у Латтисов он превышает 100 МГц.
В предыдущих статьях мы уже научились добавлять в систему устройства, доступные по шине через регистры команд-состояний (CSR), а также пассивные (Slave) устройства с шиной Wishbone. Сегодня мы добавим на шину активное (Master) устройство. Поехали!
Собираем компилятор для ПЛИС Lattice ECP5 в лице Yosys и NextPNR для работы в ОС Windows
Наш цикл про ПЛИС Lattice ECP5 растянулся уже на шесть статей. Мы уже научились не только создавать простые проекты для них, но набили руку в разработке сложных систем на базе кроссплатформенной открытой среды LiteX. В целом, я уже набрал материалов, чтобы выдать инструкцию, как подключится к шине Wishbone в роли активного устройства (Master), но перед публикацией хочется провести ряд проверок, чтобы не наболтать не того.
С другой стороны, ещё в первой статье цикла я обещал, как будет формализована методика сборки синтезатора Yosys и разводчика NextPNR под Windows, рассказать, как это сделать, так как на тот момент у меня процесс сборки прошёл в режиме «неделю промучился, как-то сделал, повторить не смогу». Мой коллега систематизировал все те наброски, и теперь я могу поделиться итогами с общественностью. Так что, кто дружит с Linux, сегодня вряд ли узнает что-то интересное, а вот любители Windows – получат сведения, как начать работать с ПЛИС Lattice в этой ОС. Приступаем.
Подключаем Slave-устройства с шиной Wishbone к системе на базе LiteX
В предыдущих трёх статьях мы построили ПЛИС систему на базе LiteX, рабочие блоки для которой могут быть написаны не на странном языке, базирующимся на Питоне, а на чистом Верилоге. А благодаря LiteX, база для системы была создана для нас автоматически. Такой подход позволяет резко упростить и ускорить процесс разработки систем.
Пока что наши собственные модули были подключены к системе через регистры команд и состояний (CSR). Часто этого более, чем достаточно, но иногда всё-таки разрабатываемые блоки должны содержать в себе сложные наборы регистров, а может даже и память. И без прямого подключения к системной шине не обойтись.
Сегодня мы подключим пару собственных Slave-устройств к системной шине Wishbone, которая будет создана средой LiteX. Устройства, разумеется, будут описаны на Верилоге. Приступаем!
Наводим красоту в коде для ПЛИС Lattice, построенном на базе пакета LiteX
Сегодня мы поменяем принцип описания ножек, чтобы не пришлось прыгать по трём справочникам сразу, разместим несколько полей в одном регистре CSR, добавим автодокументирование к регистрам CSR (Command-Status Register) и, наконец, добавим к этим регистрам статус, а то до сих пор мы пробовали играть только в командные регистры. Приступаем.
Первые эксперименты со смешанным Litex+Verilog проектом для ПЛИС
В предыдущей статье мы начали осваивать построение шинно-ориентированных систем на базе среды Litex (которая всё делает на Питоне) с внедрением собственных модулей на Верилоге. Статья так разрослась, что практические опыты мы оставили на потом. Пришла пора провести их. Сегодня мы подключимся к VGA-монитору и поуправляем изображением, которое выдаёт модуль gpu, описанный в файле gpu.v, то есть, реализованный на языке Verilog. Управлять мы им будем через регистр команд, расположенный в блоке CSR, спроецированном на шину Wishbone. Все эти сущности, в свою очередь относятся к среде Litex. Инструменты для опытов мы тоже будем использовать штатные, Litex-овские. Приступаем!
Создаём простейший проект для ПЛИС Lattice в среде Litex
В предыдущей паре статей я рассуждал про ПЛИС Lattice. Давайте сегодня поговорим об эффективной разработке под них. Один наш крупный руководитель уверяет, что из разговоров с иностранными Заказчиками, он выяснил, что российских разработчиков считают пишущими классные вещи, но делающими это крайне медленно. Ну, разумеется, по сравнению с разработчиками из других стран. И разумеется, «классные» идёт на первом месте.
Один из методов обхода проблемы скорости разработки – использование готовой инфраструктуры для проектов. Я делал цикл статей про комплекс Redd, где продвигал использование готовой шинной инфраструктуры в среде разработки Quartus. Сначала это была честная процессорная система, потом – процессор мы изъяли, а шины – оставили.
Затем я делал пару циклов, где активно использовал данный подход. Мне приходилось дописывать только проблемно-ориентированные модули, остальное — среда разработки создавала за меня.
Есть ли что-то подобное для Lattice в частности и сцепки Yosys/NextPNR в целом? Вы не поверите! Решение не просто есть, но оно ещё и настолько кроссплатформенное, что подойдёт и для Yosys/NextPNR, и для Quartus, и для Vivado! И называется оно Litex. Итак, давайте попробуем поэкспериментировать с ним для подхода, который я уже давно продвигаю: «делаем штатную основу, а на неё нанизываем свои целевые блоки».
Синтезируем SystemVerilog код в OpenSource среде Yosys/NextPNR
В предыдущей статье я поделился опытом работы с ПЛИС фирмы Lattice через инструменты с открытым исходным кодом Yosys и NextPNR. Как я отмечал, освоить их меня заставило не столько любопытство, сколько требования Заказчика. В том проекте у меня просто не было выбора. И та статья, скорее, была написана в помощь для быстрого старта тем, кого тоже заставят. А можно ли использовать эту сцепку для дома, для семьи? Для этого она должна быть удобной.
Как мы обсудили в комментариях к прошлой статье, в минусы этой сцепке можно записать отсутствие такого полезного инструмента, как SignalTap (Altera) или ChipScope (Xilinx). Замену этой парочке пока что удалось найти только в виде физического анализатора. Так себе замена, но хоть что-то.
Более серьёзная трудность заключалась в том, что все примеры, которые я находил, были реализованы на чистом Верилоге. А я уже не могу писать автоматы, не используя такой механизм, как enum. Меня каждый раз злит необходимость перенумеровывать состояния, если я правлю автомат по ходу разработки. Но чтобы был enum, надо пользоваться более прогрессивным стандартом языка, который уже называется SystemVerilog.
На странице Yosys YosysHQ/yosys: Yosys Open SYnthesis Suite (github.com) описано, что данный язык ограниченно поддерживается синтезатором, и даже указана опция для его использования. А именно сказано, что команде read_verilog надо добавить ключ –sv. Но попытки найти в сети готовую инструкцию для новичков, как её активировать, я не нашёл, потому что если кто-то и пользуется этой командой, то для одного файла, а не для списка.
Наконец, я разобрался, поэтому делаю такую инструкцию, чтобы любой желающий смог быстро найти готовое решение.
Экспериментируем с ПЛИС семейства ECP5 фирмы Lattice
Когда я видел на Хабре упоминание о ПЛИС Lattice, у меня всегда возникал простой вопрос: «А зачем ещё одна ПЛИС?». Вроде всю жизнь хватало пары базовых. Но полгода назад случилось то, что сняло этот вопрос для меня. Пришёл Заказчик и сказал: «Мы делаем проект на ECP5». Против требований Заказчика не попрёшь!
А пока я осваивал работу с этим железом и пытался понять, как обосновать необходимость попробовать то же самое для остальных, мой знакомый, ныне живущий в Штатах, обрадовал новостью, что у его любимого поставщика подходит к концу запас десятых Циклонов и шестых Спартанов. В целом, через три года будет построен новый завод Intel, но что именно там будут производить, он не в курсе. И три года продержаться в любом случае, будет нужно. Короче, сейчас надо иметь возможность быстро мигрировать с одной ПЛИС на другую.
Итого, вчера делать ознакомительную статью про Lattice было рано, завтра – может быть поздно.
Сегодня я расскажу, где купить более-менее дешёвые платы для опытов, как быстро освоить Open Source среду разработки и какие готовые проекты осмотреть в первую очередь.
Работаем с сетевыми адаптерами через Pcap-драйверы
В целом, конкретно на Хабре наверняка найдётся много специалистов, которые знают, как это сделать. Но вот так получилось, что когда мне показали очень простое и удобное решение, я опросил своих коллег и выяснил, что о нём знает только тот, кто мне рассказал, да и тот уже забыл все детали. Он просто проект выдал и сказал, мол, делай по образу и подобию. И к уже материалам, имеющимся там, пришлось кое-что искать ещё в сети.
В общем, думаю, имеет смысл свести все сведения воедино. Кому интересно – приступаем!
Руководство по выживанию для создателей нейрочипов
В 2018 году мы взялись за первый большой контракт по созданию инструментов разработки для нейропроцессора. В то время я знал, что рынок AI быстро растёт и на нём существуют сотни компаний. Но я не подозревал, что к 2021 году на рынке возникнет ещё пара сотен новых чипмейкеров, разрабатывающих акселераторы для AI, что мы станем AI-партнёром Arm, а наши проекты с нейрочипейкерами вырастут в отдельное направление. Не уверен, что вопрос, который поднимаю, актуален для российской аудитории: не так много в России компаний (откровенно говоря – мало), которые выпускают собственные ускорители для нейросетей. Скорее, эта статья — попытка зафиксировать знания, которые мы получили на американском рынке в результате нескольких проектов и около сотни бесед с чипмейкерами. Но если эта статья нанесёт кому-то непоправимую пользу, буду очень рад.
Пересаживаем NXP-шный пример для Teensy 4.1 на язык C++
Когда я программирую в среде разработки Keil, чтобы сменить язык, достаточно переключить его в свойствах конкретного исходного файла. В цикле статей про NIOS II я просто переключал язык, изменив расширение файла с *.c на *.cpp. (Со всеми деталями это показано тут ; не как новинка, а как рутина — тут). Увы, в нашем случае так не получится. И количество действий, которое следует совершить, тянет на небольшую статью. Вот её я сейчас и напишу. Итак, давайте разбираться, что там к чему…
Генерация перемещаемого кода для процессоров ARM в компиляторе LLVM
Процесс обновления «прошивки» для микроконтроллера – опасная вещь. Раньше при обновлении «прошивки» любой аппаратный сбой приводил к тому, что устройство превращалось в кирпич. В наше время часто имеется начальный загрузчик, который позволит произвести процесс обновления заново, но до того, весь функционал устройства будет потерян. Пока не будет завершено обновление, работать оно уже не будет. Самым красивым способом является использование двух областей для размещения «прошивки» — основной и запасной. На рисунке ниже это красная и синяя области. Исходно активная красная, а обновление будет загружаться в синюю. Сбой загрузки не страшен. Если он произойдёт, управление останется у красной области. При успехе операции, активной станет синяя область, а новое обновление будет загружаться в красную. Ну, и так далее. Каждое обновление будет приводить к рокировке.
К сожалению, в системах Cortex M такой путь напрямую невозможен. Программа привязана к абсолютным адресам и не может исполняться в произвольном месте. С чем это связано и как мы сделали её перемещаемой, подправив компилятор LLVM, рассказано в данной статье.
Information
- Rating
- 126-th
- Location
- Санкт-Петербург, Санкт-Петербург и область, Россия
- Registered
- Activity