Introducción: Por qué C# en embedded no es una broma
\n\nSi todavía piensa que el mundo de los microcontroladores y el hardware es dominio exclusivo de C puro o ensamblador, agárrese al teclado. Imagínese: está escribiendo código para ESP32 o STM32 usando consultas LINQ, async/await y un recolector de basura. Y esto no es ciencia ficción, es la realidad de 2024. El desarrollo embedded en C# ha dejado de ser un experimento para geeks y se ha convertido en una herramienta de trabajo.
\n\nPor supuesto, nadie ha cancelado C++ para controladores que consumen muchos recursos o tareas críticas en tiempo. Pero si necesita prototipar rápidamente un dispositivo IoT, escribir un servidor web directamente en la placa o usar el rico ecosistema de .NET, C# en embedded es su elección. En este artículo, analizaremos cómo funciona exactamente C# para microcontroladores, qué frameworks usar y dónde acechan los peligros.
\n\nDónde C# vence a C y C++ en embedded
\n\nSeamos honestos: C++ es potente, pero doloroso. Gestión manual de memoria, macros, dolores de cabeza con el enlazador. La programación embedded en C# ofrece lo que tanto falta en el desarrollo embedded clásico: velocidad de desarrollo y seguridad de tipos.
\n\nVentajas difíciles de ignorar
\n\n- \n
- ¿Recolector de basura? Sí, existe, pero está optimizado para tiempo real. En NanoFramework, el GC funciona de manera predecible y no bloquea la ejecución por mucho tiempo. \n
- Async/await — nunca más máquinas de estado horribles a mano. La asincronía en microcontroladores se vuelve elegante. \n
- LINQ — el procesamiento de datos de sensores se vuelve similar a trabajar con colecciones normales. \n
- Base de código unificada — se puede reutilizar la lógica entre una aplicación de escritorio y el firmware. \n
Pero también hay una desventaja: C# para sistemas embebidos requiere más memoria RAM (mínimo 256 KB de flash y 64 KB de RAM), y el inicio del entorno de ejecución toma fracciones de segundo. Para relojes en tiempo real esto es crítico, para una bombilla inteligente no.
\n\nResumen de herramientas: NanoFramework, Mono y .NET IoT
\n\nPara comenzar con el desarrollo embedded en C#, debe elegir el framework correcto. Hay tres actores principales en el campo.
\n\n.NET NanoFramework — el protagonista
\n\nNo es un .NET reducido, sino un entorno de ejecución completamente reescrito desde cero para microcontroladores. Soporta ARM Cortex-M, ESP32, TI CC32xx e incluso RISC-V. La instalación es simple: descargue la extensión de VS nanoFramework, conecte la placa por USB y escriba 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 hace parpadear un LED en un ESP32. Observe: usamos System.Device.Gpio — las mismas API que en Raspberry Pi con .NET. La portabilidad del código es una característica clave.
Mono para embedded Linux
\n\nSi tiene una BeagleBone o Raspberry Pi con Linux, pero quiere escribir en C#, use Mono. Esto no es exactamente embedded en el sentido clásico, pero para puertas de enlace IoT y cámaras inteligentes es ideal. Mono permite ejecutar aplicaciones ASP.NET Core completas en ARM.
\n\n.NET IoT Libraries — para placas de un solo chip
\n\nBibliotecas de Microsoft para trabajar con GPIO, SPI, I2C. Funcionan sobre .NET Core/5+ en Linux. Son excelentes para prototipado, pero requieren un sistema operativo completo.
\n\nEscribiendo un proyecto real: leyendo temperatura con DHT22
\n\nPasemos a la práctica. Supongamos que necesitamos leer datos del sensor de temperatura y humedad DHT22 en un STM32F4