Memoria de partición en Nucleus SE: Configuración, APIs y mejores prácticas
Ver la serie RTOS Revealed
Las particiones de memoria se introdujeron en nuestro artículo anterior, donde las comparamos con la función C convencional malloc(). Una partición es un bloque de memoria de tamaño fijo que proviene de un pool de particiones, ofreciendo asignación y desasignación deterministas en las que las tareas pueden confiar.
Uso de Particiones
En Nucleus SE, los pools de particiones se definen en tiempo de compilación. Hasta 16 pools pueden configurarse por aplicación. Si no se definen pools, todas las estructuras de datos y código API relacionados se omiten de la compilación, manteniendo la huella mínima.
Un pool es simplemente un área de memoria contigua dividida en un número determinado de particiones idénticas. La aplicación controla el tamaño y conteo de cada pool. Las tareas solicitan una partición y reciben un puntero al bloque. Es responsabilidad del llamador permanecer dentro de los límites asignados. Una partición puede devolverse al pool por cualquier tarea vía la API de desasignación. Si el pool se agota, la llamada puede devolver un error o suspender la tarea, dependiendo de los parámetros de la API y opciones de compilación.
Configuración de Particiones de Memoria
Número de Pools de Particiones
Los pools de particiones se habilitan mediante sentencias #define en nuse_config.h. El símbolo clave es NUSE_PARTITION_POOL_NUMBER, que establece el conteo de pools. El valor por defecto es 0, significando que no hay pools activos. Los valores válidos van de 1 a 16; un valor inválido dispara un error #error en tiempo de compilación generado por nuse_config_check.h.
Establecer un valor no cero activa las estructuras de datos necesarias e inicializarlas en ROM. También desbloquea los símbolos de habilitación de API descritos a continuación.
Habilitación de API
Cada llamada de servicio tiene una macro de habilitación en nuse_config.h. Para particiones existen los siguientes símbolos:
NUSE_PARTITION_ALLOCATENUSE_PARTITION_DEALLOCATENUSE_PARTITION_POOL_INFORMATIONNUSE_PARTITION_POOL_COUNT
Por defecto todas están en FALSE, eliminando la implementación de la compilación. Para usar una característica, establezca la macro correspondiente en TRUE. Habilitar una API sin pools definidos (excepto NUSE_Partition_Pool_Count()) resulta en error en tiempo de compilación. Usar una API no habilitada causa error en tiempo de enlace.

Llamadas de Servicio de Pool de Particiones
Nucleus RTOS ofrece siete llamadas de servicio para pools de particiones. En Nucleus SE, solo las APIs centrales de asignación y desasignación están implementadas. La tabla a continuación lista cada llamada, su estado de implementación y una breve descripción:
| API | Implementación | Descripción |
|---|---|---|
NU_Allocate_Partition() | Implementado | Asignar una partición. |
NU_Deallocate_Partition() | Implementado | Liberar una partición. |
NU_Partition_Pool_Information() | Implementado | Recuperar metadatos del pool. |
NU_Established_Partition_Pools() | Implementado | Contar pools activos. |
NU_Create_Partition_Pool() | No implementado | Creación dinámica de pool. |
NU_Delete_Partition_Pool() | No implementado | Borrado dinámico de pool. |
NU_Partition_Pool_Pointers() | No implementado | Retornar punteros de pool. |
Tenga en cuenta que ni Nucleus RTOS ni SE proporcionan una rutina de reset para pools de particiones. Esta elección de diseño refleja casos de uso típicos donde una tarea asigna una partición y pasa su puntero a otra tarea que eventualmente la desasignará. Resetear un pool marcaría silenciosamente todas las particiones como libres, rompiendo el contrato a nivel de tarea.
Servicios de Asignación y Desasignación
Las operaciones centrales son:
- Asignar: marcar una partición como usada y retornar su dirección.
- Desasignar: marcar una partición como libre.
API de Asignación de Nucleus RTOS
Prototipo:
STATUS NU_Allocate_Partition(NU_PARTITION_POOL *pool, VOID **return_pointer, UNSIGNED suspend);
Valores de retorno incluyen NU_SUCCESS, NU_NO_PARTITION, NU_INVALID_POOL, NU_INVALID_POINTER, NU_INVALID_SUSPEND, NU_TIMEOUT y NU_POOL_DELETED.
API de Asignación de Nucleus SE
Prototipo:
STATUS NUSE_Partition_Allocate(NUSE_PARTITION_POOL pool, ADDR *return_pointer, U8 suspend);
Parámetros:
pool – índice del pool a usar.return_pointer – dirección del bloque asignado.suspend –NUSE_NO_SUSPENDoNUSE_SUSPEND.
Los códigos de retorno reflejan los de RTOS pero con prefijo NUSE_. Solicitudes de suspensión inválidas desde hilos no-tarea o cuando APIs de bloqueo están deshabilitadas producen NUSE_INVALID_SUSPEND.
Para un recorrido completo de la implementación, vea los artículos subsiguientes en la serie RTOS Revealed.
Incrustado
- Servicios de Rectificado de Superficies de Precisión: Proceso Experto y Calidad
- Fundamentos de Memoria Digital: Direccionamiento, Acceso y Volatilidad
- Acero inoxidable explicado: composición, producción e impacto global
- Buzones en Nucleus SE: Guía práctica de configuración y uso
- Semaforos en Nucleus RTOS: Servicios de utilidad y estructuras de datos
- Semaforos en Nucleus SE: Visión general, configuración y API esenciales
- 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
- Rutronik se convierte en distribuidor exclusivo europeo de IoT RAM de AP Memory bajo acuerdo global
- Fundamentos de C#: Entrada y salida esenciales
- Dominando la gestión de memoria en C++: uso experto de new y delete