# Software embarcado

Software embarcado ou software incluído é software de computador, escrito para controlar máquinas ou dispositivos que não são geralmente considerada como computadores. É, normalmente, específico para um determinado hardware que executa e tem tempo e com restrições de memória. Este termo é às vezes usado de forma intercambiável com o firmware, apesar de firmware também pode ser aplicado a ROM com o código em um computador, em cima do qual o sistema operacional é executado, considerando que o software embarcado é normalmente o único software do dispositivo em questão.
Uma precisa e estável característica é a de que nem todas as funções do software embarcado são iniciadas/controlado através de uma interface humana, mas através de interfaces de máquina em vez disso.
Os fabricantes 'embutem' o software integrado no sistema eletrônico de veículos automóveis, telefones, modems, robôs, eletrodomésticos, brinquedos, sistemas de segurança, pacemakers, televisores e set-top boxes, e relógios digitais, por exemplo. Este software pode ser muito simples, tais como controles de iluminação que rodam em um microcontrolador de 8-bits com poucos kilobytes de memória, com o nível adequado de complexidade de processamento determinada com um, Quadro de Probabilidade Aproximadamente Correta de Computação (uma metodologia baseada em algoritmos randomizados), ou pode tornar-se muito sofisticado em aplicações como aviões, mísseis, e processo de controle de sistemas.

## Sistemas operacionais

Ao contrário do padrão computadores, geralmente, utilizar um sistema operacional, como o OS X, Windows ou GNU/Linux, software embarcado pode usar nenhum sistema operacional, ou quando eles fazem uso uma grande variedade de sistemas operacionais pode ser escolhido, normalmente um sistema operacional de tempo real. Este é executado a partir de uma operação de uma só pessoa que consiste de um ciclo e um timer, para LynxOS, VxWorks, BeRTOS, ThreadX, para Windows CE ou Linux (com o patch de kernel). Outros incluem o OpenWrt, PikeOS, eCos, Fusão RTOS, Núcleo RTOS, RTEMS, a INTEGRIDADE, a uC/OS, QNX, FreeBSD e OSE. Código normalmente é escrito em C ou C++, mas várias linguagens de programação alto nível, tais como Python e JavaScript, são agora também no uso comum, para destino microcontroladores e sistemas embarcados. Ada é usado em alguns militares e de aviação projetos.

## Diferenças na aplicação do software

A maioria dos consumidores está familiarizada com o aplicativo de software que fornece funcionalidade em um computador. No entanto, o software incorporado é geralmente menos visível, mas não menos complicado. Ao contrário do software aplicativo, o software incorporado possui requisitos e recursos de hardware fixos, e a adição de hardware ou software de terceiros é estritamente controlada.
Software embarcado deve incluir todos os drivers de dispositivo no momento da fabricação, e os drivers de dispositivo são escritos para o hardware específico. O software é altamente dependente da CPU e o chip especificamente escolhido. Os engenheiros de software têm pelo menos uma passagem de conhecimento de leitura de diagramas esquemáticos, e a leitura de datasheet de dados dos componentes para determinar o uso dos registradores e do sistema de comunicação. Conversão entre decimal, hexadecimal e binário é útil, bem como o uso de manipulação de bits.
Aplicações Web são raramente usadas, apesar de arquivos XML e outros parâmetros que podem ser passados para um computador para visualização. Sistemas de arquivos com pastas estão geralmente ausentes, como são os bancos de dados SQL.
O desenvolvimento de software requer o uso de um compilador cruzado, que é executado em um computador, mas produz um código executável para o dispositivo de destino. A depuração exige a utilização de um in-circuito emulador, JTAG ou SWD. Os desenvolvedores de Software têm muitas vezes acesso a todo o kernel (SO) de código fonte.
O tamanho da memória de armazenamento e memória RAM pode variar significativamente. Alguns sistemas são executados em 16 KB de Flash e 4 KB de RAM com um CPU rodando em 8 MHz, outros sistemas podem rivalizar com os computadores de hoje. Estes requisitos de espaço levam mais trabalho para projetos sendo feito em C ou embedded C++, em vez de C++. Linguagens interpretadas como o BASIC (enquanto e.g. Paralaxe Hélice pode usar BASIC compilado) e Java (Java ME Embedded 8.3 está disponível para microcontroladores ARM Cortex-M4, Cortex-M7 e os mais antigos ARM11 usado no Raspberry Pi e Intel Galileu Gn 2) normalmente não são utilizados; enquanto uma implementação da interpretado da linguagem Python 3 – MicroPython – é, no entanto, disponível expressamente para microcontrolador utilizar, e.g. 32-bit ARM (como o BBC micro:bit) e 16-bits microcontroladores PIC.

## Protocolos de comunicação

A comunicação entre processadores e entre um processador e de outros componentes são essenciais. Além de direto endereçamento de memória, protocolos comuns incluem I2C, SPI, portas seriais e USB.
Protocolos de comunicação projetado para o uso em sistemas embarcados estão disponíveis como código fechado de empresas, incluindo a InterNiche Tecnologias e CMX Sistemas. Open-source protocolos tronco da uIP, lwip, e outros.