Introdução: Por que C# em sistemas embarcados não é brincadeira
\n\nSe você ainda acha que o mundo dos microcontroladores e hardware é domínio exclusivo de C puro ou assembly, segure-se no teclado. Imagine: você escreve código para ESP32 ou STM32 usando consultas LINQ, async/await e coletor de lixo. E isso não é ficção — é a realidade de 2024. Desenvolvimento embarcado em C# deixou de ser um experimento para geeks e se tornou uma ferramenta de trabalho.
\n\nClaro, ninguém cancelou C++ para drivers que consomem muitos recursos ou tarefas críticas de tempo. Mas se você precisa prototipar rapidamente um dispositivo IoT, escrever um servidor web diretamente na placa ou usar o rico ecossistema .NET, C# em sistemas embarcados é sua escolha. Neste artigo, vamos analisar como funciona exatamente o C# para microcontroladores, quais frameworks usar e onde estão as armadilhas.
\n\nOnde C# vence C e C++ em sistemas embarcados
\n\nSejamos honestos: C++ é poderoso, mas doloroso. Gerenciamento manual de memória, macros, dores de cabeça com o linker. Programação embarcada em C# oferece o que falta ao desenvolvimento embarcado clássico: velocidade de desenvolvimento e segurança de tipos.
\n\nVantagens difíceis de ignorar
\n\n- \n
- Coletor de lixo? Sim, ele existe, mas é otimizado para tempo real. No NanoFramework, o GC funciona de forma previsível e não bloqueia a execução por muito tempo. \n
- Async/await — chega de máquinas de estado manuais horríveis. Assincronia em microcontroladores se torna elegante. \n
- LINQ — o processamento de dados de sensores se torna semelhante ao trabalho com coleções comuns. \n
- Base de código unificada — você pode reutilizar a lógica entre o aplicativo de desktop e o firmware. \n
Mas há um lado negativo: C# para sistemas embarcados requer mais memória RAM (mínimo de 256 KB de flash e 64 KB de RAM), e a inicialização do ambiente de execução leva frações de segundo. Para relógios de tempo real, isso é crítico; para uma lâmpada inteligente, não.
\n\nVisão geral das ferramentas: NanoFramework, Mono e .NET IoT
\n\nPara começar o desenvolvimento embarcado em C#, você precisa escolher o framework certo. Existem três principais players no campo.
\n\n.NET NanoFramework — o protagonista
\n\nEste não é um .NET reduzido, mas um ambiente de execução completamente reescrito do zero para microcontroladores. Ele suporta ARM Cortex-M, ESP32, TI CC32xx e até RISC-V. A instalação é simples: baixe a extensão nanoFramework para VS, conecte a placa via USB e escreva o código.
\n\nusing System;\nusing System.Device.Gpio;\nusing System.Threading;\n\nclass Program\n{\n static void Main()\n {\n GpioController gpio = new GpioController();\n GpioPin led = gpio.OpenPin(2, PinMode.Output);\n \n while (true)\n {\n led.Write(PinValue.High);\n Thread.Sleep(500);\n led.Write(PinValue.Low);\n Thread.Sleep(500);\n }\n }\n}\n\n\nEste código pisca um LED no ESP32. Observe: usamos System.Device.Gpio — as mesmas APIs do Raspberry Pi com .NET. Portabilidade de código é um recurso matador.
Mono para embedded Linux
\n\nSe você tem um BeagleBone ou Raspberry Pi com Linux, mas quer escrever em C# — use Mono. Isso não é exatamente embarcado no sentido clássico, mas para gateways IoT e câmeras inteligentes é ideal. Mono permite executar aplicativos ASP.NET Core completos em ARM.
\n\nBibliotecas .NET IoT — para single-board computers
\n\nBibliotecas da Microsoft para trabalhar com GPIO, SPI, I2C. Elas funcionam sobre .NET Core/5+ no Linux. São ótimas para prototipagem, mas exigem um sistema operacional completo.
\n\nEscrevendo um projeto real: lendo temperatura do DHT22
\n\nVamos à prática. Suponha que precisamos ler dados do sensor de temperatura e umidade DHT22 em um STM32F4