Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial Internet of Things >> Embarqué

Groupes d'indicateurs d'événement :introduction et services de base


Voir la série RTOS Revealed

Les groupes d'indicateurs d'événement ont été introduits dans un article précédent. Dans Nucleus SE, ils sont quelque peu similaires aux signaux, mais avec une plus grande flexibilité. Ils offrent un moyen peu coûteux, mais flexible, de transmettre des messages simples entre les tâches.

Utilisation des indicateurs d'événement

Dans Nucleus SE, les indicateurs d'événement sont configurés au moment de la génération. Il peut y avoir un maximum de 16 groupes d'indicateurs d'événement configurés pour une application. Si aucun groupe d'indicateurs d'événement n'est configuré, aucune structure de données ou code d'appel de service appartenant aux groupes d'indicateur d'événement n'est inclus dans l'application.

Un groupe d'indicateurs d'événement est simplement un ensemble de huit indicateurs à 1 bit, dont l'accès est contrôlé afin qu'il puisse être utilisé en toute sécurité par plusieurs tâches. Une tâche peut définir ou effacer n'importe quelle combinaison d'indicateurs d'événement. Une autre tâche peut lire le groupe d'indicateurs d'événement à tout moment ou peut attendre (interrogation ou suspension) un modèle spécifique d'indicateurs.

Configuration des groupes d'indicateurs d'événement

Nombre de groupes d'indicateurs d'événement

Comme pour la plupart des aspects de Nucleus SE, la configuration des groupes d'indicateurs d'événement est principalement contrôlée par #define déclarations dans nuse_config.h . Le paramètre clé est NUSE_EVENT_GROUP_NUMBER , qui détermine le nombre de groupes d'indicateurs d'événement configurés pour l'application. Le paramètre par défaut est 0 (c'est-à-dire qu'aucun groupe d'indicateurs d'événement n'est utilisé) et vous pouvez le définir sur n'importe quelle valeur jusqu'à 16. Une valeur erronée entraînera une erreur de compilation, qui est générée par un test dans nuse_config_check. h (ceci est inclus dans nuse_config.c et donc compilé avec ce module) résultant en une #error déclaration en cours de compilation.

Le choix d'une valeur différente de zéro est la « validation principale » pour les groupes d'indicateurs d'événement. Il en résulte que certaines structures de données sont définies et dimensionnées en conséquence, dont plus loin dans cette série. Il active également les paramètres d'activation de l'API.

Activation de l'API

Chaque fonction API (appel de service) dans Nucleus SE a un #define d'activation symbole dans nuse_config.h . Pour les groupes d'indicateurs d'événement, ce sont :

NUSE_EVENT_GROUP_SET NUSE_EVENT_GROUP_RETRIEVE NUSE_EVENT_GROUP_INFORMATION NUSE_EVENT_GROUP_COUNT 

Par défaut, tous ces éléments sont définis sur FALSE , désactivant ainsi chaque appel de service et empêchant l'inclusion de tout code d'implémentation. Pour configurer des groupes d'indicateurs d'événement pour une application, vous devez sélectionner les appels d'API que vous souhaitez utiliser et définir leurs symboles d'activation sur TRUE .

Voici un extrait du nuse_config.h par défaut fichier.

#define NUSE_EVENT_GROUP_NUMBER 0 /* Nombre de groupes d'événements  dans le système - 0-16 */ #define NUSE_EVENT_GROUP_SET FALSE /* Activation d'appel de service */ #define NUSE_EVENT_GROUP_RETRIEVE FALSE /* Activation d'appel de service */ #define NUSE_EVENT_GROUP_INFORMATION FALSE /* Activation d'appel de service */ #define NUSE_EVENT_GROUP_COUNT FALSE /* Activation d'appel de service */ 

Une erreur de compilation se produira si une fonction API de groupe d'indicateurs d'événement est activée et qu'aucun groupe d'indicateurs d'événement n'est configuré (sauf pour NUSE_Event_Group_Count() ce qui est toujours autorisé). Si votre code utilise un appel API, qui n'a pas été activé, une erreur de temps de liaison se produira, car aucun code d'implémentation n'aura été inclus dans l'application.

Appels de service d'indicateur d'événement

Nucleus RTOS prend en charge sept appels de service relatifs aux indicateurs d'événement, qui fournissent les fonctionnalités suivantes :

La mise en œuvre de chacun de ces appels de service est examinée en détail.

On peut noter qu'aucune fonction de réinitialisation n'est fournie (que ce soit dans Nucleus RTOS ou Nucleus SE). C'est intentionnel. Une réinitialisation implique qu'une condition spéciale prévaut. Pour un groupe d'indicateurs d'événement, la seule condition « spéciale » serait uniquement des zéros, ce qui peut être configuré avec NUSE_Event_Group_Set() .

Définir et récupérer les services de groupe d'indicateurs d'événement

Les opérations fondamentales, qui peuvent être effectuées sur un groupe d'indicateurs d'événement, consistent à définir un ou plusieurs indicateurs et à récupérer les états actuels des indicateurs. Nucleus RTOS et Nucleus SE fournissent chacun deux appels d'API de base pour ces opérations, qui seront abordés ici.

Étant donné que les indicateurs d'événement sont des bits, ils sont mieux visualisés sous forme de nombres binaires. Comme le C standard ne prend pas en charge une représentation des constantes binaires (uniquement en octal et hexadécimal), la distribution Nucleus SE inclut un fichier d'en-tête utile - nuse_binary.h – qui contient #define symboles de la forme b01010101 pour toutes les 256 valeurs 8 bits.

Définition des indicateurs d'événement

L'appel de l'API Nucleus RTOS pour la définition des indicateurs d'événement est très flexible, vous permettant de définir et d'effacer les indicateurs d'événement à l'aide de ET et OU opérations. Nucleus SE fournit le même service, sauf que la suspension des tâches est facultative.

Appel d'API Nucleus RTOS pour la définition d'indicateurs

Prototype d'appel de service :

STATUS NU_Set_Events(NU_EVENT_GROUP *group, UNSIGNED event_flags,
                     opération OPTION );

Paramètres :

groupe – pointeur vers le bloc de contrôle de groupe d'indicateurs d'événement fourni par l'utilisateur

event_flags – la valeur du bit du modèle de drapeaux sur lequel opérer

opération – l'opération à effectuer; peut être NU_OR (pour définir des indicateurs) ou NU_AND (pour effacer les drapeaux)

Retours :

NU_SUCCESS – l'appel s'est terminé avec succès

NU_INVALID_GROUP – le pointeur de groupe d'indicateurs d'événement n'est pas valide

NU_INVALID_OPERATION – l'opération spécifiée n'était pas NU_OR ou NU_AND

Appel de l'API Nucleus SE pour la définition d'indicateurs

Cet appel d'API prend en charge la fonctionnalité clé de l'API Nucleus RTOS.

Prototype d'appel de service :

STATUS NUSE_Event_Group_Set(groupe NUSE_EVENT_GROUP,
U8 event_flags, opération OPTION );

Paramètres :

groupe – l'index (ID) du groupe d'événements dans lequel les drapeaux doivent être définis/effacés

event_flags – la valeur du bit du modèle de drapeaux sur lequel opérer

opération – l'opération à effectuer; peut être NUSE_OR (pour définir des indicateurs) ou NUSE_AND (pour effacer les drapeaux)

Retours :

NUSE_SUCCESS – l'appel s'est terminé avec succès

NUSE_INVALID_GROUP – l'index du groupe d'indicateurs d'événement n'est pas valide

NUSE_INVALID_OPERATION – l'opération spécifiée n'était pas NUSE_OR ou NUSE_AND

Implémentation Nucleus SE de Set Event Flags

Le code initial du NUSE_ Event_Group_Set() La fonction API - après vérification des paramètres - est courante, que la prise en charge du blocage (suspension des tâches) des appels API soit activée ou non. La logique est assez simple :

NUSE_CS_Enter();if (operation ==NUSE_OR){ NUSE_Event_Group_Data[group] |=event_flags;}else /* NUSE_AND */{ NUSE_Event_Group_Data[group] &=event_flags;} 

Le motif binaire, event_flags , est juste OR ou AND dans le groupe d'indicateurs d'événement spécifié.

Le code restant n'est inclus que si le blocage des tâches est activé :

#if NUSE_BLOCKING_ENABLE  tandis que (NUSE_Event_Group_Blocking_Count[group] !=0)  {  indice U8 ; /* vérifie si des tâches sont bloquées */  /* sur ce groupe d'événements */  pour (index=0 ; index  {  si ((LONIB(NUSE_Task_Status[index]) ==  NUSE_EVENT_SUSPEND)  &&(HINIB(NUSE_Task_Status[index]) ==groupe))  {  NUSE_Task_Blocking_Return[index] =NUSE_SUCCESS ;  NUSE_Task_Status[index] =NUSE_READY ;  pause ;  }  }  NUSE_Event_Group_Blocking_Count[groupe]-- ;  }  #if NUSE_SCHEDULER_TYPE ==NUSE_PRIORITY_SCHEDULER  NUSE_Replanifier(NUSE_NO_TASK);  #endif #endif NUSE_CS_Exit(); retourner NUSE_SUCCESS ; 

Si des tâches sont suspendues (récupération de) ce groupe d'indicateurs d'événement, elles sont toutes reprises. Lorsqu'ils ont la possibilité d'exécuter, ce qui dépend du planificateur, ils peuvent déterminer si leurs conditions de retour ont été remplies - voir Récupérer les drapeaux d'événement ci-dessous.

Continuer à la page deux>>


Embarqué

  1. Une introduction aux serrures à came et à leur fonctionnement
  2. Une introduction aux vis à œil et à leur fonctionnement
  3. Une introduction aux œillets et à leur fonctionnement
  4. Une introduction à l'acier inoxydable et à sa fabrication
  5. Entrée et sortie de base C#
  6. Boîtes aux lettres :présentation et services de base
  7. Sémaphores :services utilitaires et structures de données
  8. Sémaphores :introduction et services de base
  9. Groupes d'indicateurs d'événement :services publics et structures de données