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

Semáforos:servicios públicos 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áforo

Nucleus RTOS tiene cuatro llamadas API que proporcionan funciones de utilidad asociadas con semáforos:restablecer el semáforo, devolver información sobre un semáforo, devolver el número de semáforos en la aplicación y devolver punteros a todos los semáforos en la aplicación. Los tres primeros se implementan en Nucleus SE.

Restablecimiento de un semáforo

Esta llamada a la API restaura el semáforo a su estado inicial sin uso. Esta función API es inusual, comparada con la disponible para otros objetos del kernel, ya que, aunque es un reinicio, no simplemente inicializa su contador al valor de inicio; se proporciona un nuevo recuento inicial en la llamada. Todas las tareas que se suspendieron en el semáforo se reanudan y reciben un código de retorno de NUSE_SEMAPHORE_WAS_RESET (en Nucleus SE o NU_SEMAPHORE_RESET con Nucleus RTOS).

Llamada a la API Nucleus RTOS para restablecer un semáforo

Prototipo de llamada de servicio:

ESTADO NU_Reset_Semaphore (NU_SEMAPHORE * semáforo,
UNSIGNED initial_count);

Parámetros:

semáforo - puntero al bloque de control de semáforo proporcionado por el usuario

cuenta_inicial - el valor al que se establecerá el contador del semáforo

Devoluciones:

NU_SUCCESS - la llamada se completó con éxito

NU_INVALID_SEMAPHORE - el puntero del semáforo no es válido

Llamada a la API de Nucleus SE para restablecer un semáforo

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

Prototipo de llamada de servicio:

STATUS NUSE_Semaphore_Reset (semáforo NUSE_SEMAPHORE,
U8 initial_count);

Parámetros:

semáforo - el índice (ID) del semáforo que se restablecerá

cuenta_inicial - el valor al que se establecerá el contador del semáforo

Devoluciones:

NUSE_SUCCESS - la llamada se completó con éxito

NUSE_INVALID_SEMAPHORE - el índice de semáforo no es válido

Implementación de Nucleus SE de Semaphore Reset

El trabajo principal de NUSE_Semaphore_Reset () La función de la API, después de la verificación de parámetros, es simplemente establecer la entrada apropiada en NUSE_Semaphore_Counter [] al valor inicial proporcionado.

Cuando el bloqueo está habilitado, se requiere más código para desbloquear tareas:

 while (NUSE_Semaphore_Blocking_Count [semáforo]! =0) {índice U8; / * comprobar si hay tareas bloqueadas * / / * en este semáforo * / for (index =0; index  

Cada tarea suspendida en el semáforo se marca como "lista" con un código de retorno de suspensión de NUSE_SEMAPHORE_WAS_RESET . Una vez que se completa este proceso, si el programador de prioridad está en uso, se realiza una llamada a NUSE_Reschedule () , ya que es posible que se hayan preparado una o más tareas de mayor prioridad y es necesario permitir que se ejecuten.

Información del semáforo

Esta llamada de servicio obtiene una selección de información sobre un semáforo. La implementación de Nucleus SE se diferencia de Nucleus RTOS en que devuelve menos información, ya que no se admiten la asignación de nombres de objetos y el orden de suspensión y es posible que la suspensión de tareas no esté habilitada.

Llamada a la API Nucleus RTOS para obtener información sobre el semáforo

Prototipo de llamada de servicio:

ESTADO NU_Semaphore_Information (NU_SEMAPHORE * semáforo,
CHAR * nombre, UNSIGNED * current_count, OPTION * suspend_type,
UNSIGNED * tasks_waiting, NU_TASK ** first_task);

Parámetros:

semáforo - puntero en la parte superior del bloque de control del semáforo sobre el que se solicita información

nombre - puntero a un área de destino de 8 caracteres para el nombre del semáforo; esto incluye espacio para el terminador nulo

cuenta_actual - un puntero a una variable, que recibirá el valor actual del contador de semáforo

suspend_type - puntero a una variable que contiene el tipo de suspensión de la tarea; los tipos de suspensión de tareas válidos son NU_FIFO y NU_PRIORITY

tareas_en espera - un puntero a una variable que recibirá el número de tareas suspendidas en este semáforo

primera_tarea - un puntero a una variable de tipo NU_TASK que recibirá un puntero al bloque de control de la primera tarea suspendida

Devoluciones:

NU_SUCCESS - la llamada se completó con éxito

NU_INVALID_SEMAPHORE - el puntero del semáforo no es válido

Llamada a la API de Nucleus SE para obtener información sobre el semáforo

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

Prototipo de llamada de servicio:

STATUS NUSE_Semaphore_Information (semáforo NUSE_SEMAPHORE,
U8 * cuenta_actual, U8 * tareas_en espera, NUSE_TASK * primera_tarea);

Parámetros:

semáforo - el índice del semáforo sobre el que se solicita información

cuenta_actual - un puntero a una variable, que recibirá el valor actual del contador de semáforo

tareas_en espera - un puntero a una variable que recibirá el número de tareas suspendidas en este semáforo (no se devuelve nada si la suspensión de tareas está deshabilitada)

primera_tarea - un puntero a una variable de tipo NUSE_TASK que recibirá el índice de la primera tarea suspendida (no se devuelve nada si la suspensión de la tarea está deshabilitada)

Devoluciones:

NUSE_SUCCESS - la llamada se completó con éxito

NUSE_INVALID_SEMAPHORE - el índice de semáforo no es válido

NUSE_INVALID_POINTER - uno o más de los parámetros del puntero no es válido

Implementación de información de semáforos de Nucleus SE

La implementación de esta llamada a la API es bastante sencilla:

 NUSE_CS_Enter (); * current_count =NUSE_Semaphore_Counter [semáforo]; # si NUSE_BLOCKING_ENABLE * tasks_waiting =NUSE_Semaphore_Blocking_Count [semáforo]; if (NUSE_Semaphore_Blocking_Count [semáforo]! =0) {índice U8; for (index =0; index  

La función devuelve el estado del semáforo. Luego, si el bloqueo de llamadas a la API está habilitado, se devuelve el número de tareas en espera y el índice de la primera (de lo contrario, estos dos parámetros se establecen en 0).

Obtener el número de semáforos

Esta llamada de servicio devuelve el número de semáforos configurados en la aplicación. Mientras que en Nucleus RTOS esto variará con el tiempo y el valor devuelto representará el número actual de semáforos, en Nucleus SE el valor devuelto se establece en el momento de la compilación y no puede cambiar.

Llamada a la API Nucleus RTOS para recuento de semáforos

Prototipo de llamada de servicio:

UNSIGNED NU_Established_Semaphores (VOID);

Parámetros:

Ninguno

Devoluciones:

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

Llamada a la API de Nucleus SE para el recuento de semáforos

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

Prototipo de llamada de servicio:

U8 NUSE_Semaphore_Count (void);

Parámetros:

Ninguno

Devoluciones:

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

Implementación de Nucleus SE de Semaphore Count

La implementación de esta llamada a la API es casi trivialmente simple:el valor de #define símbolo NUSE_SEMAPHORE_NUMBER se devuelve.

Continúe en la página dos:"Estructuras de datos">>


Incrustado

  1. Ventajas y desventajas de los servicios en la nube frente a los servicios internos
  2. Servicios de gestión de datos y token de cadena de bloques de Microsoft Azure
  3. Términos y conceptos de la memoria digital
  4. Variables de C# y tipos de datos (primitivos)
  5. Estructuras y clases en C ++
  6. Buzones de correo:introducción y servicios básicos
  7. Semáforos:introducción y servicios básicos
  8. Grupos de indicadores de eventos:servicios públicos y estructuras de datos
  9. Grupos de indicadores de eventos:introducción y servicios básicos
  10. Colas:introducción y servicios básicos
  11. Swissbit:soluciones de seguridad basadas en hardware para proteger datos y dispositivos