Введение

Компьютерное программное обеспечение, разработанное для управления машинами, которые обычно не рассматриваются как компьютеры. Встроенное программное обеспечение – это компьютерное программное обеспечение, предназначенное для управления машинами или устройствами, которые обычно не считаются компьютерами, и широко известное как встроенные системы. Оно, как правило, специализировано под конкретное аппаратное обеспечение, на котором работает, и имеет ограничения по времени и объему памяти. Этот термин иногда используется как синоним термина "прошивка". Отличительной и устойчивой особенностью является то, что функции встроенного программного обеспечения инициируются и управляются не через пользовательский интерфейс, а посредством машинных интерфейсов. Производители интегрируют встроенное программное обеспечение в электронику автомобилей, телефонов, модемов, роботов, бытовой техники, игрушек, систем безопасности, кардиостимуляторов, телевизоров, приставок и цифровых часов, например. Такое программное обеспечение может быть очень простым, например, система управления освещением, работающая на 8-битном микроконтроллере с несколькими килобайтами памяти, где подходящий уровень сложности обработки определяется с использованием фреймворка "Вероятно, приблизительно корректных вычислений" (методология, основанная на рандомизированных алгоритмах). Однако встроенное программное обеспечение может быть очень сложным в таких приложениях, как маршрутизаторы, элементы оптических сетей, самолеты, ракеты и системы управления технологическими процессами.

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

В отличие от стандартных компьютеров, которые обычно используют операционные системы, такие как macOS, Windows или Linux, встроенное программное обеспечение может обходиться без операционной системы. Если же она используется, то выбор может быть сделан из широкого спектра операционных систем, чаще всего – операционных систем реального времени. Код для встроенного программного обеспечения обычно пишется на C или C++, но различные языки программирования высокого уровня, такие как Java, Python и JavaScript, также всё чаще применяются для микроконтроллеров и встраиваемых систем. Языки ассемблера также часто используются, особенно при загрузке системы и обработке прерываний. Ada применяется в некоторых военных и авиационных проектах.

Отличия от прикладного программного обеспечения

Большинство потребителей знакомы с прикладным программным обеспечением, которое обеспечивает функциональность на компьютере. Однако встроенное программное обеспечение часто менее заметно, но не менее сложно. В отличие от прикладного программного обеспечения, встроенное программное обеспечение имеет фиксированные аппаратные требования и возможности, а добавление стороннего оборудования или программного обеспечения строго контролируется. Встроенное программное обеспечение должно включать все необходимые драйверы устройств на этапе производства, и эти драйверы устройств разрабатываются для различных аппаратных устройств. Эти драйверы устройств, называемые BSP (Board Support Package – пакет поддержки платы), формируют слой программного обеспечения, содержащий специализированные драйверы аппаратного обеспечения и другие подпрограммы, которые позволяют определенной операционной системе (традиционно операционной системе реального времени, или RTOS) функционировать в конкретной аппаратной среде (компьютере или карте процессора), интегрированной с самой RTOS. Программное обеспечение сильно зависит от выбранного процессора и конкретных микросхем. Большинство инженеров, разрабатывающих встроенное программное обеспечение, хотя бы поверхностно умеют читать принципиальные схемы и спецификации компонентов для определения использования регистров и системы обмена данными. Полезно уметь выполнять преобразование между десятичной, шестнадцатеричной и двоичной системами счисления, а также использовать побитовые операции. Веб-приложения часто используются для управления оборудованием, хотя XML-файлы и другие данные могут передаваться на компьютер для отображения. Обычно используются файловые системы с папками, однако базы данных SQL часто отсутствуют. Разработка программного обеспечения требует использования кросс-компилятора, который работает на компьютере, но генерирует исполняемый код для целевого устройства. Для отладки требуется использование эмулятора и отладочного оборудования, такого как отладчики JTAG или SWD. Разработчики программного обеспечения часто имеют доступ к полному исходному коду ядра (ОС). Объем памяти и оперативной памяти может значительно варьироваться. Некоторые системы работают с 16 КБ Flash и 4 КБ оперативной памяти с процессором, работающим на частоте 8 МГц, в то время как другие системы могут по своим характеристикам соперничать с современными компьютерами. Эти ограничения по объему памяти приводят к тому, что большая часть работы выполняется на C или встроенном C++, а не на C++. Интерпретируемые языки, такие как BASIC (хотя, например, Parallax Propeller может использовать компилируемый BASIC) и Java (Java ME Embedded 8.3 доступен для, например, микроконтроллеров ARM Cortex M4, Cortex M7 и более старых ARM11, используемых в Raspberry Pi и Intel Galileo Gen. 2) используются нечасто; в то время как реализация интерпретируемого языка Python 3 – MicroPython – специально разработана для использования в микроконтроллерах, например, на 32-битных ARM-платформах (таких как BBC micro:bit) и 16-битных PIC микроконтроллерах.

Протоколы связи

Связь между процессорами, а также между процессором и другими компонентами, является необходимой. Помимо прямого обращения к памяти, к распространенным аппаратным протоколам относятся I²C, SPI, последовательные порты, 1-Wire, Ethernet и USB. Коммуникационные протоколы, разработанные для использования во встраиваемых системах, доступны с закрытым исходным кодом от таких компаний, как InterNiche Technologies и CMX Systems. Протоколы с открытым исходным кодом основаны на uIP, lwIP и других.