Embedded-hal, un framework para la creación de controladores universales en Rust
Hace poco, el grupo de trabajo Rust Embedded, creado para desarrollar tecnologías para mejorar la calidad y seguridad de aplicaciones, firmware y controladores para sistemas integrados, presentó la primera versión del marco embedded-hal 1.0.
Embedded-hal se posiciona como un marco que sirve como base para construir un ecosistema de controladores que son totalmente independientes de la plataforma, lo que significa que los controladores pueden ser reutilizados en diferentes microcontroladores sin necesidad de modificaciones extensas.
Sobre Embedded-hal
El paquete es adecuado para escribir controladores universales en Rust para varios sensores, pantallas, unidades y adaptadores de red que no están vinculados a modelos de microcontroladores específicos, es decir, el controlador creado sobre la base de embeded_hal se puede utilizar con cualquier microcontrolador para el que se proporcione una capa HAL en el paquete.
El paquete también proporciona un sistema de manejo de errores incorporado flexible: para cada tipo de error hay un tipo de error, que admite herramientas para depurar y rastrear las causas de los errores.
Dentro de los principales objetivos de Embedded-hal se destacan los siguientes:
- Sin detalles específicos del dispositivo: ni el registro, ni los bloques de registro, es decir, ningún valor específico de un dispositivo debe aparecer en la API.
- Debe ser genérico dentro de un dispositivo y entre dispositivos. La API para utilizar una interfaz debe ser la misma, independientemente de la implementación, utilizada.
- Siempre que sea posible, no debe estar vinculado a un modelo asincrónico específico.
- Debe ser mínimo y, por lo tanto, fácil de implementar, pero altamente componible.
- Servir como base para construir un ecosistema de controladores independientes de la plataforma. Aquí, controlador significa que permite que una plataforma de destino interactúe con un dispositivo externo como un sensor digital o un transceptor inalámbrico.
- Los métodos de rasgos deben ser falibles para que puedan usarse en cualquier situación posible.
¿Qué hay de nuevo en Embedded-hal 1.0?
Embedded-hal 1.0 representa la culminación de los esfuerzos desde 2020 para garantizar estabilidad y confiabilidad. Con la versión 1.0 ahora disponible, todos los rasgos de capa de abstracción de hardware (HAL) incluidos se consideran estables, sentando una base sólida para futuras mejoras y expansiones.
Embedded-hal 1.0 se presenta como la primera versión estable del proyecto y junto con lo cual también se han formado las versiones estables de los paquetes complementarios como embedded-hal-async, que facilita la creación de controladores asíncronos, y embedded-hal-nb, que implementa un modelo de sondeo de estado en modo de sondeo.
Junto con estos paquetes, se ofrecen herramientas adicionales como hal-bus, diseñado para trabajar con buses SPI e I2C, CAN, con soporte para el bus CAN (Controller Area Network) e IO, que proporciona implementaciones de tipos para entrada/salida orientada a bytes, ideal para su uso con UART y otros periféricos.
Además de ello, también se destaca lo siguiente:
Enfoque en controladores: En respuesta a los comentarios de los usuarios y los requisitos en evolución, embedded-hal 1.0 enfatiza el desarrollo de controladores genéricos, simplificando las API y eliminando las complejidades de interoperabilidad.
Soporte asíncrono: Una adición notable es la biblioteca embedded-hal-async, que ofrece versiones asíncronas de los rasgos. Aprovechando el soporte de Rust 1.75 para rasgos asíncronos en Rust estable, los desarrolladores ahora pueden utilizar funcionalidades asíncronas sin recurrir a asignaciones de memoria dinámica o despacho dinámico. Esta mejora facilita el desarrollo y se alinea con las prácticas modernas de Rust.
Compartición de Bus SPI: El rasgo SpiDevice introduce soporte para compartir un bus SPI entre múltiples dispositivos, cada uno distinguido por su pin CS individual. Esto permite una comunicación fluida entre controladores y dispositivos no relacionados en el mismo bus, mejorando la flexibilidad y la utilización de recursos.
Manejo de errores: Los controladores genéricos se benefician de capacidades avanzadas de manejo de errores, con el requisito de que los controladores implementen un rasgo «Error», que permite la inspección y clasificación de errores. Este enfoque estandarizado garantiza un manejo robusto de errores en diferentes implementaciones HAL.
Integración de embedded-IO: El proyecto embedded-hal incluye las bibliotecas embedded-io, que ofrecen rasgos para flujos de E/S orientados a bytes. Con los rasgos específicos de UART migrados a embedded-io, los desarrolladores pueden esperar un enfoque unificado y simplificado para la comunicación serie.
La liberación de embedded-hal 1.0 marca un avance significativo en el ecosistema de Rust. Finalmente para los que estén interesados en poder conocer más al respecto sobre los desarrollos del proyecto, deben saber que son distribuidos bajo la licencia Apache 2.0.
Fuente: https://blog.rust-embedded.org