
Cet article continue de décrire les groupes d'indicateurs d'événements.
Articles précédents de la série:
Article # 17. Groupes de drapeaux d'événements: introduction et services de baseArticle # 16. SignauxArticle # 15. Partitions de mémoire: services et structures de donnéesArticle # 14. Sections de mémoire: introduction et services de baseArticle # 13. Structures de données de tâche et appels d'API non pris en chargeArticle # 12. Services pour travailler avec des tâchesArticle # 11. Tâches: configuration et introduction à l'APIArticle # 10. Scheduler: fonctionnalités avancées et préservation du contexteArticle # 9. Scheduler: implémentationArticle # 8. Nucleus SE: conception interne et déploiementArticle # 7. Nucleus SE: IntroductionArticle # 6. Autres services RTOSArticle # 5. Interaction et synchronisation des tâchesArticle # 4. Tâches, changement de contexte et interruptionsArticle # 3. Tâches et planificationArticle # 2. RTOS: Structure et mode temps réel
Article # 1. RTOS: introduction.
Services d'assistance pour les groupes de drapeaux d'événements
Nucleus RTOS dispose de trois appels d'API qui fournissent des fonctions d'assistance pour les groupes d'indicateurs d'événements: récupération des informations de groupe, récupération des informations sur le nombre de groupes d'indicateurs d'événements dans une application et récupération de pointeurs vers tous les groupes d'indicateurs d'événements. Les deux premiers défis sont implémentés dans Nucleus SE.
Récupération des informations du groupe d'indicateurs d'événements
Cet appel d'utilitaire renvoie des informations sur le groupe d'indicateurs d'événements. L'implémentation de cet appel dans Nucleus SE diffère de l'implémentation dans Nucleus RTOS en ce que moins d'informations sont renvoyées, car la dénomination d'objet et l'ordre de pause de tâche ne sont pas pris en charge, et la pause de tâche elle-même peut être désactivée.
Un appel pour récupérer des informations sur le groupe d'événements dans Nucleus RTOSPrototype d'appel de service:
STATUS NU_Event_Group_Information (groupe NU_EVENT_GROUP *, nom CHAR *, UNSIGNED * event_flags, UNSIGNED * tasks_waiting, NU_TASK ** first_task);Paramètres:
group - un pointeur vers un bloc de contrôle fourni par l'utilisateur pour un groupe de drapeaux d'événements;
nom - un pointeur vers la région à 8 caractères pour le nom du groupe de drapeaux d'événements, cela inclut également le zéro de fin;
event_flags - pointeur vers une variable qui prendra la valeur actuelle du groupe spécifié de drapeaux d'événements;
tasks_waiting - un pointeur sur une variable qui prendra le nombre de tâches suspendues dans ce groupe de drapeaux d'événements;
first_task - un pointeur vers une variable de type
NU_TASK , qui prendra un pointeur vers la première tâche suspendue.
Valeur de retour:
NU_SUCCESS - l'appel s'est terminé avec succès;
NU_INVALID_GROUP - pointeur non valide vers un groupe d'indicateurs d'événements.
Un appel pour récupérer des informations sur le groupe d'événements dans Nucleus SECet appel prend en charge la fonctionnalité principale de l'API RTOS Nucleus.
Prototype d'appel de service:
STATUS NUSE_Event_Group_Information (groupe NUSE_EVENT_GROUP, U8 * event_flags, U8 * tasks_waiting, NUSE_TASK * first_task);Paramètres:
group - l'index du groupe de drapeaux d'événements pour lesquels des informations sont demandées;
event_flags - pointeur vers une variable qui prendra la valeur actuelle du groupe spécifié de drapeaux d'événements;
tasks_waiting - un pointeur sur une variable qui prendra le nombre de tâches suspendues dans ce groupe d'indicateurs d'événements (rien n'est retourné si la suspension des tâches est désactivée);
first_task - un pointeur vers une variable de type
NUSE_TASK , qui prendra l'index de la première tâche suspendue (rien n'est retourné si la suspension des tâches est désactivée).
Valeur de retour:
NUSE_SUCCESS - l'appel s'est terminé avec succès;
NUSE_INVALID_GROUP - index de groupe d'indicateurs d'événements non valide.
Implémentation des informations sur les groupes d'événements dans Nucleus SEL'implémentation de cet appel d'API est assez simple:
*event_flags = NUSE_Event_Group_Data[group]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Event_Group_Blocking_Count[group]; if (NUSE_Event_Group_Blocking_Count[group] != 0) { U8 index; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_EVENT_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == group)) { *first_task = index; break; } } } else { *first_task = 0; } #else *tasks_waiting = 0; *first_task = 0; #endif return NUSE_SUCCESS;
La fonction renvoie la valeur du groupe de drapeaux d'événements. Ensuite, si les appels d'API bloquant les tâches sont activés, le nombre de tâches en attente et l'index du premier d'entre eux sont renvoyés (sinon, ces deux paramètres sont définis sur zéro).
Obtention du nombre de groupes de drapeaux d'événements
Cet appel d'utilitaire renvoie le nombre de groupes d'indicateurs d'événements dans l'application. Dans Nucleus RTOS, cette valeur change avec le temps et la valeur de retour indique le nombre actuel de groupes, tandis que dans Nucleus SE, cette valeur est déterminée lors de l'assemblage et ne change pas avec le temps.
Appel du compteur de groupes de drapeaux d'événements dans Nucleus RTOSPrototype d'appel de service:
UNSIGNED NU_Establised_Event_Groups (VOID);Paramètres:
Sont absents.
Valeur de retour:
Nombre actuel de groupes d'indicateurs d'événements créés.
Appel du compteur de groupes de drapeaux d'événements dans Nucleus SEPrototype d'appel de service:
U8 NUSE_Event_Group_Count (void);Paramètres:
Sont absents.
Valeur de retour:
Nombre de groupes d'indicateurs d'événements configurés.
Implémentation d'un compteur de groupes d'indicateurs d'événements dans Nucleus SEL'implémentation de cet appel API est assez banale: la valeur du symbole
#define NUSE_EVENT_GROUP_NUMBER est
retournée .
Structures de données
Comme tous les autres objets Nucleus SE, les groupes d'indicateurs d'événements utilisent un ou deux tableaux de structures de données (les deux sont situés dans la RAM), la taille des tableaux dépend du nombre de groupes définis dans les paramètres.
Je recommande fortement que le code d'application n'utilise pas un accès direct à ces structures de données, mais s'y réfère via les fonctions API fournies. Cela évitera l'incompatibilité avec les futures versions de Nucleus SE et les effets secondaires indésirables, ainsi que simplifiera le portage de l'application vers Nucleus RTOS. Pour une meilleure compréhension du code d'appel de service et du débogage, un aperçu détaillé des structures de données est fourni ci-dessous.
Données RAM
Ces données ont la structure suivante:
NUSE_Event_Group_Data [] - un tableau de données de type
U8 ayant un enregistrement pour chaque groupe de drapeaux configuré; il stocke les données d'indicateur d'événement.
NUSE_Event_Group_Blocking_Count [] - un tableau de type
U8 contenant un compteur de tâches bloquées dans chaque groupe d'indicateurs d'événements. Ce tableau existe uniquement lorsque la fonctionnalité de verrouillage dans l'API est activée.
Ces structures de données sont initialisées avec des zéros dans la fonction
NUSE_Init_Event_Group () au démarrage de Nucleus SE. L'un des articles suivants fournira une description complète des procédures de démarrage de Nucleus SE.
Voici une description de ces structures de données dans le fichier
nuse_init.c :
RAM U8 NUSE_Event_Group_Data[NUSE_EVENT_GROUP_NUMBER]; #if NUSE_BLOCKING_ENABLE RAM U8 NUSE_Event_Group_Blocking_Count[NUSE_EVENT_GROUP_NUMBER]; #endif
Données ROM
Pour implémenter des groupes d'indicateurs d'événements, les données de la ROM ne sont pas utilisées.
Taille de la mémoire pour les groupes d'indicateurs d'événements
Comme pour tous les objets du noyau Nucleus SE, la quantité de mémoire requise pour les groupes d'indicateurs d'événements est prévisible.
La quantité de données dans la ROM pour tous les groupes d'indicateurs d'événements dans l'application est 0.
La quantité de mémoire en RAM pour tous les groupes d'indicateurs d'événements avec la fonctionnalité de verrouillage d'API activée est
NUSE_EVENT_GROUP_NUMBER * 2 .
Sinon, c'est
NUSE_EVENT_GROUP_NUMBER .
Appels d'API non réalisés
Trois appels d'API pour les groupes d'indicateurs d'événements qui peuvent être trouvés dans Nucleus RTOS n'ont pas été implémentés dans Nucleus SE.
Création d'un groupe d'indicateurs d'événements
Cet appel d'API crée un groupe d'indicateurs d'événements. Nucleus SE n'a pas besoin de cet appel car les groupes d'indicateurs d'événements sont créés statiquement.
Prototype d'appel de service:
STATUS NU_Create_Event_Group (groupe NU_EVENT_GROUP *, nom CHAR *);Paramètres:
group - un pointeur vers un bloc de contrôle fourni par l'utilisateur pour un groupe de drapeaux d'événements; Utilisé comme descripteur pour gérer des groupes d'indicateurs d'événements dans d'autres appels d'API
nom - un pointeur sur le nom à 8 caractères du groupe de drapeaux d'événements avec un octet nul de fin inclus dans cette zone.
Valeur de retour:
NU_SUCCESS - l'appel s'est terminé avec succès;
NU_INVALID_GROUP - pointeur nul vers l'unité de contrôle du groupe d'indicateurs d'événements (
NULL ) ou déjà utilisé.
Suppression d'un groupe de drapeaux d'événements
Cet appel d'API supprime le groupe d'indicateurs d'événements créé précédemment. Nucleus SE n'a pas besoin de cet appel car les groupes d'indicateurs d'événements sont créés statiquement et ne peuvent pas être supprimés.
Prototype d'appel de service:
STATUS NU_Delete_Event_Group (groupe NU_EVENT_GROUP *);Paramètres:
group - un pointeur vers le bloc de contrôle du groupe de drapeaux d'événements.
Valeur de retour:
NU_SUCCESS - l'appel s'est terminé avec succès;
NU_INVALID_GROUP - pointeur non valide vers un groupe d'indicateurs d'événements.
Pointeurs de groupes de drapeaux d'événements
Cet appel d'API constitue une liste séquentielle de pointeurs vers tous les groupes d'indicateurs d'événements du système. Nucleus SE n'a pas besoin de cet appel car les groupes d'indicateurs d'événements ont des index simples, pas des pointeurs.
Prototype d'appel de service:
UNSIGNED NU_Event_Group_Pointers (NU_EVENT_GROUP * pointer_list, UNSIGNED maximum_pointers);Paramètres:
pointer_list - un pointeur vers un tableau de pointeurs
NU_EVENT_GROUP , ce tableau est rempli de pointeurs vers des groupes de drapeaux d'événements créés dans le système;
maximum_pointers - le nombre maximum de pointeurs dans le tableau.
Valeur de retour:
Nombre de pointeurs
NU_EVENT_GROUP dans le tableau.
Compatible avec Nucleus RTOS
Lors du développement de Nucleus SE, mon objectif était d'assurer le niveau maximum de compatibilité du code avec Nucleus RTOS. Les groupes de drapeaux d'événements ne faisaient pas exception et, du point de vue du développeur, ils sont implémentés presque de la même manière que dans Nucleus RTOS. Il y a quelques incompatibilités que j'ai considérées comme valides, étant donné que le code final deviendra plus compréhensible et plus efficace en termes de quantité de mémoire requise. Sinon, les appels d'API Nucleus RTOS peuvent être utilisés presque directement comme appels Nucleus SE.
Identificateurs d'objet
Dans Nucleus RTOS, tous les objets sont décrits par des structures de données (unités de contrôle) d'un type spécifique. Un pointeur vers cette unité de contrôle est un identifiant pour un groupe de drapeaux d'événements. J'ai décidé que dans Nucleus SE, une approche différente est nécessaire pour une utilisation efficace de la mémoire: tous les objets du noyau sont décrits par plusieurs tables en RAM et / ou ROM. La taille de ces tables est déterminée par le nombre d'objets configurés de chaque type. L'identifiant d'un objet particulier est l'index dans ce tableau. J'ai donc défini
NUSE_EVENT_GROUP comme l'équivalent de
U8 , une variable de ce type (pas un pointeur) sert d'identifiant du groupe de drapeaux d'événements. Cette légère incompatibilité est facile à gérer si le code est porté de Nucleus SE vers Nucleus RTOS et vice versa. En règle générale, aucune opération n'est effectuée sur les identificateurs d'objet autres que le déplacement et le stockage.
Nucleus RTOS prend également en charge la dénomination des groupes d'indicateurs d'événements. Ces noms sont utilisés uniquement pour le débogage. Je les ai exclus de Nucleus SE pour économiser de la mémoire.
Le nombre de drapeaux dans le groupe
Dans Nucleus RTOS, les groupes d'indicateurs d'événements contiennent 32 indicateurs chacun, dans Nucleus SE j'ai réduit leur nombre à huit, car cela est suffisant pour les applications simples et économise de la RAM. Nucleus SE peut être facilement modifié si de plus grands groupes d'indicateurs d'événements sont requis.
Fonction d'absorption des drapeaux
Nucleus RTOS a une fonction pour effacer (absorber) les drapeaux d'événements après les avoir lus. J'ai décidé d'exclure cette fonction de Nucleus SE pour simplifier le système, car l'absorption (suppression) des drapeaux se produit lorsque toutes les tâches bloquées ont reçu des drapeaux pour la lecture, ce qui serait difficile à mettre en œuvre. Si nécessaire, une tâche de lecture d'indicateur peut toujours les effacer à l'aide d'un appel d'API distinct.
Appels d'API non réalisés
Nucleus RTOS prend en charge sept appels d'utilitaire pour travailler avec des groupes d'indicateurs d'événements. Parmi ceux-ci, trois ne sont pas implémentés dans Nucleus SE. Les détails de ces défis, ainsi que la décision de les exclure de Nucleus SE, ont été décrits ci-dessus.
Le prochain article se penchera sur les sémaphores.
À propos de l'auteur: Colin Walls travaille dans l'industrie électronique depuis plus de trente ans, consacrant la majeure partie de son temps au micrologiciel. Il est maintenant ingénieur firmware chez Mentor Embedded (une division de Mentor Graphics). Colin Walls intervient souvent lors de conférences et séminaires, auteur de nombreux articles techniques et de deux livres sur le firmware. Vit au Royaume-Uni.
Blog professionnel
de Colin , e-mail: colin_walls@mentor.com.