Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial Internet of Things >> Incrustado

Memoria de partición:introducción y servicios básicos


Ver la serie RTOS Revealed

Las particiones de memoria se introdujeron en un artículo anterior, donde una comparación con el estándar C malloc () se hizo la función. Una partición es un área de memoria obtenida de un grupo de particiones. Esto ofrece un medio flexible para que las tareas obtengan y liberen el almacenamiento de datos de una manera determinista y confiable.

Uso de particiones

En Nucleus SE, los grupos de particiones se configuran en el momento de la compilación. Puede haber un máximo de 16 grupos de particiones configurados para una aplicación. Si no se configuran grupos de particiones, la aplicación no incluye estructuras de datos ni códigos de llamada de servicio pertenecientes a los grupos de particiones.

Un grupo de particiones es simplemente un área de memoria, que se divide en un número específico de particiones de tamaño fijo. El usuario tiene control total sobre el tamaño y la cantidad de particiones en cada grupo. Las tareas pueden solicitar que se le asignen particiones de memoria y recibir un puntero al área de almacenamiento. Es responsabilidad de la tarea no escribir datos fuera de la partición. La partición puede ser desasignada por cualquier tarea pasando el puntero a una función API. Solicitar la asignación de una partición, cuando no hay más disponibles, puede resultar en un error o la suspensión de la tarea, según las opciones seleccionadas en la llamada API y la configuración de Nucleus SE.

Configuración de particiones de memoria

Cantidad de grupos de particiones

Como ocurre con la mayoría de los aspectos de Nucleus SE, la configuración de los grupos de particiones se controla principalmente mediante #define declaraciones en nuse_config.h . La configuración de la clave es NUSE_PARTITION_POOL_NUMBER , que determina cuántos grupos de particiones están configurados para la aplicación. La configuración predeterminada es 0 (es decir, no hay grupos de particiones en uso) y puede establecerlo en cualquier valor hasta 16. Un valor erróneo dará como resultado un error de tiempo de compilación, que se genera mediante una prueba en nuse_config_check.h (esto está incluido en nuse_config.c y por lo tanto compilado con este módulo) resultando en un #error declaración que se está compilando.

La elección de un valor distinto de cero es la "habilitación maestra" para los grupos de particiones. Esto da como resultado que algunas estructuras de datos se definan y dimensionen en consecuencia. Las estructuras de datos en ROM requieren inicialización a valores adecuados que caracterizan a cada grupo de particiones. Más sobre estructuras de datos en el próximo artículo. También activa la configuración de habilitación de API.

API habilitadas

Cada función de API (llamada de servicio) en Nucleus SE tiene un #define habilitante símbolo en nuse_config.h . Para los grupos de particiones, estos son:

NUSE_PARTITION_ALLOCATE

NUSE_PARTITION_DEALLOCATE

NUSE_PARTITION_POOL_INFORMATION

NUSE_PARTITION_POOL_COUNT

De forma predeterminada, todos estos están configurados como FALSO . , deshabilitando así cada llamada de servicio e inhibiendo la inclusión de cualquier código de implementación. Para configurar grupos de particiones para una aplicación, debe seleccionar las llamadas a la API que desea usar y establecer sus símbolos de habilitación en TRUE .

A continuación, se muestra un extracto del nuse_config.h predeterminado. archivo:

Se producirá un error de tiempo de compilación si se habilita una función de API de grupo de particiones y no se configuran grupos de particiones (excepto NUSE_Partition_Pool_Count () que siempre está permitido). Si su código utiliza una llamada a la API, que no se ha habilitado, se producirá un error de tiempo de enlace, ya que no se habrá incluido ningún código de implementación en la aplicación.

Llamadas de servicio del grupo de particiones

Nucleus RTOS admite siete llamadas de servicio, que pertenecen a grupos de particiones que brindan la siguiente funcionalidad:

La implementación de cada una de estas llamadas de servicio se examina en detalle.

Cabe señalar que no se proporciona ninguna función de reinicio (ni en Nucleus RTOS ni en Nucleus SE). Esto es intencional. Es una práctica muy común que una tarea asigne una partición y pase un puntero a otra tarea (que probablemente la desasignará más adelante). Si se restableciera un grupo de particiones, todas las particiones se marcarían como no utilizadas, pero no hay forma de rastrear y notificar todas las tareas que pueden estar usando las particiones.

Servicios de asignación y desasignación de particiones

Las operaciones fundamentales, que se pueden realizar en un grupo de particiones, son asignar una partición (es decir, marcar una partición como usada y devolver su dirección) desde ella y desasignar una partición (es decir, marcar una partición como no usada). Nucleus RTOS y Nucleus SE proporcionan dos llamadas API básicas para estas operaciones, que se analizarán aquí.

Asignar una partición

La llamada a la API de Nucleus RTOS para asignar una partición es muy flexible, lo que le permite suspender indefinidamente, o con un tiempo de espera, si la operación no se puede completar de inmediato; es decir, intenta asignar una partición de un grupo en el que todas las particiones están asignadas actualmente. Nucleus SE proporciona el mismo servicio, excepto que la suspensión de tareas es opcional y el tiempo de espera no está implementado.

Llamada a la API Nucleus RTOS para la asignación de particiones

Prototipo de llamada de servicio:

STATUS NU_Allocate_Partition (NU_PARTITION_POOL * pool,
VOID ** return_pointer, UNSIGNED suspender);

Devoluciones:

NU_SUCCESS - la llamada se completó con éxito

NU_NO_PARTITION - no hay particiones disponibles

NU_INVALID_POOL - el puntero del grupo de particiones no es válido

NU_INVALID_POINTER - el puntero de retorno de datos es NULL

NU_INVALID_SUSPEND - se intentó suspender desde un hilo que no es de tarea

NU_TIMEOUT - ninguna partición está disponible incluso después de suspender durante el período de tiempo de espera especificado

NU_POOL_DELETED - el grupo de particiones se eliminó mientras la tarea estaba suspendida

Llamada a la API de Nucleus SE para la asignación

Esta llamada a la API admite la funcionalidad clave de la API Nucleus RTOS.

Prototipo de llamada de servicio:

STATUS NUSE_Partition_Allocate (grupo NUSE_PARTITION_POOL, ADDR * return_pointer, U8 suspender);

Parámetros:

grupo - el índice (ID) del grupo de particiones que se utilizará

return_pointer - un puntero a una variable de tipo ADDR que recibirá la dirección de la partición asignada

suspender - especificación para la suspensión de tareas; puede ser NUSE_NO_SUSPEND o NUSE_SUSPEND

Devoluciones:

NUSE_SUCCESS - la llamada se completó con éxito

NUSE_NO_PARTITION - no hay particiones disponibles

NUSE_INVALID_POOL - el índice del grupo de particiones no es válido

NUSE_INVALID_POINTER - el puntero de retorno de datos es NULL

NUSE_INVALID_SUSPEND - se intentó suspender desde un hilo que no es de tarea o cuando el bloqueo de llamadas a la API no estaba habilitado


Incrustado

  1. Introducción al acero inoxidable y cómo se fabrica
  2. Términos y conceptos de la memoria digital
  3. Entrada y salida básica de C#
  4. Gestión de memoria C++:nuevo y eliminar
  5. Buzones de correo:introducción y servicios básicos
  6. Semáforos:servicios públicos y estructuras de datos
  7. Semáforos:introducción y servicios básicos
  8. Grupos de indicadores de eventos:introducción y servicios básicos
  9. Colas:introducción y servicios básicos
  10. Rutronik y AP Memory firman un acuerdo de distribución global
  11. Servicios de rectificado de superficies:proceso y precisión