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:introducción y servicios básicos


Ver la serie RTOS Revealed

Los semáforos se introdujeron en un artículo anterior. Su uso principal es el control del acceso a los recursos.

Uso de semáforos

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

Un semáforo es simplemente un contador de tipo U8 , cuyo acceso está controlado para que pueda ser utilizado de forma segura por múltiples tareas. Una tarea puede disminuir (obtener) un semáforo e incrementarlo (liberarlo). Intentar obtener un semáforo que tenga el valor cero 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 semáforos

Número de semáforos

Como ocurre con la mayoría de los aspectos de Nucleus SE, la configuración de los semáforos se controla principalmente mediante # define declaraciones en nuse_config.h . La configuración de la clave es NUSE_SEMAPHORE_NUMBER , que determina cuántos semáforos se configuran para la aplicación. La configuración predeterminada es 0 (es decir, no hay semáforos en uso) y puede establecerlo en cualquier valor hasta 16. Un valor erróneo resultará en un error de tiempo de compilación, que es generado por 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 semáforos. Esto da como resultado que algunas estructuras de datos se definan y dimensionen en consecuencia, de las cuales hablaremos más adelante en este 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 habilitador símbolo en nuse_config.h . Para semáforos, estos son:

NUSE_SEMAPHORE_OBTAIN
NUSE_SEMAPHORE_RELEASE
NUSE_SEMAPHORE_RESET
NUSE_SEMAPHORE_INFORMATION
NUSE_SEMAPHORE_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 semáforos para una aplicación, debe seleccionar las llamadas a la API que desea utilizar y establecer sus símbolos de habilitación en TRUE .

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

 #define NUSE_SEMAPHORE_NUMBER 0 / * Número de semáforos en el sistema - 0-16 * / # define NUSE_SEMAPHORE_OBTAIN FALSE / * Activador de llamadas de servicio * / # define NUSE_SEMAPHORE_RELEASE FALSE / * Activador de llamadas de servicio * / # define NUSE_SEMAPHORE_ call enabler * / # define NUSE_SEMAPHORE_INFORMATION FALSE / * Service call enabler * / # define NUSE_SEMAPHORE_COUNT FALSE / * Service call enabler * / 

Se producirá un error de tiempo de compilación si se habilita una función de API de semáforo y no se configuran semáforos (excepto para NUSE_Semaphore_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 semáforo

Nucleus RTOS admite ocho llamadas de servicio que pertenecen a semáforos, que proporcionan la siguiente funcionalidad:

  • Obtenga un semáforo. Implementado por NUSE_Semaphore_Obtain () en Nucleus SE.

  • Suelta un semáforo. Implementado por NUSE_Semaphore_Release () en Nucleus SE.

  • Restaura un semáforo al estado no utilizado, sin tareas suspendidas (reiniciar). Implementado por NUSE_Semaphore_Reset () en Nucleus SE.

  • Proporciona información sobre un semáforo específico. Implementado por NUSE_Semaphore_Information () en Nucleus SE.

  • Devuelve un recuento de cuántos semáforos están (actualmente) configurados para la aplicación. Implementado por NUSE_Semaphore_Count () en Nucleus SE.

  • Agregue un nuevo semáforo a la aplicación (crear). No implementado en Nucleus SE.

  • Elimina un semáforo de la aplicación (eliminar). No implementado en Nucleus SE.

  • Devuelve punteros a todos los semáforos (actualmente) en la aplicación. No implementado en Nucleus SE.

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

Servicios de obtención y liberación de semáforos

Las operaciones fundamentales, que se pueden realizar en un semáforo, son obtenerlo (decrementarlo) y liberarlo (incrementarlo). Nucleus RTOS y Nucleus SE proporcionan dos llamadas API básicas para estas operaciones, que se analizarán aquí.

Obtener un semáforo

La llamada API de Nucleus RTOS para obtener un semáforo 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 obtener un semáforo que actualmente tiene el valor cero. 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 obtener un semáforo

Prototipo de llamada de servicio:

ESTADO NU_Obtain_Semaphore (NU_SEMAPHORE * semáforo,
SUSPENDER SIN FIRMAR);

Parámetros:

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

suspender - especificación para la suspensión de tareas; puede ser NU_NO_SUSPEND o NU_SUSPEND o un valor de tiempo de espera

Devoluciones:

NU_SUCCESS - la llamada se completó con éxito

NU_UNAVAILABLE - el semáforo tenía el valor cero

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

NU_INVALID_SUSPEND - se intentó suspender desde una no tarea

NU_SEMAPHORE_WAS_RESET - el semáforo se reinició mientras la tarea estaba suspendida

Llamada a la API de Nucleus SE para obtener 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_Obtain (NUSE_SEMAPHORE semáforo,
U8 suspender);

Parámetros:

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

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_UNAVAILABLE - el semáforo tenía el valor cero

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

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

NUSE_SEMAPHORE_WAS_RESET - el semáforo se reinició mientras la tarea estaba suspendida

Implementación de Nucleus SE de Obtain Semaphore

La mayor parte del código de NUSE_Semaphore_Obtain () La función API, después de la verificación de parámetros, se selecciona mediante compilación condicional, dependiendo de si está habilitada la compatibilidad con el bloqueo (suspensión de tareas) de las llamadas a la API. Veremos las dos variantes por separado aquí.

Si el bloqueo no está habilitado, la lógica para esta llamada a la API es bastante simple:

 if (NUSE_Semaphore_Counter [semáforo]! =0) / * semáforo disponible * / {NUSE_Semaphore_Counter [semáforo] -; return_value =NUSE_SUCCESS;} más / * semáforo no disponible * / {return_value =NUSE_UNAVAILABLE;} 

El valor del semáforo se prueba y, si no es cero, se reduce.

Cuando el bloqueo está habilitado, la lógica se vuelve más compleja:

 hacer {if (NUSE_Semaphore_Counter [semáforo]! =0) / * semáforo disponible * / {NUSE_Semaphore_Counter [semáforo] -; return_value =NUSE_SUCCESS; suspender =NUSE_NO_SUSPEND; } else / * semáforo no disponible * / {if (suspender ==NUSE_NO_SUSPEND) {return_value =NUSE_UNAVAILABLE; } else {/ * tarea de bloque * / NUSE_Semaphore_Blocking_Count [semáforo] ++; NUSE_Suspend_Task (NUSE_Task_Active, semáforo <<4) | NUSE_SEMAPHORE_SUSPEND); return_value =NUSE_Task_Blocking_Return [NUSE_Task_Active]; if (return_value! =NUSE_SUCCESS) {suspender =NUSE_NO_SUSPEND; }}}} while (suspender ==NUSE_SUSPEND); 

Alguna explicación del código puede ser útil:

El código está encerrado en do… while bucle, que continúa mientras el parámetro suspender tiene el valor NUSE_SUSPEND .

Si el semáforo es distinto de cero, se reduce. El suspender la variable está establecida en NUSE_NO_SUSPEND y la llamada a la API finaliza con NUSE_SUCCESS .

Si el semáforo es cero y suspender está configurado en NUSE_NO_SUSPEND , la llamada a la API finaliza con NUSE_UNAVAILBLE . Si la suspensión se estableció en NUSE_SUSPEND , la tarea está suspendida. Al regresar (es decir, cuando se despierta la tarea), si el valor de retorno es NUSE_SUCCESS , lo que indica que la tarea se despertó porque se liberó el semáforo (a diferencia de un reinicio del semáforo), el código vuelve a la parte superior.

Lanzamiento de un semáforo

La llamada a la API de Nucleus RTOS para lanzar un semáforo es bastante simple; el semáforo se incrementa y se informa de éxito. Nucleus SE proporciona el mismo servicio, excepto que se realiza una verificación de desbordamiento.

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

Prototipo de llamada de servicio:

ESTADO NU_Release_Semaphore (NU_SEMAPHORE * semáforo);

Parámetros:

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

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 lanzar 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_Release (NUSE_SEMAPHORE semáforo);

Parámetros:

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

Devoluciones:

NUSE_SUCCESS - la llamada se completó con éxito

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

NUSE_UNAVAILABLE - el semáforo tiene el valor 255 y no se puede incrementar

Implementación del semáforo de lanzamiento de Nucleus SE

El código inicial de NUSE_Semaphore_Release () La función API, después de la verificación de parámetros, es común, ya sea que el bloqueo de tareas esté habilitado o no. Se comprueba el valor del semáforo y, si es menor que 255, se reduce.

El código adicional se selecciona mediante compilación condicional, si se habilita la compatibilidad con el bloqueo (suspensión de tareas) de llamadas a la API:

 NUSE_CS_Enter (); if (NUSE_Semaphore_Counter [semáforo] <255) {NUSE_Semaphore_Counter [semáforo] ++; return_value =NUSE_SUCCESS; #if NUSE_BLOCKING_ENABLE if (NUSE_Semaphore_Blocking_Count [semáforo]! =0) {índice U8; / * comprobar si una tarea está bloqueada * / / * en este semáforo * / NUSE_Semaphore_Blocking_Count [semáforo] -; for (index =0; index  

Si se suspende alguna tarea en este semáforo, se despierta la primera.

El próximo artículo cubrirá algunas llamadas API adicionales asociadas con grupos de indicadores de eventos, junto con las estructuras de datos relevantes.


Colin Walls tiene más de treinta años de experiencia en la industria de la electrónica, principalmente dedicada al software integrado. Presentador frecuente en conferencias y seminarios y autor de numerosos artículos técnicos y dos libros sobre software integrado, Colin es un tecnólogo de software integrado en Mentor Embedded [la División de software integrado de Mentor Graphics], y tiene su sede en el Reino Unido. Su blog habitual se encuentra en:http://blogs.mentor.com/colinwalls. Puede ser contactado por correo electrónico a [email protected]


Incrustado

  1. Introducción a los bloqueos de levas y cómo funcionan
  2. Introducción a los tornillos de ojo y cómo funcionan
  3. Introducción al acero inoxidable y cómo se fabrica
  4. Entrada y salida básica de C#
  5. ¿Qué es un redactor de servicios automotrices y qué hacen?
  6. Buzones de correo:introducción y servicios básicos
  7. Semáforos:servicios públicos y estructuras de datos
  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. El Servicio de Admisión de Universidades y Facultades del Reino Unido renueva su contrato con Infosys para impulsar la automatización