Доброе утро, Шэньчжэнь. На улице 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 в регистр accmul 2 // умножить значение в регистре на 2mov acc p1 // переместить значение в регистре на выход p1slp 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 7mov 100 p1slp 2loop: mov 0 p1 // а это повторяющаяся, которую пришлось бы прописывать трижды slp 8 mov 100 p1 slp 2 jmp loop
Экономим дальше: вместо одного из MC4000 для click-сигнала ставим простейший инвертор за 1 юань и дублируем через него сигнал соседнего click-контроллера. Еще 2 юаня экономии, и в сумме я наоптимизировал почти на четверть изначальной стоимости!
Замена контроллера на инвертор также помогла сэкономить место на плате. В этом задании проблем бы не возникло, но в будущем это может стать интересным ограничением. Поворачивать компоненты на плате, кстати, нельзя.
Миску риса этому инженеру
В следующем ТЗ прямым текстом говорится, что мне нужно использовать XBus — второй протокол в игре, передающий дискретные значения. Буду разбираться в следующей статье. А пока потренируюсь в произношении слов Shenzhen и yuan, как советует свежая рабочая рассылка для экспатов…
ссылка на оригинал статьи https://habr.com/ru/articles/1091152/