Pull to refresh
59
0

Инженер

Send message

Разбираемся с композитным видеосигналом NTSC, и стоит ли изучать его в 2025 году. Часть 2

Level of difficultyMedium
Reading time22 min
Views7.7K

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

Сигнал CVBS можно получить, используя и FPGA-решения, но стоимость их выше, чем у микроконтроллеров, таких как Raspberry Pi Pico или ESP32.

Я использовал платы разработчика на базе микроконтроллера RP2040. На рынке существует несколько таких плат. Классика — это Raspberry Pi Pico, но есть несколько китайских аналогов, например, YD-2040. Отдельно хочется выделить RP2040 Zero от Waveshare — очень компактное решение, правда у него отсутствует порт для отладки, но можно обойтись и без порта.

Важный момент — СVBS-сигнал является аналоговый, поэтому стабильность напряжение на выходе играет важную роль и для приемлемого качества сигнала китайские клоны Raspberry Pi Pico могут не подойти, так как они страдают нестабильным напряжением на выходах. Мой совет — используйте или оригинальный Raspberry Pi Pico или RP2040 Zero от Waveshare.

Желающих продолжить чтение приглашаю под кат.

Читать далее

Шпаргалка по AXI: Краткое описание интерфейса

Level of difficultyEasy
Reading time11 min
Views1.8K

Обзор интерфейса AMBA AXI на основе Introduction to AXI. Может быть полезным тем, кто хочет быстро понять основные его фишки.

Читать далее

Реверс-инжиниринг π: как Pentium считал синусы быстрее всех

Level of difficultyHard
Reading time31 min
Views8.8K

Pentium часто вспоминают из-за FDIV, но куда интереснее его «внутренний тригонометр». В этой статье — разбор FPU под микроскопом: как в constant ROM закодированы сотни коэффициентов и табличных констант, почему Intel отказалась от CORDIC в пользу полиномиальных аппроксимаций с редукцией диапазона, и как (вероятно) подбирались коэффициенты через минимакс (алгоритм Ремеза). Поговорим про компоновку ячеек ROM, BiCMOS-драйверы строк, микрокод и datapath, где биты реально встречаются с математикой. По сути — практическая археология кремния: от побитовых «полосок» на кристалле до инженерных компромиссов точности и латентности, которые сделали синус и логарифм быстрыми «на железе».

Полный разбор

«Плюсы» на термометре: греемся докладами про C++ и Linux на митапе о низкоуровневой разработке

Level of difficultyEasy
Reading time4 min
Views3K

Конец осени, первый снег и идеальный момент, чтобы заглянуть под капот системного софта. 22 ноября в Москве соберем системных инженеров, исследователей и разработчиков, чтобы обсудить, как устроены компиляторы, ядро Linux и драйверы. Митап разделен на два потока: С++ и C/Linux kernel. Регистрируйтесь и подключайтесь — офлайн или онлайн.

Читать далее

Программист embedded лезет в FPGA (часть 3, чего не может ардуинка)

Level of difficultyMedium
Reading time13 min
Views5.4K

Вначале мы поморгали диодом, затем посчитали семисегментником. Если с нуля, то уж лучше пройти эти этапы. Теперь приступим к задачке, которую с большой натяжкой можно применить где-нибудь на проде. С очень большой.

На плате, которую я использую для примера (QMTECH Cyclone 10 Starter Kit), есть разъём HDMI, что недвусмысленно намекает нам, что к нему можно подключить дисплей соответствующим кабелем. На самом деле, разъём – это не обязательно. А вот наличие на чипе выходов, которые можно сконфигурировать как lvds, очень сильно приветствуется. Возможно, получится и без этого (просто 2 выхода, формируемые из одного инверсией), но я не пробовал, потому промолчу.

Когда мы embedded-программисты, то с дисплеем мы взаимодействуем, отправляя на него команды, либо, если всё хорошо с железом, то пишем в специальную область памяти.

Мы будем работать на более низком уровне. Делать на коленке прозрачные электроды, и наклеивать поляризационные плёнки, конечно, не надо. Будем формировать видео-сигнал.

Если вы думаете, что в 2025-м году ЭЛТ мониторы и телевизоры остались в далёком прошлом, то у меня для вас есть новость: Формат сигналов внутри проводов всё ещё напоминает сигнал, который идёт на одну из сеток большой вакуумной лампы, которой, по сути и является кинескоп.

Читать далее

Я отклоняю комиты с использованием кучи и прошу коллег переписать такую логику

Reading time11 min
Views62K

Хочу поделиться своим опытом разработки крупных игровых проектов на C++, где производительность и стабильность — это не просто приятные бонусы, а абсолютно естественные требования к разработке. За годы работы над движками и играми я понял, что подход к управлению памятью очень сильно влияет на весь проект. В отличие от многих приложений - игры, особенно большие, часто работают часами без прерываний и должны поддерживать стабильный фреймрейт и отзывчивость. Когда проседание fps или фриз происходит на глазах у сотен тысяч игроков, вам уже никто не поможет — ущерб уже нанесен, а в steam полетели отзывы о кривизне рук разработчиков.

Однажды моя команда закончила работу над довольно интересным проектом, который портировали больше двух лет на плойку. Движок старый, большой и мощный, но работа с памятью была ориентирована на ПК времен конца 2000-х, и что меня поразило, так это насколько сильно большая часть кодовой базы зависела от динамической памяти во время выполнения. На ограниченном железе (далеко не у всех есть PS5 pro) и в условиях жёстких требований к сертификации на консолях такие решения быстро превращаются в проблему.

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

Читать далее

Как устроена память внутри микропроцессора и при чем тут компиляторы

Level of difficultyMedium
Reading time12 min
Views25K

Помните, как в школе, решая примеры «в столбик», мы бормотали себе под нос: «один пишем, два в уме»? У процессора при вычислениях возникает похожая ситуация — где-то нужно хранить промежуточные результаты. В современных микропроцессорах работает множество различных блоков, обрабатывающих числа, — их называют исполнительными устройствами. Чтобы все они могли временно «складывать» свои «два в уме», требуется достаточно большой объем быстрой вспомогательной памяти.

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

Читать далее

CAN-шина (Теория)

Level of difficultyEasy
Reading time14 min
Views23K

Вэтом тексте изложены базовые теоретические основы по CAN шине безотносительно к конкретному микроконтроллеру.

CAN — это двухпроводный, дифференциальный, последовательный, полудуплексный интерфейс для передачи бинарных данных между электронными платами (PCB). В качестве кабеля чаще всего применяют одну экранированную витую пару проводов с именами: CAN_L и CAN_H.

Читать далее

Как мы учим роботов ходить плавно, или Почему градиент градиента — это не опечатка, а ключ к безопасной робототехнике

Reading time8 min
Views8.8K

Привет, Хабр! Меня зовут Лёша Лещанкин, я руковожу проектом Humanoids в Яндексе. В начале 2025 года мы запустили это направление при поддержке фонда технологических инициатив компании — Yet Another Tech Fund, созданного специально для реализации новаторских идей сотрудников. Наша цель — создать гуманоидных роботов, которые смогут уверенно и безопасно работать рядом с людьми в самых разных условиях: от логистики и промышленности до сферы обслуживания.

В рамках нашего проекта мы тестируем разные RL‑модели. И сегодня расскажу об одном из методов, который позволил нам перейти от «робот дёргается и падает» к «робот ходит плавно 500 шагов подряд» — Lipschitz‑Constrained reinforcement learning.

Читать далее

Лаборатория в смартфоне: изучаем эффект Доплера на палочках в Android

Level of difficultyMedium
Reading time8 min
Views3.5K

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

Статья предназначена для девочек и мальчиков, а также их родителей.

Плывём по волнам!

Создание своего ядра на Rust

Level of difficultyHard
Reading time19 min
Views12K

В этой статье мы пройдём путь создания простого, но функционального ядра операционной системы на языке Rust.
Разумеется, мы не будем собирать полноценную альтернативу Linux, но сосредоточимся на ключевых компонентах, которые лежат в основе любого ядра.

Читать далее

Отсутствие динамической аллокации в embedded мире

Level of difficultyEasy
Reading time5 min
Views6.7K

Когда мы разрабатываем под embedded, нам приходится сталкиваться с такими флагами компиляции как -nostdlib -fno-exceptions -fno-rtti.

Во многих средах нет malloc/free (new/delete) и вообще нет встроенного выделения памяти.

Использование «больших» стандартных контейнеров C++ (например, std::vector) нередко исключено

В результате приходится решать задачу «ручного» управления памятью. Ниже рассмотрим два подхода:

Читать далее

Разработка концепции мобильного робота

Level of difficultyEasy
Reading time3 min
Views564

Хочу поделиться детялями процесса разработки мобильного робота. В мае этого года наши инженер-конструктор и продуктовый дизайнер завершили первую версию дизайна робота Robonine V1. Я хочу пошагово показать, с чего мы начали и к какому варианту пришли на текущий момент. В статье будут представлены часть деталей без изменений, в том виде, в котором они были отправлены специалисту. Не все изначальные требования будут реализованы, а где-то концепция в процессе проектирования претерпит изменения. В статье я буду давать комментарии по ключевым моментам.

Читать далее

Разработка автономного робота для навигации по городу

Level of difficultyEasy
Reading time2 min
Views1.5K

Как мы взяли первое место на Кубке РТК "Высшая лига" с TurtleBot3 на ROS2

В рамках регионального этапа хакатона “Кубок РТК: Высшая лига”, который проходил 24-25 мая в Москве, наша команда misis_robo_family разработала автономного робота с функцией распознавания дорожных знаков и возможностью следовать по маршруту, используя эти знаки. Этот проект объединил в себе современные технологии компьютерного зрения и автономной навигации.

Читать далее

Использование библиотек для программирования ПАК Рудирон

Level of difficultyEasy
Reading time24 min
Views687

Продолжим серию статей про ПАК «Рудирон» и его программирование. Сегодня мы осветим тему использования библиотек при создании своего программного обеспечения.

Библиотеки являются мощным инструментом при работе с проектами. Особенно когда используются внешние модули, подключенные к Рудирону. Библиотека – файл или набор файлов, к котором используется такой же код по синтаксису, как и в основном тексте программы. Можно подключить библиотеку в свой код и использовать тот функционал, который она нам в этом случае предоставляет, а вариантов там может быть очень много: готовые функции высокого уровня для работы с внешними датчиками, различными модулями, экранами и т.п., для работы с внутренней периферией микроконтроллера (часы, таймеры, АЦП), библиотеки различных математических функций и многое другое, всего и не перечислить. Для опытного программиста это способ сократить время разработки программы, а для начинающего – готовые рабочие примеры работы с внешней периферией.

Преимущество работы с библиотекой заключается в том, что нам необязательно знать, как функционирует устройство на низком уровне и как работает код, который обеспечивает эти функции, мы просто пользуемся готовыми функциями, которые предоставляет разработчик этой библиотеки. Ко многим библиотекам есть описание/документация и примеры использования, на базе которых можно понять, как использовать данную библиотеку.

Шаблоны и примеры проектов ПАК Рудирон размещены в репозитории: https://gitflic.ru/project/akvarius-rudiron/rudiron-projects

Читать далее

l9ec: волшебный патч ядра Linux

Level of difficultyMedium
Reading time10 min
Views21K

Если вам неудержимо хочется использовать оборудование из музея для современной разработки — статья специально для вас.

Читать далее

Разработка DIY компьютера на базе FPGA

Reading time12 min
Views17K

Желание поиграть в проектирование собственного процессора обычно приводит к покупке платы с FPGA. Но мне захотелось сделать шаг дальше и начать не с Verilog-а, а с паяльника.

Это статья о том, как я занялся разработкой электроники, не имея почти никакого опыта в этой сфере. Цель - сделать устройство с FPGA на котором можно загрузить Linux, подключить экран и клавиатуру, а потом прямо там писать и компилировать код.

Зачем это нужно? Это хобби. Практической ценности не имеет. Просто я так развлекаюсь. А сейчас у меня, к моему собственному удивлению, все задуманное получилось, и я хочу показать и похвастаться.

Читать далее

От космической баллистики до kernel bypass — все, что вы хотели знать про C++ и Linux

Level of difficultyEasy
Reading time5 min
Views5K

Заходят как-то в лофт разработчик на С++, доктор математических наук и инженер-программист Linux kernel — и вместо шутки начинается System Level Meetup. 24 мая в Санкт-Петербурге соберутся те, кто пишет код на уровне железа, оптимизирует ядро Linux и проектирует архитектуру сложных систем. Два трека — C++ и Linux kernel, десятки докладов, живое общение, стенды, квесты и железо от YADRO. Регистрируйтесь и подключайтесь — онлайн или офлайн.

Читать далее
1
23 ...

Information

Rating
Does not participate
Registered
Activity

Specialization

Embedded Software Engineer
Middle
Linux
C
C++
Embedded Linux
Embedded system
Real-time operating system
Python
English
Assembler
Programming microcontrollers