# Sistemas operacionais/Sistemas embarcados
## Introdução

Sistemas embarcados são sistemas computacionais completos e independentes, mais simples que um computador de propósito geral (desktops), encarregados de executar apenas uma função determinada - tarefas pré-determinadas, com requisitos específicos - na qual executam geralmente repetidas vezes. Também chamado de sistema embutido, seu computador é completamente encapsulado, totalmente dedicado ao dispositivo que controla. Esses dispositivos são compostos fundamentalmente pelos mesmos componentes de um computador pessoal, só que com tamanho e capacidade limitadas para o fim se destina. São muito utilizados no cotidiano, e seus usuários geralmente não os consideram com um computador. São exemplos: aparelho de som, televisão, câmera digital, brinquedos, modem ADSL, entre muitos outros dispositivos. A evolução da microeletrônica e o barateamento das CPU's viabilizaram o emprego de sistemas embarcados nos diversos equipamentos.
Por serem muito simples, muitas vezes esses sistemas não têm flexibilidade (de software e de hardware) que lhes permita fazer outras tarefas quaisquer que não sejam aquelas para as quais foram desenhados e desenvolvidos. A única flexibilidade permitida e desejada é no caso de um upgrade de novas versões, fazendo com que o sistema possa ser reprogramado, geralmente com correções ou novas funções que o tornem melhor. Mas isto é feito sempre pelos fabricantes e quase nunca pelos usuários finais.
No processo de desenvolvimento do software do sistema embarcado, ocorre que esta é desenvolvido em um computador pessoal comum sendo transferido para o sistema embarcado apenas nos estágios finais do desenvolvimento. Em alguns casos isso é feito através da porta USB (ou de uma porta serial), mas em outros é necessário gravar um chip de EPROM ou memória flash com a ajuda do gravador apropriado e transferir o chip para o sistema embarcado para poder testar o software.
Normalmente o usuário final não terá acesso ao software do sistema embarcados, mas interage com o mesmo através de uma interface, que pode ser um display, um teclado ou até mesmo por uma interface web.
Um grande responsável pelo expansão do uso e aplicação dos sistemas embarcados foi a utilização do microcontrolador, pelo seu baixo custo, versatilidade e tamanho reduzido. Muitas vezes é ele que desempenha sozinho todas as funções do aparelho, incluindo controladores para as diversas funções disponíveis e até mesmo uma pequena quantidade de memória RAM, entre outros recursos.
Existem no mercado os mais diversos tipos de microcontroladores, cada um com um conjunto próprio de periféricos e funções. Ao invés de desenvolver e fabricar seus próprios chips, as empresas passaram a cada vez mais utilizar componentes disponíveis no mercado, que são fabricados em massa e vendidos a preços incrivelmente baixos.
Muitos microcontroladores podem ser conectados a dispositivos analógicos, permitindo o uso de sensores diversos. Isso permite a criação de dispositivos simples, que monitoram temperatura, umidade, entre outros fatores, executando ações predefinidas em caso de mudanças
Embora os computadores pessoais normalmente roubem a cena, os sistemas embarcados são muito mais numerosos e são responsáveis por toda a estrutura que utilizamos no dia-a-dia. Eles são também uma das áreas mais promissoras dentro da área de tecnologia, já que um simples sistema embarcado pode ser programado para desempenhar praticamente qualquer função.

### Conceitos Básicos de Desenvolvimento em Sistemas Embarcados
#### Introdução

* Devido as limitações das plataformas embarcadas é necessário uma plataforma mais robusta para o desenvolvimento das aplicações.
* Esta plataforma é chamada de desenvolvimento ou simplesmente Host.
* Já as plataformas onde as aplicações serão executadas são chamadas de Plataforma Alvo ou simplesmente Target.

#### Plataforma de Desenvolvimento – Host

* Geralmente são computadores de propósito geral (Computadores Pessoais).
* Possuem grande capacidade de armazenamento.
* Possuem grande quantidade de processamento.
* Disponibiliza interfaces mais adequadas para o desenvolvedor.
* É onde serão executadas as ferramentas necessárias para o desenvolvimento de aplicações.

#### Plataforma Alvo – Target

* Produto propriamente dito.
* Plataforma onde as aplicações serão executadas.
* Suas características foram citadas anteriormente.
* Geralmente são utilizadas plataformas de referência para o desenvolvimento até chegar ao produto final.

#### Tipos de Configuração Host/Target

* É necessário uma interface entre a plataforma host e a plataforma target.
* Atualmente existem 3 configurações para estas interfaces que são mais comuns:
   * Linked Setup
   * Removable Storage Setup
   * Standalone Setup

#### Tipos de Configuração Host/Target – Linked Setup

* Configuração mais utilizada atualmente.
* Host é conectado ao Target através de um cabo.
* Geralmente utiliza interface RS-232, USB ou Ethernet para comunicação com o target.
* Possibilita depuração do código “remotamente”;
* Atualmente, é utilizado este tipo de configuração para a gravação e depuração de software na plataforma alvo com o auxílio de JTAGs.

#### Tipos de Configuração Host/Target – Removable Storage Setup

* Utiliza dispositivos removíveis para cópia da aplicação desenvolvida para a plataforma alvo.
* Antigamente eram utilizadas placas de gravação contendo sockets para a memória a qual era utilizada na plataforma alvo.
* Modelo quase obsoleto, pois este não permite a depuração da aplicação de forma eficaz.

#### Tipos de Configuração Host/Target – Standalone Setup

* São utilizados em plataforma alvo bem mais robustas.
* As ferramentas de desenvolvimento são executadas na plataforma alvo.
* A plataforma de desenvolvimento é utilizada apenas para acessar a plataforma alvo.
* Devido a evolução das plataformas embarcadas, este modelo já vem sendo utilizado.

#### Cross-Compiling

* É a construção de uma aplicação para uma plataforma distinta da qual está sendo construída.
* O Compilador, é executado na plataforma de desenvolvimento, porém gera um binário para outra plataforma: A plataforma alvo.
* um binário compilado para uma plataforma, só pode ser executado nesta, pois instruções geradas são específicas para cada arquitetura de processador.

### Exemplos de SO’s Embarcados
#### TinyOS:

É um sistema operacional embarcado open-source projetado para dispositivos de redes de sensores sem fio. Ele apresenta uma arquitetura baseada em componentes que permite uma rápida inovação e aplicação, minimizando o tamanho do código devido a restrição de memória inerente aos dispositivos.Sua biblioteca de componentes inclui protocolos de rede, serviços distribuídos, drivers de sensor, e ferramentas de aquisição de dados. O TinyOS tem compatibilidade com dezenas de plataformas e placas de sensor.

#### Contiki

Contiki é um sistema operacional com o código aberto, diferentemente do TinyOS. É um sistema operacional altamente portátil e multi-tarefas para redes de dispositivos com memória limitada. É escrito na linguagem C e foi especialmente projetado para microcontroladores com pouca memória. Esse sistema operacional foi desenvolvido no Instituto Sueco de Ciência da Computação (Swedish Institute of Computer Science) liderado por Adam Dunkels. Contiki implementa a camada de adaptação 6LoWPAN, que é uma camada que promove a compressão do IPv6, colocando-o para funcionar nesses dispositivos de memória limitada, possibilitando maior integração dos mesmos com a Internet. Com o 6LoWPAN, todos os sensores contêm uma IPv6 stack que rodam sobre UDP.

#### VirtuOS:

Ele foi idealizado para desfrutar dos recursos e do poder de processamento dos processadores arquitetura x86 de 32 bits em microcomputadores de última geração, de arquitetura compatível com os modelos IBM PC™ de modo a cobrir um largo espectro de aplicações profissionais de propósito geral.
Sua implementação permite um nível de desempenho e de segurança surpreendentes e que viabilizam, a baixo custo, a instalação de Sistemas Distribuídos de Missão Crítica, pela utilização transparente e simultânea dos ambientes multitarefa, multiusuário, multiterminal e de redes locais e remotas.

#### QNX:

É multiusuário, multitarefa, trabalha com rede e possui uma boa interface. A semelhança visual do QNX com o Linux é explicada pelo fato de ambos os projetos fazerem uso da interface gráfica PHOTON. Versões mais recentes do QNX possuem diversas aplicações nativas, dentre as quais se destaca o seu navegador de internet, o Voyager, que renderiza praticamente todo tipo de conteúdo (streaming de áudio e vídeo, flash, etc.) usado atualmente na web. Por se basear em UNIX, o QNX é confiável e estável, podendo ser ideal para profissionais da área gráfica (3D, edição de imagem e vídeo e similares). Líderes mundiais como a Cisco, General Eletric e Siemens dependem da tecnologia QNX para roteadores de rede, instrumentos médicos, unidades telemáticas de veículos, sistemas de segurança e de defesa, robótica industrial e outras aplicações de missões críticas. Em 2010, a Research In Motion (RIM), fabricante do BlackBerry, adquiriu o QNX e o implementou em seu primeiro tablet PC, o PlayBook, concorrente direto do iPad, da Apple.

#### Windows CE:

É uma versão da não-popular linha de sistemas operativos Windows para dispositivos portáteis, Tablet PCs e sistemas embarcados. Ele equipa desde micro-computadores até telefones celulares mais antigos e o Dreamcast. É suportado no Intel x86 e compatíveis, MIPxS, ARM, e processadores SuperH Hitachi.

#### Exemplos de sistemas embarcados com Linux:

* PDA Sharp Zauro SL-C3100
* Multimídia Archos PMA400
* Roteador Linksys WTR54G
* Telefones celulares

### Exemplos de interação com o Sistema Operacional embarcado

Os sistemas embarcados não possuem uma interface para acesso aos comandos de execução do sistema operacional embarcado. Eles utilizam de uma conexão com o computador para se ter acesso ao sistema operacional e os seus comandos de execução, assim como acesso ao kernel, essa conexão simulará um terminal que terá acesso ao sistema operacional como se estivesse operando no próprio hardware embarcado. A conexão como o computador pode ser via porta ethernet (conexão de rede tanto local como wireless), porta USB, porta serial e porta paralela, sendo que os dois últimos casos estão cada vez mais raros na prática devido a ausência das duas portas nos computadores atuais. Com a conexão física é necessário que se realize a comunicação do computador com o hardware embarcado através de protocolos (regras de comunicação), sendo que para cada tipo de protocolo de comunicação existem alguns softwares. Comentaremos os protocolos: Telnet, com dois softwares, e o SSH, com software de mesmo nome.
Telnet é um protocolo de terminal virtual que estabelece conexão com outros computadores ou sistemas embarcados via comunicação TCP/IP. Existem diversos softwares que utilizam o Telnet, existe o software com o mesmo nome, Telnet, que utiliza linhas de comandos para a execução dos comandos (plataformas: Linux e Windows); existe o Hyper Terminal que é um software muito utilizado na configuração de roteadores por meio da porta serial, porém esse é um software da plataforma Windows, usuários Linux que quiserem utilizá-lo deverão instalar o programas similares, por exemplo o C-Kermit. SSH, na verdade, é um protocolo que extende do Telnet pois realiza a conexão por meio de TCP/IP porém com segurança, criptografando as informações no terminal virtual antes de enviar para o cliente e realiza a autenticação no envio e no recebimento dos dados, o SSH é suportado na plataforma Linux e assim como o Telnet é executado por linhas de comando, para o Windows existem softwares que suportam esse protocolo.

#### Acessando um roteador Cisco 1700

O roteador Cisco 1700 é muito utilizado em empresas de médio porte por oferecer alta velocidade de banda larga e linha dedicada de acesso, segurança e integração de voz. O sistema operacional embarcado é o Cisco IOS, ele utiliza uma interface de linha de comando (CLI) como console de gerenciamento, a CLI utiliza de uma hierarquia de modos, sendo que cada modo é responsável por executar determinados comandos. Exemplo de cliente que utiliza o roteador Cisco 1700: Banco Itaú em agências de pequeno porte.
A primeira configuração do roteador Cisco 1700 deve ser feita através da porta serial do micro e da porta Console ou Aux do roteador pois o mesmo vem sem a configuração IP, para configurações posteriores pode-se usar a porta ethernet do computador com uma porta ethernet do roteador utilizando-se o protocolo Telnet para comunicação entre os equipamentos. Realizado as conexões físicas, porta serial do micro ligado por um cabo Rollover na porta Console do roteador Cisco 1700 (figura 1), e ligados os equipamentos pode-se utilizar do emulador de terminal (Hyper Terminal) para conectar logicamente o computador no roteador.
O aplicativo Hyper Terminal exigi algumas configurações todas as vezes que ele inicializa, a primeira tela (Figura 2) é para configurar o nome da conexão;
A próxima configuração (Figura 3) é de qual porta usar, se for conectar na porta serial deve-se escolher a porta serial que o roteador está ligado, COMX;
A última configuração se refere as propriedades de comunicação, que por padrão usa-se: Bits por segundo = 9600; Bits de dados = 8; Paridade = Não; Bits de parada = 1; Controle de fluxo = Hardware (Figura 4).
Depois das telas de configuração o Hyper Terminal estará pronto para acessar o console, porém nada será mostrado (Figura5) até que se aperte a tecla Enter (Figura 6).
Para começar a usar o console, novamente, deverá apertar a tecla Enter. Após o pressionamento da tecla, parecerá um nome> , nome será o nome do roteador, esse primeiro modo é o modo EXEC usuário que é um modo de usuário que executa poucos comandos (Figura 6).
Para alterar para o modo EXEC privilegiado, modo onde é possível acessar todos os comandos do roteador, basta digitar enable, aparecerá na tela nome# (Figura 7);
Para entrar no modo de configuração global o comando é configure terminal, deverá estar em modo EXEC privilegiado, aparecerá nome(config)# (Figura 8);
Para sair do modo EXEC privilegiado basta digitar disable; para sair do modo de configuração global o comando é exit; para sair do modo EXEC usuário basta digitar exit, o console será fechado. Para saber o que cada modo executa basta digitar ? que aparecerá na tela os comandos suportados (Figura 9).
Em modo EXEC privilegiado o comando show mostra uma configuração ou um status específico, show running-config: configuração ativa, conteúdo da RAM; show flash: local onde o Sistema Operacional está salvo, conteúdo da Flash (Figura 10);
Show version: mostra a versão e qual IOS está carregado (Figura 11); show interfaces: lista todas as interfaces disponíveis no roteador e seus respectivos status.

#### O robô voador com linux embarcado, Ar.Drone

    “A placa principal inclui um CPU central Parrot P6 do AR.Drone. O chip P6 foi especialmente concebido para o AR.Drone. Inclui um 468 MIPS ARM926EJ Risc CPU e um acelerador de video. A placa principal corre com Linux juntamente com o software AR.Drone. A placa principal inclui 256 Mb 200 MHz 32 Bits MDDR RAM de 32Mb de NAND Flash. Inclui um chipset Wi-Fi da Atheros e uma porta USB para flashing direto e extensões futuras. O chip Atmel P6MU é um chipset de gestão de energia para o chipset P6. A placa principal inclui também uma câmera vertical 60FPS. A resolução de vídeo é QCIF (176*144 pixels) que, combinado com os acelerômetros, providencia a velocidade horizontal do AR.Drone.” (Gohobby)
O brinquedo tem SDK, é possível pilotá-lo com um aparelho PC, Android, iPad, iPhone e qualquer outro brinquedo nerd programável e com comunicação Wifi.
Com a comunicação Wifi é possível jogar em rede com vários Ar.Drone. O AR.Drone inclui uma unidade de medida inerte, sensores ultra som e uma câmera vertical, na qual você também consegue gravar vídeos e tirar fotos. Atinge uma velocidade de 18 km/h, com uma autonomia de vôo de 12 minutos, hélices de alta eficiência, bateria de lítio polímero (3 células, 11,1 V, 1000 mAh - UL2054), a frequência do vídeo atinge 60 FPS, permite a estabilização, mesmo com uma leve brisa e travamento automático das hélices no caso de contato.
Configurações: Antes da configuração e compilação mostraremos algumas definições para posterior configuração. Tilt: Ajusta a velocidade horizontal, porém não esqueça da sensibilidade do acelerômetro que interfere nesta aceleração. VerticalSpeed: Define velocidade Vertical e o sobe e desce do aparelho.
Yam Speed: Define a velocidade de rotação, ou seja sentido horário ou anti-horário.
O SDK oficial deverá ser obtido através do site: https://projects.ardrone.org/. Baixe a última versão descompacto-o com o camando tar xvfz, acesse a pasta e compile (make). Agora o SDK e as bibliotecas já estão compiladas e prontas para uso. Para conectar com o AR.Drone, coloque a sua interface de rede em modo Ad-Hoc, informe o nome da rede, desabilite a criptografia e defina o IP, conforme comando abaixo:
O ip e a maskara de rede depende da estrutura de rede qual o usuário está.
Para testar o programa exemplo, entre na pasta Examples/Linux e execute o binário ardrone_navigation.
Se tudo estiver funcionando corretamente, teremos o formulário e/ou painel acima. Clique em "USB Configuration" para mapear os controles do joystick, wiimote, teclado ou outro dispositivo. Para visualizar o vídeo das câmeras do AR.Drone, entre na opção "Show Drone Vídeo", finalizando para define a configuração de voo, clique em "Flight control settings".

### Importância dos Sistemas Operacionais Embarcados

Os primeiros sistemas controlados eram feitos com eletrônica analógica através de potenciômetros e capacitores, porém esse controle era lento e as vezes não atendia as especificações de um projeto que era realizado manualmente. A descoberta dos transistores possibilitou a criação dos microcontroladores, que reduziu o tamanho dos computadores e se tornaram digitais, aumentando assim o seu poder de processamento, alguns computadores ficavam dedicados a uma única tarefa, mas ainda eram sistemas complexos controlados por processadores.
Diferente de computadores de propósito geral, como o computador pessoal, os microcontroladores para serem usados em projetos específicos precisavam ser programados para poder controlar com precisão as suas tarefas. Já que o sistema tinha que ser dedicado a tarefas específicas, através de engenharia pode-se otimizar o projeto reduzindo tamanho, recursos computacionais e custo do produto.
Os sistemas embarcados, geralmente contam com uma quantidade reduzida de recursos como memória, poder de processamento e outros requisitos como processamento em tempo real, eles não são projetados para utilizar sistemas operacionais destinados aos computadores pessoais, geralmente os sistemas embarcados utilizam sistemas operacionais de tempo real especiais que além de consumirem muito menos memória e processamento, são muito mais estáveis e confiáveis.
Essas características dos sistemas embarcados fizeram com que essa tecnologia alcançasse uma grande importância no mercado, pois além da sua disponibilidade, os sistemas se tornaram estáveis, seguros e confiáveis, pois imagine se acontece uma famosa "tela azul" em um sistema médico que controla a vida de uma pessoa, ou em um sistema de controle de uma aeronave em pleno vôo, assim esses sistemas são projetados para trabalhar ininterruptamente, sendo possíveis de se auto-recuperarem após acorrerem erros através de técnicas de watchdog timer, que reinicia o sistema a menos que o software notifique periodicamente que está funcionando corretamente.
Outra importância fundamental que ganhou destaque em projetos de sistemas embarcados foi a redução do consumo de energia, esse baixo consumo permitiu com que os dispositivos móveis ganhassem força no mercado oferecendo aos consumidores uma enorme quantidade de recursos, atualmente basicamente todos os dispositivos móveis utilizam sistemas embarcados sendo perceptível a não ocorrencia de erros graves, quanto a resistência e durabilidade os sistemas embarcados são projetados para trabalhar em ambientes com condições adversas (vibrações, calor, poeira, variações na tensão, interferencias eletromagéticas, umidade e etc.).
Antes apenas utilizados em sistemas complexos como sistemas industriais, aeronaves e navios, hoje vemos softwares embarcados em geladeiras, televisores e fornos de microondas. Estes equipamentos tornam-se cada vez mais sofisticados, demandando mais e mais complexidade no seu hardware e software embarcado. Alguns números já demonstram de forma inequívoca a importância do software embarcado no setor industrial. Quando falamos em diferenciação competitiva, já observamos que parcela significativa da diferenciação entre os produtos baseia-se na maior oferta de funcionalidade, suportada por tecnologia de software. A revolução digital tem mudado e vai continuar mudando a dinâmica de muitas indústrias. Na indústria de eletroeletrônicos vemos claramente a digitalização substituindo o mundo analógico.
Os sistemas embarcados vieram para facilitar o dia a dia do ser humano e automatizar as atividades que antes eram feitas manualmente, funcionalidades como computador de bordo, análise de dados atráves de dispositivos móveis e interfaces de comunicação podem ser facilmente implementadas com sistemas embarcados, porém parte dessa revolução está visivelmente aplicada em segmentos específicos como em aparelhos usados na medicina, nas engenharias, como sensores que verificam a distancia entre sementes automatizando assim o plantio na agricultura, entre outras infinidades de processos, suas aplicações não tem limites.

#### Watchdog

O watchdog time ou computer operating properly (COP) time, como também é conhecido, é uma forma utilizada para monitorar o sistema embarcado, disparando um reset ao sistema caso o mesmo não retorne mensagem informando que esta funcionando.
Sendo uma forma de controlar dispositivos que se por algum motivo pararem de funcionar poderiam levar a panes ou situações de riscos como, por exemplo, algum dispositivo interno de um avião que não pode deixar de responder em pleno voo; além de outros exemplos. O mesmo funciona normalmente a parte do sistema embarcado, sendo geralmente um microcontrolador com temporizador, enviando notificações ao sistema em intervalos pré-configurados.
O watchdog timer não precisa estar necessariamente junto ao sistema embarcado para que funcione, sendo hoje utilizado watchdog timer através dos protocolos TCP/IP, sendo enviados aos dispositivos pacotes de comunicação e em caso de não houver resposta o mesmo é reiniciado.
Outra forma de utilização do watchgog timer é em na execução de códigos não confiáveis em sandbox, sendo colocado um limite de tempo de execução da CPU para o código, suspendendo a execução caso o tempo limite seja atingido. Esse modelo é normalmente utilizado para prevenir ataques de DoS.