Novidades do .NET Core 3 para IoT e Sistemas Embarcados

O .NET Core 3 foi enfim lançado nessa segunda-feira passada, 23/09/2019, com novidades para o mundo dos sistemas Embarcados e IoT. Na verdade tivemos duas novidades mais marcantes nessa versão do framework open source da Microsoft, suporte a ARMv8 64 bits e lançamento de APIs para as interfaces de GPIO, PWM, I2C e SPI.

 

Vou demonstrar essas novidades na prática em dois artigos. Neste primeiro artigo vamos falar do suporte a ARMv8 64 bits.

 

.NET Core ARM 64 bits

 

Desde o .NET Core 2.1 já temos suporte a dispositivos ARMv7 32 bits. Mas agora com o .NET Core 3 podemos fazer deploy de aplicações para ARMv8 64 bits. Os microprocessadores Broadcom 2837 das placas Raspberry Pi 3B e os microprocessadores iMX8 da NXP, que estão presentes em dispositivos para aplicações IoT industriais, são ARMv8 64 bits.

 

Projeto Hello .NET Core 3

 

Para esta demonstração criarei uma aplicação do tipo console no .NET Core:

 

Adicionarei o seguinte trecho ao código gerado do "Hello World" padrão:

 

Notem linhas 2, 11 e 12, estou utilizando o System.Runtime.InteropServices.RuntimeInformation para requisitar informações sobre a plataforma e arquitetura onde estamos rodando nossa aplicação .NET Core 3.

 

Lembrando que estou executando os comandos na minha máquina de desenvolvimento, rodando um GNU/Linux Debian arquitetura x86_64. E então se executarmos o projeto, teremos o seguinte resultado:

 

.NET Core 3

Notem que, lógico, a arquitetura retornada pela API foi x64 rodando em um Linux 5.2. Bom, nenhuma novidade até aqui, e agora como faz para rodar isso em um ARMv8?

 

Escolha seu Hardware ARMv8

 

Primeiramente precisamos de um hardware ARMv8. Para as demonstrações desse artigo vou utilizar um Colibri iMX8QXP da Toradex com a Aster Carrier Board:

Esse monstrinho tem 4x ARM Cortex-A35 1,2 GHz, de baixo consumo e alto desempenho. O Cortex-A35 é o estado da arte da ARM, sendo o ARMv8 64 bits mais eficiente. Também conta com 2 GB de memória RAM e 8 GB de eMMC (memória flash de armazenamento).

 

Deploy linux-arm64 - (Ou Cross Compile .NET Core)

 

Agora que temos um hardware descente vamos gerar um deploy, self contained, desse projeto para ARMv8 com seguinte comando:

 

 

Aqui estamos usando o tipo de deploy self contained para não perder tempo instalando e configurando dependências para nosso target. O pulo do gato aqui é o argumento -r que recebe a arquitetura do Runtime do .NET Core 3 que será utilizado para gerar o binário, e dependências. O .NET Core SDK rodando na minha máquina x86 vai gerar o cross compile da aplicação e dependências para ARMv8 com o argumento linux-arm64.

 

Se verificarmos o executável gerado na pasta bin/Debug/netcoreapp3.0/linux-arm64/publish/demo1 do projeto podemos ver que ele é um binário ELF para ARMv8:

 

 

Se também listarmos o conteúdo da pasta bin/Debug/netcoreapp3.0/linux-arm64/publish podemos ver que temos todas as .dll e .so de dependências para rodarmos nosso aplicativo .NET Core 3 em ARMv8.

 

Ótimo! Temos os binários, vamos copiar agora essa pasta para a o Colibri iMX8QXP via ssh:

 

Executando o Projeto no Target ARMv8

 

E por fim acessar o bash da placa via ssh e executar a aplicação:

.NET Core 3

Como você pode ver acima a aplicação retornou um erro e foi terminada. Esse erro é causado pela dependência de pacotes ICU. Para resolver isso vamos adicionar a flag System.Globalization.Invariant to true como a mensagem de erro nos direcionou a fazer:

 

Lembrando que o arquivo acima tem de ser criado com esse conteúdo e nome na raiz do projeto. Assim podemos re-executar o deploy:

 

Copiar novamente a pasta para a placa, e executar a aplicação na placa:

Sucesso! Agora temos uma aplicação .NET Core 3 rodando em arquitetura ARM64 nativa em um Linux 4.14 no nosso Colibri iMX8QXP.

 

Confira o vídeo onde mostro as Novidades do .NET Core 3 para IoT e Sistemas Embarcados apresentadas nesse artigo:

 

 

Conclusões

 

Como podemos ver na prática agora podemos realizar deploy de aplicações .NET Core para Linux Embarcado com arquitetura ARMv8 64 bits, e isso abre ótimas oportunidades de utilizar o .NET Core, e seu ecossistema, para aplicações IoT modernas que necessitem de maior processamento e memória.

 

Utilizar o modo de deploy self contained faz o cross compile e simplifica bem a vida do desenvolvedor de embarcados, gerando um binário e todas as dependências cruciais para execução da aplicação para a arquitetura do target. (Se você não entendeu por que isso é importante ou necessário sugiro o vídeo sobre O que É Cross Compile do nosso canal). A distribuição que eu usei para a demonstração só tinha o GLIBC e mais NADA! Só copiando a pasta publish gerada e a aplicação funcionou.

 

Esse artigo termina aqui, mas fique atento que a segunda parte já vem!

 

Referências

 

Announcing .NET Core 3.0

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Matheus Castello
Cientista da Computação atuando desde 2013 nas áreas de sistemas embarcados, Android e Linux. Trabalhou diretamente com o Kernel Linux embarcado em modelos de smartphones e tablets Samsung comercializados na America Latina. Colaborou no upstream para o Kernel Linux, árvore git do Linus Torvalds, para o controlador de GPIO da família de processadores utilizados nos Raspberry Pi. Palestrante FISL 2018 e Linux Developer Conference Brazil 2018.

Deixe um comentário

avatar
 
  Notificações  
Notificar