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

Semaforos en Nucleus RTOS: Servicios de utilidad y estructuras de datos

Semaforos en Nucleus RTOS: Servicios de utilidad y estructuras de datos
Ver la serie RTOS Revealed

Este artículo continúa la mirada a los semáforos.

Servicios de Utilidad de Semáforos

Nucleus RTOS ofrece cuatro llamadas API que proporcionan utilidades esenciales para la gestión de semáforos: reiniciar un semáforo, recuperar información detallada del semáforo, contar el número total de semáforos en una aplicación y obtener punteros a todos los objetos semáforo. Las tres primeras funciones están completamente implementadas en Nucleus SE.

Reiniciar un Semáforo

A diferencia de la mayoría de objetos del kernel, reiniciar un semáforo lo restaura a un conteo inicial especificado en lugar de simplemente reinicializarlo a su valor en tiempo de compilación. Cualquier tarea bloqueada en el semáforo es despertada inmediatamente y recibe el código de retorno NUSE_SEMAPHORE_WAS_RESET (o NU_SEMAPHORE_RESET en Nucleus RTOS).

Llamada API de Nucleus RTOS para Reiniciar un Semáforo

Prototipo de llamada de servicio:

STATUS NU_Reset_Semaphore(NU_SEMAPHORE *semaphore,
UNSIGNED initial_count);

Parámetros:

semaphore – puntero al bloque de control del semáforo suministrado por el usuario.

initial_count – el valor al que se debe establecer el contador del semáforo.

Retorna:

NU_SUCCESS – la operación completó con éxito.

NU_INVALID_SEMAPHORE – el puntero del semáforo no es válido.

Llamada API de Nucleus SE para Reiniciar un Semáforo

Prototipo de llamada de servicio:

STATUS NUSE_Semaphore_Reset(NUSE_SEMAPHORE semaphore,
U8 initial_count);

Parámetros:

semaphore – el índice (ID) del semáforo a reiniciar.

initial_count – el valor al que se debe establecer el contador del semáforo.

Retorna:

NUSE_SUCCESS – la operación completó con éxito.

NUSE_INVALID_SEMAPHORE – el índice del semáforo no es válido.

Implementación de Nucleus SE para Reiniciar Semáforo

La rutina NUSE_Semaphore_Reset() valida sus argumentos y luego escribe el nuevo conteo en el array NUSE_Semaphore_Counter[]. Cuando el bloqueo está habilitado, recorre la tabla de tareas para localizar cualquier tarea suspendida en el semáforo, las marca como listas, asigna el código de retorno NUSE_SEMAPHORE_WAS_RESET y finalmente dispara una reprogramación si el planificador de prioridad está activo.

while (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; for (index = 0; index < NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { NUSE_Task_Blocking_Return[index] = NUSE_SEMAPHORE_WAS_RESET; NUSE_Task_Status[index] = NUSE_READY; break; } } NUSE_Semaphore_Blocking_Count[semaphore]--; } #if NUSE_SCHEDULER_TYPE == NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK); #endif

Por lo tanto, todas las tareas suspendidas pasan al estado listo con el código de retorno apropiado. Si el planificador de prioridad está activo, NUSE_Reschedule() asegura que tareas de mayor prioridad puedan anteponer a las de menor prioridad.

Información de Semáforo

Esta llamada de servicio recupera detalles clave sobre un semáforo. En Nucleus SE, se devuelven menos campos porque el nombramiento de objetos, orden de suspensión y suspensión de tareas pueden no estar soportados.

Llamada API de Nucleus RTOS para Información de Semáforo

Prototipo de llamada de servicio:

STATUS NU_Semaphore_Information(NU_SEMAPHORE *semaphore,
CHAR *name, UNSIGNED *current_count, OPTION *suspend_type,
UNSIGNED *tasks_waiting, NU_TASK **first_task);

Parámetros:

semaphore – puntero al bloque de control del semáforo solicitado.

name – buffer de destino para el nombre del semáforo (8 caracteres más terminador nulo).

current_count – recibe el valor actual del contador del semáforo.

suspend_type – recibe la política de suspensión (p. ej., NU_FIFO o NU_PRIORITY).

tasks_waiting – recibe el número de tareas suspendidas en el semáforo.

first_task – recibe un puntero al bloque de control de la primera tarea suspendida.

Retorna:

NU_SUCCESS – la llamada completó con éxito.

NU_INVALID_SEMAPHORE – el puntero del semáforo es inválido.

Llamada API de Nucleus SE para Información de Semáforo

Prototipo de llamada de servicio:

STATUS NUSE_Semaphore_Information(NUSE_SEMAPHORE semaphore,
U8 *current_count, U8 *tasks_waiting, NUSE_TASK *first_task);

Parámetros:

semaphore – el índice del semáforo.

current_count – recibe el valor actual del contador.

tasks_waiting – recibe el número de tareas suspendidas (si la suspensión de tareas está habilitada).

first_task – recibe el índice de la primera tarea suspendida (si la suspensión de tareas está habilitada).

Retorna:

NUSE_SUCCESS – la llamada completó con éxito.

NUSE_INVALID_SEMAPHORE – el índice del semáforo es inválido.

NUSE_INVALID_POINTER – uno o más argumentos puntero son inválidos.

Implementación de Nucleus SE para Información de Semáforo

La implementación es concisa: entra en sección crítica, copia el valor del contador y, si el bloqueo está habilitado, enumera la tabla de tareas para contar tareas en espera e identificar la primera tarea suspendida. De lo contrario, el conteo de espera y la primera tarea se establecen a cero.

NUSE_CS_Enter(); *current_count = NUSE_Semaphore_Counter[semaphore]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Semaphore_Blocking_Count[semaphore]; if (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; for (index = 0; index < NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { *first_task = index; break; } } } else { *first_task = 0; } #else *tasks_waiting = 0; *first_task = 0; #endif NUSE_CS_Exit(); return NUSE_SUCCESS;

Obtención del Número de Semáforos

Este servicio retorna el total de semáforos definidos en la aplicación. En Nucleus RTOS el valor puede cambiar en tiempo de ejecución; en Nucleus SE es fijo en tiempo de compilación.

Llamada API de Nucleus RTOS para Conteo de Semáforos

Prototipo de llamada de servicio:

UNSIGNED NU_Established_Semaphores(VOID);

Retorna:

El número de semáforos creados en la aplicación.

Llamada API de Nucleus SE para Conteo de Semáforos

Prototipo de llamada de servicio:

U8 NUSE_Semaphore_Count(void);

Retorna:

El número de semáforos configurados en la aplicación.

Implementación de Nucleus SE para Conteo de Semáforos

La rutina simplemente retorna el valor de la constante en tiempo de compilación NUSE_SEMAPHORE_NUMBER.

Continuar a página dos: “Estructuras de Datos” >>

Incrustado

  1. Fundamentos de Memoria Digital: Direccionamiento, Acceso y Volatilidad
  2. Estructuras vs Clases en C++: Guía práctica para desarrolladores embebidos
  3. Buzones en Nucleus SE: Guía práctica de configuración y uso
  4. Semaforos en Nucleus SE: Visión general, configuración y API esenciales
  5. Dominando grupos de banderas de evento: Servicios de utilidad y estructuras de datos en Nucleus RTOS/SE
  6. Grupos de banderas de evento en Nucleus SE: Guía introductoria de configuración y uso de API
  7. Colas en Nucleus SE: Introducción y llamadas de servicio principales
  8. Swissbit muestra seguridad hardware de vanguardia para dispositivos IoT en it‑sa
  9. Cloud vs. servidores on-premise: eligiendo la solución de hosting adecuada
  10. Microsoft Azure anuncia servicios de tokenización Blockchain y gestión de datos
  11. Domine variables y tipos de datos primitivos en C#: Guía completa