Faça login para adicionar itens aos seus favoritos.

Ambiente de desenvolvimento de software embarcado com Docker

Introdução

O desenvolvimento de software para sistemas embarcados é cercado por uma multitude de ambientes de desenvolvimentos que exigem versões específicas de ferramentas ou de código de bibliotecas. Isso, por muitas vezes, dificulta o processo de desenvolvimento, pois pode ser que uma placa de um fabricante X exija que esteja instalado em sua máquina versões de ferramentas que não funcionariam para uma placa de um fabricante Y, assim exigindo a mudança de versões das ferramentas frequentemente para atender os requisitos de cada ambiente de desenvolvimento.

Além do mais, o grau de dificuldade aumentaria quando fosse necessário desenvolver software colaborativamente em máquinas distintas, com diferentes sistemas operacionais (Ubuntu vs. Windows vs. Mac), versões distintas do mesmo sistema operacional (Ubuntu 20.04 vs. Ubuntu 22.04) ou até mesmo diferentes arquiteturas de computador (x86 vs. ARM).

O efeito que isso causa são horas dedicas a tarefa de suporte para garantir que o ambiente de desenvolvimento esteja funcionando minimamente, sem que erros de compilação ocorram devido ao uso de uma versão incorreta da ferramenta que regula o sistema de compilação ou ao uso de versões inválidas de uma biblioteca. Por exemplo, a versão do CMake baixada pelo repositório padrão do Ubuntu 20.04 e 22.04 possuem divergências:

Isso pode ser o suficiente para causar confusão, pois alguns projetos de software podem utilizar a flag cmake_minimum_required para especificar a versão mínima do CMake.

Embarcados Experience 2024: Evento Presencial

Participe do Embarcados Experience 2024 em São Paulo. Conhecimento técnico, palestras, workshops e oportunidade de networking com profissionais experientes.

Inscreva-se agora

Docker

Nesse ponto que entra o Docker para ajudar. O Docker permite criar contêineres que isolam o ambiente da aplicação e seus pacotes do ambiente da máquina local. Os contêineres são uma espécie de virtualização e que podem ser confundidos com uma máquina virtual, mas que são bastante diferentes (Contêineres vs. máquinas virtuais). Em resumo, uma máquina virtual executa um sistema operacional completo, incluindo o kernel, enquanto um contêiner é bem mais leve e compartilha do próprio kernel da máquina local para executar aplicações isoladas do ambiente do sistema operacional da máquina local (Docker Docs). No final, um contêiner é nada mais que um processo na máquina local que possui um sistema de arquivos dedicado e isolado.

Com contêineres um pode ajustar quais exatos pacotes e suas versões que devem ser utilizadas para garantir o correto funcionamento de uma aplicação, seja ela um webserver, aplicações em cloud, processamento de dados e ambientes de desenvolvimento e testes.

Uma vez criado um ambiente de desenvolvimento e testes com o Docker, a equipe de desenvolvimento pode tanto se beneficiar do ambiente para desenvolvimento local quanto na nuvem. Além do mais, esse mesmo ambiente pode ser utilizado para automatizar o processo de compilação e lançamento da aplicação com pipelines de CI/CD (Continuous Integration/Continuous Delivery).

Experimento para setup de um Ambiente de desenvolvimento com Docker

Para exemplificar, vamos construir passo-a-passo um ambiente para desenvolvimento com o microcontrolador ESP32 usando o ESP-IDF.

Os materiais necessários para esse tutorial serão:

  • Docker (será utilizada apenas a interface por linha de comandos), que pode ser instalada seguindo as instruções oficiais (Install Docker Engine)
  • Máquina Linux para desenvolvimento, apesar do experimento ter sido desenvolvido utilizando o Ubuntu 20.04 LTS, o ambiente de compilação deverá funcionar para qualquer sistema operacional (exceto a etapa de carregamento do binário final, que no Windows a etapa de exposição de um dispositivo USB para o contêiner é dificultado)
  • ESP32 com cabo para programação (plataforma alvo para ambiente com microcontrolador).

O objetivo será preparar o ambiente para que as seguintes tarefas sejam realizadas de dentro do ambiente do contêiner:

  • Compilação dos binários da aplicação
  • Carregamento dos binários da aplicação na plataforma alvo (etapa exclusiva para máquina local Linux)
  • Monitoramento do funcionamento da aplicação por porta serial (etapa exclusiva para máquina local Linux).

Conhecendo o Dockerfile

O ambiente pode ser montado instanciando um contêiner baseado em uma distribuição Linux, como o Ubuntu, com o seguinte comando abaixo:

Assim, uma máquina Ubuntu 22.04 com configurações mínimas estará pronta para ser configurada com os pacotes necessários para seu ambiente de desenvolvimento. Porém, esta não é a ação correta para longo prazo, pois assim que a instância desse contêiner for deletada, os comandos de configuração executados dentro também serão perdidos.

O Dockerfile é um arquivo que pode ser utilizado como forma de rastrear todos os comandos utilizados para configurar seu contêiner, bem como quais pacotes foram instalados. Esse mesmo Dockerfile pode ser compartilhado facilmente para que o ambiente de desenvolvimento seja estabelecido em outras máquinas.

Quando o Dockerfile estiver pronto, ao invés de invocar seu contêiner usando uma imagem padrão, como a imagem Ubuntu utilizada logo acima, você será capaz de utilizar sua imagem customizada. Primeiramente é necessário compilar a imagem customizada passando o caminho do Dockerfile:

Após isso, basta invocá-la:

Descrição do ambiente de desenvolvimento para ESP32

Normalmente o fabricante da placa de desenvolvimento que você vai trabalhar já possui o passo-a-passo para montar o ambiente de desenvolvimento na sua máquina local. Resta a você adaptar os comandos de configuração para o Dockerfile. No caso do ESP32, as instruções podem ser encontradas no guia Get Started da Espressif.

O que recomendo fazer para auxiliar na construção do Dockerfile é abrir um contêiner vazio baseado em alguma distribuição (Ubuntu 22.04), como foi feito no primeiro comando da sessão “Conhecendo o Dockerfile”. Assim, antes de registrar o comando no Dockerfile, você primeiramente o testa nesse contêiner temporário para validar a eficácia desse comando. Isso pois, pode ocorrer de alguns comandos padrões de configuração padrão emitidos pelo fabricante considerarem que algumas ferramentas já vêm por padrão, quando em alguns casos o contêiner pode não vir com essa ferramenta, pelo fato de possuir uma configuração mínima.

Imagem base

O primeiro campo será a imagem base em que o ambiente de desenvolvimento se baseará. Neste caso será utilizada uma imagem de uma distribuição Linux (Ubuntu 22.04):

Pré-requisitos

O guia Get Started oferece comandos para instalação dos pré-requisitos para diversas distribuições Linux. Aqui estaremos interessados nos comandos para a distribuição Ubuntu:

Após instalados os pacotes necessários, uma boa prática é deletar o cache do gerenciador de pacotes (apt-get), assim reduzindo o tamanho da imagem final.

Baixar ESP-IDF

Para compilação de aplicações para o ESP32, será necessário baixar as bibliotecas de software disponibilizadas pela Espressif direto do repositório do ESP-IDF.

Com isso, a pasta esp será criada e dentro dela será baixado o repositório do ESP-IDF.

Configuração das ferramentas

Outra etapa importante é a configuração das ferramentas de compilação, carregamento e depuração.

Configurações finais de execução

Essa é a etapa final que consiste em alguns comandos em ordem de realizar as seguintes ações:

  • Comando a ser executado na inicialização do contêiner (iniciar terminal com bash).
  • Criação de pasta para mapear os projetos em desenvolvimento
  • Criação de alias para comando de exportação do ambiente do ESP-IDF 
  • Definição de variável de ambiente do IDF_PATH
  • Execução de script de ponto de entrada quando da criação de uma instância para essa imagem (entrypoint.sh realiza a exportação do ambiente do ESP-IDF)
  • Comando a ser executado na inicialização do contêiner (iniciar terminal com bash).

Esses comandos preparam o ambiente final do contêiner para sua correta execução.

Utilizando o ambiente de desenvolvimento

Compilação da imagem do contêiner

Após preenchido o Dockerfile, a imagem pode ser compilada com o comando abaixo:

A imagem pode ser visualizada:

Antes de executar a imagem, caso seja de interesse carregar a imagem compilada na placa de desenvolvimento, será necessário descobrir qual dispositivo serial da máquina local deverá ser mapeado para ser enxergado dentro do contêiner Docker. Para isso, você deve monitorar as mensagens do kernel da sua máquina enquanto conecta a placa na porta USB: 

Neste caso o dispositivo é o /dev/ttyUSB0.

Outro passo importante é utilizar os volumes do Docker para garantir a persistência de novos arquivos criados no contêiner em tempo de compilação. Por exemplo, vamos mapear a pasta /root/projects do contêiner para a pasta local /home/usuario/projeto-teste, assim tudo que for feito na pasta correspondente do contêiner refletirá na pasta local.

Testando a imagem

O comando final para inicializar o contêiner seria (com placa de desenvolvimento conectada):

Que irá: 1. utilizar o terminal atual para interagir com o contêiner (-it); 2. mapear uma pasta do usuário local para uma pasta do contêiner (--volume); 3. mapear dispositivo USB para contêiner (--device=); e 4. usando a imagem compilada (esp32_ambiente:1.0).

Por fim, compilamos um hello_world para testar o ambiente:

Assim, confirmando que o ambiente está funcionando corretamente.

Conclusão

Esse artigo teve o objetivo de introduzir o uso do Docker para o desenvolvimento de software embarcado, mostrando que com poucos passos é capaz de criar uma imagem que contém toda a configuração do ambiente de desenvolvimento e que pode ser compartilhada facilmente para desenvolvimento colaborativo e para uso em automações.

Referências

Para maiores informações, visite os links:

Saiba mais

Primeiros passos com ESP-IDF

ESP32: Instalação do ESP-IDF no Windows Subsystem for Linux (WSL)

Distribuindo uma aplicação com o Dockerfile

Imagem de capa adaptada de Unsplash com ícones open source do Iconduck.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Software » Ambiente de desenvolvimento de software embarcado com Docker

EM DESTAQUE

WEBINARS

LEIA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste:


Seminário de
Sistemas Embarcados e IoT 2024
 
Data: 25/06 | Local: Hotel Holiday Inn Anhembi, São Paulo-SP
 
GARANTA SEU INGRESSO

 
close-link
Webinar gratuito dia 25/09 | Espaços Conectados – A Base da Inteligência na Automação Residencial
QUERO PARTICIPAR
close-image
Webinar gratuito dia 01/10 | Design de Chips: Da Ideia à Fabricação
QUERO PARTICIPAR
close-image
Webinar gratuito dia 17/10 | Exemplos de aplicações de conexões modulares híbridas de alta performance em data connectivity
QUERO PARTICIPAR
close-image