Встроенное программное обеспечение — это компьютерное программное обеспечение , написанное для управления машинами или устройствами, которые обычно не считаются компьютерами, обычно называемыми встроенными системами . Обычно оно специализировано для конкретного оборудования , на котором оно работает, и имеет ограничения по времени и памяти. [1] Этот термин иногда используется взаимозаменяемо с прошивкой . [2]
Точной и стабильной характерной чертой является то, что ни одна или не все функции встроенного программного обеспечения не инициируются/не контролируются через человеческий интерфейс , а вместо этого через машинные интерфейсы. [3]
Производители встраивают встроенное программное обеспечение в электронику автомобилей , телефонов, модемов, роботов , бытовой техники, игрушек, систем безопасности, кардиостимуляторов , телевизоров и приставок, а также цифровых часов , например. [4] Это программное обеспечение может быть очень простым, например, управление освещением, работающее на 8-битном микроконтроллере с несколькими килобайтами памяти с подходящим уровнем сложности обработки, определяемым с помощью фреймворка «Вероятно приблизительно правильные вычисления» [5] (методология, основанная на рандомизированных алгоритмах ). Однако встроенное программное обеспечение может стать очень сложным в таких приложениях, как маршрутизаторы , оптические сетевые элементы, самолеты , ракеты и системы управления процессами . [6]
В отличие от стандартных компьютеров, которые обычно используют операционные системы, такие как macOS , Windows или Linux , встроенное программное обеспечение может не использовать никакой операционной системы. Когда они используют одну, можно выбрать из широкого спектра операционных систем, как правило, операционную систему реального времени . Код для встроенного программного обеспечения обычно пишется на C или C++ , но различные языки программирования высокого уровня , такие как Java , Python и JavaScript , теперь также широко используются для микроконтроллеров и встроенных систем. [7] Языки ассемблера также часто используются, особенно при загрузке и обработке прерываний . Ada используется в некоторых военных и авиационных проектах.
Большинство потребителей знакомы с прикладным программным обеспечением , которое обеспечивает функциональность на компьютере. Однако встроенное программное обеспечение часто менее заметно, но не менее сложно. В отличие от прикладного программного обеспечения, встроенное программное обеспечение имеет фиксированные требования к оборудованию и возможности, а добавление стороннего оборудования или программного обеспечения строго контролируется.
Встроенное программное обеспечение должно включать все необходимые драйверы устройств во время производства, и драйверы устройств пишутся для различных аппаратных устройств. Эти драйверы устройств, называемые BSP ( пакет поддержки платы ), образуют слой программного обеспечения, содержащий аппаратно-специфические драйверы и другие процедуры, которые позволяют конкретной операционной системе (традиционно операционной системе реального времени или RTOS) функционировать в определенной аппаратной среде (компьютер или карта ЦП), интегрированной с самой RTOS. Программное обеспечение сильно зависит от ЦП и выбранных конкретных чипов. Большинство инженеров встроенного программного обеспечения имеют по крайней мере поверхностные знания чтения схем и чтения спецификаций для компонентов, чтобы определить использование регистров и системы связи. Преобразование между десятичными , шестнадцатеричными и двоичными числами полезно, а также использование манипуляции битами . [8]
Веб-приложения часто используются для управления оборудованием, хотя XML-файлы и другие выходные данные могут передаваться на компьютер для отображения. Обычно используются файловые системы с папками, однако базы данных SQL часто отсутствуют.
Разработка программного обеспечения требует использования кросс-компилятора , который работает на компьютере, но создает исполняемый код для целевого устройства. Отладка требует использования внутрисхемного эмулятора и отладочного оборудования, такого как отладчики JTAG или SWD . Разработчики программного обеспечения часто имеют доступ к полному исходному коду ядра (ОС).
Размер памяти для хранения и ОЗУ может значительно различаться. Некоторые системы работают с 16 КБ Flash и 4 КБ ОЗУ с процессором, работающим на частоте 8 МГц, другие системы могут конкурировать с современными компьютерами. [9] Эти требования к пространству приводят к тому, что больше работы выполняется на C или встроенном C++ вместо C++. Интерпретируемые языки, такие как BASIC (в то время как, например, Parallax Propeller может использовать скомпилированный BASIC) и Java (Java ME Embedded 8.3 [10] доступна, например, для микроконтроллеров 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-Wires , Ethernets и USB .
Протоколы связи, разработанные для использования во встроенных системах, доступны в виде закрытого исходного кода от таких компаний, как InterNiche Technologies и CMX Systems . Протоколы с открытым исходным кодом берут начало от uIP , lwip и других.