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

Grupos de indicadores de eventos:introducción y servicios básicos


Ver la serie RTOS Revealed

Los grupos de banderas de eventos se presentaron en un artículo anterior. En Nucleus SE, son algo similares a las señales, pero con mayor flexibilidad. Proporcionan un medio de bajo costo, pero flexible, para pasar mensajes simples entre tareas.

Uso de banderas de eventos

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

Un grupo de indicadores de eventos es simplemente un conjunto de ocho indicadores de 1 bit, cuyo acceso se controla para que pueda ser utilizado de manera segura por múltiples tareas. Una tarea puede establecer o borrar cualquier combinación de indicadores de eventos. Otra tarea puede leer el grupo de indicadores de eventos en cualquier momento o puede esperar (sondeo o suspensión) por un patrón específico de indicadores.

Configuración de grupos de indicadores de eventos

Número de grupos de indicadores de eventos

Como ocurre con la mayoría de los aspectos de Nucleus SE, la configuración de los grupos de indicadores de eventos se controla principalmente mediante #define declaraciones en nuse_config.h . La configuración de la clave es NUSE_EVENT_GROUP_NUMBER , que determina cuántos grupos de indicadores de eventos se configuran para la aplicación. La configuración predeterminada es 0 (es decir, no hay grupos de indicadores de eventos 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 indicadores de eventos. Esto da como resultado que algunas estructuras de datos se definan y dimensionen en consecuencia, de las cuales hablaremos más adelante en esta serie. 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 banderas de eventos, estos son:

  NUSE_EVENT_GROUP_SET   NUSE_EVENT_GROUP_RETRIEVE   NUSE_EVENT_GROUP_INFORMATION   NUSE_EVENT_GROUP_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 indicadores de eventos 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.

  #define NUSE_EVENT_GROUP_NUMBER 0 / * Número de grupos de eventos   en el sistema - 0-16 * /   #define NUSE_EVENT_GROUP_SET FALSE / * Habilitador de llamadas de servicio * /   #define NUSE_EVENT_GROUP_RETRIEVE FALSE / * Habilitador de llamadas de servicio * /   #define NUSE_EVENT_GROUP_INFORMATION FALSE / * Habilitador de llamadas de servicio * /   #define NUSE_EVENT_GROUP_COUNT FALSE / * Habilitador de llamadas de servicio * /  

Se producirá un error de tiempo de compilación si se habilita una función de API de grupo de indicadores de eventos y no se configura ningún grupo de indicadores de eventos (excepto NUSE_Event_Group_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 de banderas de eventos

Nucleus RTOS admite siete llamadas de servicio que pertenecen a indicadores de eventos, 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. Un reinicio implica que prevalece una condición especial. Para un grupo de banderas de eventos, la única condición "especial" sería todos ceros, que se pueden configurar con NUSE_Event_Group_Set () .

Servicios de configuración y recuperación de grupos de indicadores de eventos

Las operaciones fundamentales, que se pueden realizar en un grupo de banderas de eventos, son establecer una o más banderas y recuperar los estados actuales de las banderas. Nucleus RTOS y Nucleus SE proporcionan dos llamadas API básicas para estas operaciones, que se analizarán aquí.

Dado que los indicadores de eventos son bits, es mejor visualizarlos como números binarios. Como el estándar C no admite una representación de constantes binarias (solo octal y hexadecimal), la distribución de Nucleus SE incluye un archivo de encabezado útil: nuse_binary.h - que contiene #define símbolos de la forma b01010101 para los 256 valores de 8 bits.

Configuración de banderas de eventos

La llamada a la API de Nucleus RTOS para configurar indicadores de eventos es muy flexible, lo que le permite configurar y borrar indicadores de eventos mediante Y y O operaciones. Nucleus SE proporciona el mismo servicio, excepto que la suspensión de tareas es opcional.

Llamada a la API Nucleus RTOS para configurar el indicador

Prototipo de llamada de servicio:

ESTADO NU_Set_Events (NU_EVENT_GROUP * grupo, UNSIGNED event_flags,
Operación OPCIÓN);

Parámetros:

grupo - puntero al bloque de control del grupo de banderas de eventos proporcionado por el usuario

event_flags - el valor de bit del patrón de banderas a operar

operación - la operación a realizar; puede ser NU_OR (para poner banderas) o NU_AND (borrar banderas)

Devoluciones:

NU_SUCCESS - la llamada se completó con éxito

NU_INVALID_GROUP - el puntero del grupo de banderas de eventos no es válido

NU_INVALID_OPERATION - la operación especificada no era NU_OR o NU_AND

Llamada a la API de Nucleus SE para configurar el indicador

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

Prototipo de llamada de servicio:

STATUS NUSE_Event_Group_Set (grupo NUSE_EVENT_GROUP,
U8 event_flags, operación OPCIÓN);

Parámetros:

grupo - el índice (ID) del grupo de eventos en el que se deben establecer / borrar las banderas

event_flags - el valor de bit del patrón de banderas a operar

operación - la operación a realizar; puede ser NUSE_OR (para establecer banderas) o NUSE_AND (borrar banderas)

Devoluciones:

NUSE_SUCCESS - la llamada se completó con éxito

NUSE_INVALID_GROUP - el índice del grupo de banderas de eventos no es válido

NUSE_INVALID_OPERATION - la operación especificada no era NUSE_OR o NUSE_AND

Implementación de Nucleus SE de establecer indicadores de eventos

El código inicial de NUSE_ Event_Group_Set () La función de la API, después de la verificación de parámetros, es común, ya sea que el soporte para bloquear (suspender la tarea) las llamadas a la API esté habilitado o no. La lógica es bastante simple:

  NUSE_CS_Enter (); if (operación ==NUSE_OR) {NUSE_Event_Group_Data [grupo] | =event_flags;} else / * NUSE_AND * / {NUSE_Event_Group_Data [grupo] &=event_flags;}  

El patrón de bits, event_flags , solo se usa con OR o AND en el grupo de indicadores de evento especificado.

El código restante solo se incluye si el bloqueo de tareas está habilitado:

  #if NUSE_BLOCKING_ENABLE   while (NUSE_Event_Group_Blocking_Count [grupo]! =0)   {  índice U8; / * comprobar si alguna tarea está bloqueada * /   / * en este grupo de eventos * /   para (índice =0; índice   {  if ((LONIB (NUSE_Task_Status [índice]) ==  NUSE_EVENT_SUSPEND)   &&(HINIB (NUSE_Task_Status [índice]) ==grupo))   {  NUSE_Task_Blocking_Return [índice] =NUSE_SUCCESS;   NUSE_Task_Status [índice] =NUSE_READY;   descanso;  }  }   NUSE_Event_Group_Blocking_Count [grupo] -;  }   #if NUSE_SCHEDULER_TYPE ==NUSE_PRIORITY_SCHEDULER   NUSE_Reschedule (NUSE_NO_TASK);   #endif   #endif   NUSE_CS_Salir ();   devuelve NUSE_SUCCESS;  

Si alguna tarea se suspende (se recupera de) este grupo de indicadores de eventos, se reanudan todas. Cuando tienen la oportunidad de ejecutar, lo que depende del programador, pueden determinar si se han cumplido sus condiciones de devolución; consulte Recuperación de indicadores de eventos a continuación.

Continuar a la página dos>>


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 a los ojales y cómo funcionan
  4. Introducción al acero inoxidable y cómo se fabrica
  5. Entrada y salida básica de C#
  6. Buzones de correo:introducción y servicios básicos
  7. Semáforos:servicios públicos y estructuras de datos
  8. Semáforos:introducción y servicios básicos
  9. Grupos de indicadores de eventos:servicios públicos y estructuras de datos
  10. Colas:introducción y servicios básicos
  11. Arrow y Freelancer.com lanzan el mercado de servicios de ingeniería eléctrica y electrónica