Доброе утро, Шэньчжэнь. На улице 19 градусов, плохое качество воздуха, высокая активность дронов, льет дождь и светит солнце. Все это я узнал от умной наружной камеры; мне же светят лишь холодные офисные лампы. Я мог бы торговать электроникой на рынке Хуачанбей неподалеку. Но у меня есть инженерное образование, мой воротничок белоснежен, и с сегодняшнего дня я работаю в Longteng Electronics.Так начинается SHENZHEN I/O — головоломка, где нужно заниматься аппаратной разработкой и программированием микроконтроллеров. Выполнять разные ТЗ с помощью имеющихся компонентов и стремиться к экономии по всем возможным направлениям. У реального меня, автора этой статьи, инженерного образования нет. Я лишь окончил базовый онлайн-курс схемотехники и написал об этом три статьи. Поможет ли это здесь? Не уверен. Доедаю воображаемый баоцзы и открываю почту сотрудника. Читать далее
Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели12K
Доброе утро, Шэньчжэнь. На улице 19 градусов, плохое качество воздуха, высокая активность дронов, льет дождь и светит солнце. Все это я узнал от умной наружной камеры; мне же светят лишь холодные офисные лампы. Я мог бы торговать электроникой на рынке Хуачанбей неподалеку. Но у меня есть инженерное образование, мой воротничок белоснежен, и с сегодняшнего дня я работаю в Longteng Electronics.
Так начинается SHENZHEN I/O — головоломка, где нужно заниматься аппаратной разработкой и программированием микроконтроллеров. Выполнять разные ТЗ с помощью имеющихся компонентов и стремиться к экономии по всем возможным направлениям. У реального меня, автора этой статьи, инженерного образования нет. Я лишь окончил базовый онлайн-курс схемотехники и написал об этом три статьи. Поможет ли это здесь? Не уверен. Доедаю воображаемый баоцзы и открываю почту сотрудника.

Меня уже ждет пачка приветственных писем от президента, вице-президента, продакт-менеджера и других коллег. Узнаю́, что Longteng Electronics — «мировой лидер индустрии» и что нормального сыра в Шэньчжэне не найти. А в списке ценностей компании, помимо усердия и связей, вижу загадочное salubriousness — что-то типа «здоровой атмосферы» в широком смысле. CEO Ванг Ёнгхонг призывает меня корректно питаться, корректно себя вести и корректно думать.
Чтобы корректно думать, мне послан даташит. PDF-файл открывается не в интерфейсе игры, а параллельно в просмотрщике как обычный документ. Каков реализм.

Начинается даташит с инструкции по печати в лучших традициях канцелярского дела — с разделителями, обложками и спецификацией для папки-регистратора. Хм, а ведь даташит на бумаге может быть удобен, он всего 47 страниц занимает.
После инструкции по печати даташит открывает нам предысторию через письма — классика видеоигр. «Я помню, что ты хотел без релокации, но у нас в стране проблемы с вакансиями инженеров. Может, подумаешь о работе в Китае?» — предлагает рекрутер Марджи Фиш в первом письме. «Longteng Electronics — стабильная компания, сейчас расширяют штат своих инженеров, у тебя будет хорошая зарплата и макдак в городе», — подхватывает Джесси Хуанг.
На этом нехитрая арка протагониста завершена. Давайте уже поработаем.
Муляж камеры наблюденияПроще говоря, коробка с двумя светодиодами — вот мое первое задание. Первый диод должен мигать строго равномерно, второй — более хаотично, но тоже в соответствии с таймингами во вкладке верификации:

Для работы у меня есть две платы и два контроллера MC4000 по 3 юаня за штуку. Внизу автоматически подсчитывается стоимость компонентов в решении — возможно, это станет ограничением в будущем. Но пока думать об этом рано.
Контроллер MC4000 поддерживает протоколы Simple I/O и XBus. Первый — это непрерывный аналоговый сигнал с уровнем от 0 до 100, который можно читать и писать без каких-либо условий. Второй — это шина для обмена данными между микроконтроллерами, где обе стороны должны согласовать передачу данных — по назначению ей близок I2C (Inter-Integrated Circuit).
Для первого задания мне будет достаточно Simple I/O. Нахожу в даташите пример кода для сигнала с чередованием уровней 0 и 100 в равных периодах.

Вот так я повторил опорную осциллограмму. Или референсную вейвформу… это же одно и то же? После нескольких прогонов в симуляции мне предложили пройти в почту за следующим заданием. Также игра составляет таблицу рекордов — решений моих друзей в Steam, расставленных по дешевизне, потреблению энергии и строкам кода. Один из френдов потратил не 60 единиц энергии, а 59! За прогон у него получилось на одну инструкцию меньше, странно, прогоны же одинаковые…
Вслед за вторым заданием пришло письмо от Джи Чжана, главного инженера — в исходнике chief staff engineer. Дочка Джи разработала карточную игру, вариацию солитера на картах маджонга. И конечно, нам всем добровольно-принудительно нужно ее потестировать.

Разложил удачно один раз — и задача выполнена, иконка солитера осталась на рабочем столе. Теперь я могу виртуально бездельничать на своей виртуальной работе.
Модуль усилителя сигналаСледующее задание — «отличная возможность познакомиться с input». Есть входной сигнал, а есть сигнал, который нам нужно отдать.

Я добавил контроллер MC4000, соединил его с p-портами протокола Simple I/O. Чтобы получить нужный сигнал, достаточно удвоить исходный. Здесь и далее я буду добавлять комментарии на русском языке только для статьи: в игре они просто не влезут в окошко.
mov p0 acc // переместить значение со входа p0 в регистр acc
mul 2 // умножить значение в регистре на 2
mov acc p1 // переместить значение в регистре на выход p1
slp 1 // подождать один циклКажется, сложнее всего здесь разобраться в инструкциях и операндах. Но для меня постоянной ошибкой стала Part not sleeping! Я игнорировал эти три слова и снова лез в инструкции, хотя надо было всего лишь добавить последнюю строчку кода. Неспроста в мануале ей посвящена отдельная страница:

Добро пожаловать в аппаратную разработку!
Генератор пульсирующего сигналаУра, теперь мне доступны все компоненты в игре. Следующее задание открывает мне conditional execution — предикацию. Когда нажата кнопка, нужно передавать пульсирующий сигнал, когда не нажата — не передавать.
teq p0 100 // сравнить значение на входе со 100 (уровень сигнала нажатой кнопки)
+ mov 100 p1 // передача пульсирующего сигнала, если условие сработало
+ slp 1
+ mov 0 p1
+ slp 1
- mov 0 p1 // передача нулевого сигнала, если условие не сработало
- slp 1Это задание сначала не получалось, потому что я ставил знаки предиката — плюсы и минусы — только перед первой, а не перед каждой строкой условия. Интересно, почему мне не показалось это очевидным с самого начала? Может, будучи редактором, я воспринимал блоки инструкций как абзацы текста, а плюс и минус — просто как маркеры нового абзаца, типа «перевод строки и заглавная буква».
Если ваши знания об аппаратной разработке уже не сопоставить с требованиями SHENZHEN I/O, то, может, больше заинтересуют вакансии?
Поток инструкций линеен, так что при предикации процессор всегда тратит ресурсы на обе ветки, но применяет только ту, к которой приводит условие. Альтернатива предикации — это предсказатель переходов: на основе истории процессор выбирает одну из веток и идет по ней, а при ошибке откатывается и идет по другой ветке с потерей производительности. Промахи дорогие, но редкие, так что ущерб для средней производительности невелик.
Путь между предикацией и предсказателями у реальных процессорных архитектур складывался по-разному. ARM начинала с предикации — SHENZHEN I/O воспроизводит всё довольно близко к ARM32, — но в AArch64 оставила ее лишь точечно.В x86 и RISC-V предикации не было изначально: в одной она появилась в 1995 году как точечная, в другой существует как опциональное расширение.

После этого задания мне пришел первый спам. Из России! Полет на орбиту за тысячу баксов!
Световая вывескаТеперь от меня требуют контроллер световой вывески для известной киберспортсменки THE SOLID STEEL GAMER. На вывеске она пьет содовую и кликает мышкой, параллельно мигает никнейм. Все это мой продакт-менеджер хочет подешевле, чтобы у нас наверняка купили большую партию.
Задание простое: воспроизведи пять паттернов в коде на пяти контроллерах. Но я помню, что нужно сделать дешевле, и такая возможность есть. В контроллере MC4000 за 3 юаня всего 9 строк памяти, и этого недостаточно, чтобы повторить один из сигналов линейно. Но с помощью цикла я вмещаю сигнал ровно в девять строк — и обхожусь без более дорогого MC6000 на 14 строк памяти. Экономлю 2 юаня!
mov 0 p1 // это уникальная часть сигнала
slp 7
mov 100 p1
slp 2
loop: mov 0 p1 // а это повторяющаяся, которую пришлось бы прописывать трижды
slp 8
mov 100 p1
slp 2
jmp loopЭкономим дальше: вместо одного из MC4000 для click-сигнала ставим простейший инвертор за 1 юань и дублируем через него сигнал соседнего click-контроллера. Еще 2 юаня экономии, и в сумме я наоптимизировал почти на четверть изначальной стоимости!

Разные сочетания сигналов формируют разные положения киберспортсменки
Замена контроллера на инвертор также помогла сэкономить место на плате. В этом задании проблем бы не возникло, но в будущем это может стать интересным ограничением. Поворачивать компоненты на плате, кстати, нельзя.
Миску риса этому инженеруВ следующем ТЗ прямым текстом говорится, что мне нужно использовать XBus — второй протокол в игре, передающий дискретные значения. Буду разбираться в следующей статье. А пока потренируюсь в произношении слов Shenzhen и yuan, как советует свежая рабочая рассылка для экспатов…
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Особенности разработки встраиваемого программного обеспечения. Часть 1 | 0 | 8.47 | 01-10-2026 |
| 2 | Пост №6390257 | 0 | 9.56 | 28-09-2026 |
| 3 | Собираем полигон для пилота — или тестовая среда для РЕД АДМ в песочнице | 0 | 6.26 | 29-09-2026 |
| 4 | Как мы сделали школу айтишников внутри Росатома | 0 | 8.19 | 29-09-2026 |
| 5 | Симулятор микропроцессоров: запускаем BASIC и не только | 0 | 8.4 | 29-09-2026 |
| 6 | Найм уровня undefined | 0 | 9.12 | 02-10-2026 |
| 7 | Составное устройство USB на AT32. Часть 1: Подготовка | 0 | 11.38 | 01-10-2026 |
| 8 | Инженерная тайна AMD из нулевых: что общего между Xbox 360, HTC HD2, Sony Ericsson Xperia Play и LG Optimus L2 | 0 | 8.47 | 03-10-2026 |
| 9 | Почему завод превращает электронику в тыкву. Как защитить промышленные контроллеры от электромагнитных бурь | 0 | 7.2 | 27-09-2026 |