Buzones en Nucleus SE: Guía práctica de configuración y uso
Ver la serie RTOS Revealed
Los buzones (mailboxes) se introdujeron en un artículo anterior como uno de los mecanismos de comunicación entre tareas más sencillos en Nucleus SE —justo después de las señales. Ofrecen una forma de bajo coste y altamente flexible de transferir datos simples entre tareas.
Uso de Buzones
En Nucleus SE, los buzones se definen en tiempo de compilación. Se pueden configurar un máximo de 16 buzones por aplicación. Si configura cero buzones, el compilador omite todas las estructuras de datos y código API relacionados, manteniendo el binario ligero.
Un buzón es esencialmente una ranura de almacenamiento que puede contener una sola variable de tipo ADDR. Solo una tarea puede escribir en un buzón a la vez. Una vez lleno, los intentos de escritura subsiguientes fallarán hasta que el buzón se lea o reinicie. Dependiendo de las opciones de la API, un intento de escribir en un buzón lleno puede devolver un error o suspender la tarea hasta que haya espacio disponible.
Buzones vs. Colas
Algunos sistemas operativos reemplazan los buzones con una cola de una sola entrada. Aunque una cola puede imitar el comportamiento de un buzón, conlleva sobrecarga extra —punteros de cabeza y cola, estructuras de datos más grandes y más caminos de código— lo que conduce a mayor uso de memoria y tiempo de ejecución.
En Nucleus SE, puede elegir entre buzones o colas. Si su diseño usa muchas colas pero pocos buzones, cambiar un buzón por una cola aumentará ligeramente el tamaño de datos pero eliminará código API específico de buzón, simplificando el mantenimiento. Es fácil probar ambas configuraciones para comparar huella de memoria y rendimiento.
Las colas se cubrirán en un artículo futuro.
Configuración de Buzones
Número de Buzones
La macro clave en nuse_config.h es NUSE_MAILBOX_NUMBER. El valor por defecto es 0, lo que significa que no hay buzones habilitados. Puede establecerlo en cualquier entero entre 1 y 16. Una comprobación en tiempo de compilación en nuse_config_check.h lanzará un error si el valor está fuera de rango.
Establecer un valor no cero activa el subsistema de buzones: las estructuras de datos se dimensionan y los símbolos de habilitación de API se procesan.
Habilitación de API
Cada llamada API de buzón tiene un #define correspondiente en nuse_config.h:
NUSE_MAILBOX_SENDNUSE_MAILBOX_RECEIVENUSE_MAILBOX_RESETNUSE_MAILBOX_INFORMATIONNUSE_MAILBOX_COUNT
Por defecto todos están en FALSE, deshabilitando la llamada y su implementación. Para usar una API, habilite la macro correspondiente estableciéndola en TRUE. Habilitar una API sin buzones configurados causará un error en tiempo de compilación (excepto NUSE_Mailbox_Count(), que siempre está disponible). Usar una API deshabilitada producirá un error en tiempo de enlace.
/* Número de buzones en el sistema – 0-16 */ #define NUSE_MAILBOX_NUMBER 0 /* Habilitadores de llamadas de servicio: */ #define NUSE_MAILBOX_SEND FALSE #define NUSE_MAILBOX_RECEIVE FALSE #define NUSE_MAILBOX_RESET FALSE #define NUSE_MAILBOX_INFORMATION FALSE #define NUSE_MAILBOX_COUNT FALSE
Llamadas de Servicio de Buzón
Nucleus SE ofrece nueve llamadas de servicio relacionadas con buzones. Las implementadas en SE son:
- NUSE_Mailbox_Send() – escribir un mensaje en un buzón.
- NUSE_Mailbox_Receive() – leer un mensaje de un buzón.
- NUSE_Mailbox_Reset() – limpiar un buzón sin suspender tareas.
- NUSE_Mailbox_Information() – consultar estado de un buzón.
- NUSE_Mailbox_Count() – devolver el número de buzones configurados.
Otras funciones como creación, borrado, recuperación masiva y broadcast no están implementadas en SE.
Operaciones de Escritura y Lectura
Los buzones soportan dos operaciones principales: envío (escritura) y recepción (lectura). Ambas APIs están disponibles en Nucleus RTOS y Nucleus SE, con algunas diferencias en flexibilidad y manejo de errores.
Envío a un Buzón
En Nucleus RTOS la llamada NU_Send_To_Mailbox soporta suspensión indefinida o temporizada si el buzón está lleno. Nucleus SE ofrece una versión simplificada: la suspensión es opcional y los timeouts no se soportan.
Prototipo de muestra para Nucleus SE:
STATUS NUSE_Mailbox_Send(NUSE_MAILBOX mailbox, ADDR *message, U8 suspend);
Parámetros:
mailbox– índice del buzón.message– puntero a una variableADDR.suspend–NUSE_NO_SUSPENDoNUSE_SUSPEND.
Valores de retorno incluyen NUSE_SUCCESS, NUSE_INVALID_MAILBOX, NUSE_MAILBOX_FULL y NUSE_MAILBOX_WAS_RESET.
Resumen de Implementación
Cuando el bloqueo está deshabilitado, la rutina comprueba la bandera de estado del buzón. Si el buzón está vacío, escribe el dato y marca el buzón como lleno; en caso contrario devuelve NUSE_MAILBOX_FULL.
Con bloqueo habilitado, el código hace un bucle hasta que el mensaje se publica con éxito o la tarea es despertada por una operación de recepción. Si una tarea está suspendida en el buzón, se reanuda inmediatamente después de un envío exitoso.
El siguiente extracto demuestra la lógica central cuando el bloqueo está habilitado (simplificado para legibilidad):
do { if (!NUSE_Mailbox_Status[mailbox]) { // Buzón vacío – almacenar datos y despertar tarea en espera si la hay. } else if (suspend == NUSE_NO_SUSPEND) { return NUSE_MAILBOX_FULL; } else { // Suspender tarea hasta que el buzón quede vacío. } } while (suspend == NUSE_SUSPEND);
En resumen, la API de buzón equilibra simplicidad y flexibilidad, permitiendo a los desarrolladores elegir entre fallo inmediato o suspensión de tarea según los requisitos de temporización de su aplicación.
Incrustado
- Cerraduras de leva (cam locks) explicadas: cómo aseguran gabinetes discretamente
- ¿Qué Son los Tornillos de Ojo (Eye Screws)? Guía Profesional de Diseño y Usos
- Entendiendo los ojales (grommets): tipos, usos y cómo protegen sus equipos
- Acero inoxidable explicado: composición, producción e impacto global
- Semaforos en Nucleus RTOS: Servicios de utilidad y estructuras de datos
- Semaforos en Nucleus SE: Visión general, configuración y API esenciales
- Dominando grupos de banderas de evento: Servicios de utilidad y estructuras de datos en Nucleus RTOS/SE
- Grupos de banderas de evento en Nucleus SE: Guía introductoria de configuración y uso de API
- Colas en Nucleus SE: Introducción y llamadas de servicio principales
- COVID-19 y la nube: Cómo los grandes proveedores empoderaron a las empresas durante la pandemia
- Fundamentos de C#: Entrada y salida esenciales