Однажды я работал над встроенным проектом

Что такое встроенное программирование?

Обычно, думая о программировании, люди думают о компьютерах — устройствах с клавиатурой, мышью и экраном. За последние 10 лет мы привыкли к тому, что наши телефоны во многом похожи на компьютеры. Они способны запускать приложения так же, как и обычный ноутбук. Новейшие телефоны могут быть даже более мощными, чем некоторые — не очень старые — ноутбуки. Но на самом деле, чтобы запустить программу, нам нужна только любовь и процессор. Если у нас есть эти два (и первый имеет решающее значение), мы можем запускать программное обеспечение. Любая система, имеющая процессор, но не являющаяся полнофункциональным компьютером с клавиатурой, мышью и сенсорным экраном, является встроенной системой.

Где мы можем его найти?

Ну а если вы не с поля, то удивитесь. В вашей домашней стиральной машине есть микроконтроллер, который представляет собой своего рода процессор. Итак, ваша стиральная машина — это встраиваемая система. Вы можете подумать: «Насколько сложной может быть стиральная машина?» Что ж, позвольте мне рассказать вам о случае, когда я вызвал мастера по ремонту своей стиральной машины. Чтобы решить проблему, он подключил USB-накопитель, который обновил программное обеспечение стиральной машины, скопировал файлы журналов и отправил их производителю на проверку. Конечно, речь идет не только о стиральных машинах. Холодильники, кондиционеры, автомобили, антенны сотовых телефонов — все они имеют встроенные системы.

Стиральная машина против настольного компьютера — раунд 1

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

Операционная система

Прежде всего, многие встроенные системы не имеют операционной системы. Даже для тех, у кого есть ОС, это не полнофункциональная ОС, такая как Windows. Максимум, на что вы можете рассчитывать, — это ядро ​​Linux с очень простой оболочкой. Обычно вы не можете рассчитывать на динамическое распределение памяти, виртуальную память, файловые системы и т. д. — все это функции ОС. Иногда вы можете реализовать их самостоятельно, но это дополнительная работа.

Скомпилированный язык программирования

Поскольку операционной системы нет, запустить какой-либо интерпретатор будет очень сложно. Вы должны использовать полностью скомпилированный язык. Ну, я солгал. Лично я работал над системой, в которой нам удавалось запускать Python поверх встроенного Linux и запускать код Python во встроенной системе. Но это исключение. В 99,99% случаев вам нужно, чтобы ваш код был полностью скомпилирован в машинный код.

Ресурсы

Современный сотовый телефон имеет 4 ГБ оперативной памяти и мощный четырехъядерный процессор. Большинство ноутбуков имеют нечто большее. Однако большая часть ресурсов стиральной машины направлена ​​на двигатель, водяной насос и другие компоненты, необходимые для самого процесса стирки. Что касается вычислительной мощности, вы будете счастливы, если получите 0,5 МБ ОЗУ и простой одноядерный базовый процессор, эквивалентный по мощности процессору Pentium начала 2000-х годов. Вам необходимо написать эффективный код, который компилируется в эффективный машинный код. Это исключает языки с такими функциями, как сборщик мусора или проверки границ памяти, которые приводят к неоптимальному машинному коду.

Аппаратное обеспечение

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

Как запрограммировать стиральную машину?

Итак, подведем итог — у встраиваемой системы очень мало ресурсов, нестандартное оборудование и процессор. Он не может использовать очень полезные функции интерпретируемых языков, таких как Python. Чтобы справиться с этими ограничениями, программирование встроенной системы выполняется с использованием языка C, иногда C++, хотя есть исключения. Разработчики программного и аппаратного обеспечения работают в тесном сотрудничестве, чтобы извлечь максимальную пользу из небольших ресурсов, которыми располагает система. Лично мне нравится этот вызов. Это то, о чем этот блог.

Основные типы встроенных

Как мы кратко увидели, встроенный мир очень разнообразен. Лично мне нравится делить встроенные проекты на три основных типа. Другие могут думать иначе, для этого нет жестких определений, но основная идея в основном та же.

Программирование на «голом железе»

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

Иногда у вас будут библиотеки абстракции (например, ARM CMSIS), но это очень просто. Вы работаете над такими проектами, когда у вас очень мало ресурсов и вам нужно работать максимально эффективно. Это позволяет вам не тратить даже небольшое пространство и время работы на избыточные функции и иметь полный контроль над работой оборудования.

Программирование с помощью ОСРВ

RTOS (произносится как Ar-TOS) означает Realeal Timetime Operating Ssystem. Это очень легкие операционные системы, которые обеспечивают очень мало абстракции, обычно в области управления задачами. У них есть функциональные возможности для создания задач, их синхронизации и планирования, а также безопасной передачи данных между ними. Здесь нет виртуальной памяти или изоляции обработки, как в полнофункциональной ОС. Обычно вам придется статически связываться с RTOS, как с обычной библиотекой.

Аппаратная абстракция по-прежнему остается вашей работой, но вы, скорее всего, найдете готовые драйверы для конкретной RTOS, которую вы используете. Ярким примером ОСРВ является свободная ОСРВ, но есть и множество других, со своими плюсами и минусами.

Проекты RTOS обычно имеют очень мало ресурсов, но много функций обработки данных или различных аппаратных устройств, которыми нужно управлять. Многие небольшие устройства IOT будут использовать RTOS для удобного доступа к Интернету и облаку. Хорошая ОСРВ может сделать вашу жизнь немного проще без больших затрат, но переход от проекта с «голым железом» к ОСРВ может оказаться затруднительным. Еще один компромисс, на который приходится пойти инженеру, дааааа.

Встроенные операционные системы

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

Работа со встроенным Linux выглядит и ощущается как обычный Linux. У вас есть драйверы для большинства аппаратных средств, динамического связывания, библиотек и управления процессами, изоляции и планирования. Для этой системы подходят большие системы с множеством ресурсов. Это может быть хорошей отправной точкой для программистов, желающих начать работу над встраиваемым проектом.

Сделай сам?

Из этого поста у вас может сложиться впечатление, что для того, чтобы заниматься встроенным программированием, вам нужно работать в крупной компании, обладающей возможностями разработки оборудования, и вы не можете экспериментировать самостоятельно. Ну, это не совсем так. Производители автомобилей не утруждают себя разработкой процессоров для своих автомобилей. Они покупают их у кого-то, кто имеет опыт разработки процессоров. Почему бы вам не иметь возможность купить его самостоятельно? Вы можете подумать, что это дорого, производство требует времени или что это сложно в использовании. Возможно, это было правдой 20 лет назад. Сегодня вы можете очень легко купить Arduino для проектов на голом железе или Raspberry Pi. Это небольшие комплекты для разработки, включающие плату с процессором и множество интерфейсов. Вы можете запрограммировать их самостоятельно или загрузить множество проектов с открытым исходным кодом, которые заставят их что-то делать. Вы можете использовать их для приборной панели умного дома, дешевого медиа-стримера или даже для полива своего сада. Вы можете поучиться на этих проектах и, возможно, создать что-то свое.

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