Sémaphores dans Nucleus RTOS : Services utilitaires et structures de données
Voir la série RTOS Revealed
Cet article continue l'examen des sémaphores.
Services utilitaires des sémaphores
Nucleus RTOS offre quatre appels API qui fournissent des utilitaires essentiels pour la gestion des sémaphores : réinitialiser un sémaphore, récupérer des informations détaillées, compter le nombre total de sémaphores dans une application, et obtenir des pointeurs vers tous les objets sémaphore. Les trois premières fonctions sont pleinement implémentées dans Nucleus SE.
Réinitialisation d'un sémaphore
Contrairement à la plupart des objets noyau, réinitialiser un sémaphore le restaure à un compte initial spécifié plutôt que de simplement le réinitialiser à sa valeur de compilation. Toutes les tâches bloquées sur le sémaphore sont immédiatement réveillées et reçoivent le code de retour NUSE_SEMAPHORE_WAS_RESET (ou NU_SEMAPHORE_RESET dans Nucleus RTOS).
Appel API Nucleus RTOS pour réinitialiser un sémaphore
Prototype d'appel de service :
STATUS NU_Reset_Semaphore(NU_SEMAPHORE *semaphore,
UNSIGNED initial_count);
Paramètres :
semaphore — pointeur vers le bloc de contrôle du sémaphore fourni par l'utilisateur.
initial_count — la valeur à laquelle le compteur du sémaphore doit être défini.
Retourne :
NU_SUCCESS — l'opération s'est terminée avec succès.
NU_INVALID_SEMAPHORE — le pointeur de sémaphore n'est pas valide.
Appel API Nucleus SE pour réinitialiser un sémaphore
Prototype d'appel de service :
STATUS NUSE_Semaphore_Reset(NUSE_SEMAPHORE semaphore,
U8 initial_count);
Paramètres :
semaphore — l'index (ID) du sémaphore à réinitialiser.
initial_count — la valeur à laquelle le compteur du sémaphore doit être défini.
Retourne :
NUSE_SUCCESS — l'opération s'est terminée avec succès.
NUSE_INVALID_SEMAPHORE — l'index du sémaphore n'est pas valide.
Implémentation Nucleus SE de la réinitialisation de sémaphore
La routine NUSE_Semaphore_Reset() valide ses arguments et écrit alors le nouveau compte dans l'array NUSE_Semaphore_Counter[]. Quand le blocage est activé, elle parcourt la table des tâches pour localiser toute tâche suspendue sur le sémaphore, les marque comme prêtes, assigne le code de retour NUSE_SEMAPHORE_WAS_RESET, et déclenche enfin une réordonnancement si un ordonnanceur par priorité est actif.
while (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; for (index = 0; index < NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { NUSE_Task_Blocking_Return[index] = NUSE_SEMAPHORE_WAS_RESET; NUSE_Task_Status[index] = NUSE_READY; break; } } NUSE_Semaphore_Blocking_Count[semaphore]--; } #if NUSE_SCHEDULER_TYPE == NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK); #endif
Toutes les tâches suspendues sont donc transitionnées vers l'état prêt avec le code de retour approprié. Si l'ordonnanceur par priorité est actif, NUSE_Reschedule() assure que les tâches de priorité plus haute peuvent préempter celles de priorité plus basse.
Informations sur le sémaphore
Cet appel de service récupère les détails clés d'un sémaphore. Dans Nucleus SE, moins de champs sont retournés car le nommage d'objets, l'ordonnancement de suspension, et la suspension de tâche peuvent ne pas être supportés.
Appel API Nucleus RTOS pour informations sur sémaphore
Prototype d'appel de service :
STATUS NU_Semaphore_Information(NU_SEMAPHORE *semaphore,
CHAR *name, UNSIGNED *current_count, OPTION *suspend_type,
UNSIGNED *tasks_waiting, NU_TASK **first_task);
Paramètres :
semaphore — pointeur vers le bloc de contrôle du sémaphore demandé.
name — tampon destination pour le nom du sémaphore (8 caractères plus terminateur null).
current_count — reçoit la valeur actuelle du compteur du sémaphore.
suspend_type — reçoit la politique de suspension (ex. NU_FIFO ou NU_PRIORITY).
tasks_waiting — reçoit le nombre de tâches suspendues sur le sémaphore.
first_task — reçoit un pointeur vers le bloc de contrôle de la première tâche suspendue.
Retourne :
NU_SUCCESS — l'appel s'est terminé avec succès.
NU_INVALID_SEMAPHORE — le pointeur de sémaphore est invalide.
Appel API Nucleus SE pour informations sur sémaphore
Prototype d'appel de service :
STATUS NUSE_Semaphore_Information(NUSE_SEMAPHORE semaphore,
U8 *current_count, U8 *tasks_waiting, NUSE_TASK *first_task);
Paramètres :
semaphore — l'index du sémaphore.
current_count — reçoit la valeur actuelle du compteur.
tasks_waiting — reçoit le nombre de tâches suspendues (si suspension de tâche activée).
first_task — reçoit l'index de la première tâche suspendue (si suspension de tâche activée).
Retourne :
NUSE_SUCCESS — l'appel s'est terminé avec succès.
NUSE_INVALID_SEMAPHORE — l'index du sémaphore est invalide.
NUSE_INVALID_POINTER — un ou plusieurs arguments pointeur sont invalides.
Implémentation Nucleus SE des informations sur sémaphore
L'implémentation est concise : elle entre une section critique, copie la valeur du compteur, et, si le blocage est activé, énumère la table des tâches pour compter les tâches en attente et identifier la première tâche suspendue. Sinon, le compte d'attente et la première tâche sont mis à zéro.
NUSE_CS_Enter(); *current_count = NUSE_Semaphore_Counter[semaphore]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Semaphore_Blocking_Count[semaphore]; if (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; for (index = 0; index < NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { *first_task = index; break; } } } else { *first_task = 0; } #else *tasks_waiting = 0; *first_task = 0; #endif NUSE_CS_Exit(); return NUSE_SUCCESS;
Obtention du nombre de sémaphores
Ce service retourne le compte total de sémaphores définis dans l'application. Dans Nucleus RTOS, la valeur peut changer à l'exécution ; dans Nucleus SE, elle est fixée à la compilation.
Appel API Nucleus RTOS pour le compte de sémaphores
Prototype d'appel de service :
UNSIGNED NU_Established_Semaphores(VOID);
Retourne :
Le nombre de sémaphores créés dans l'application.
Appel API Nucleus SE pour le compte de sémaphores
Prototype d'appel de service :
U8 NUSE_Semaphore_Count(void);
Retourne :
Le nombre de sémaphores configurés dans l'application.
Implémentation Nucleus SE du compte de sémaphores
La routine retourne simplement la valeur de la constante de compilation NUSE_SEMAPHORE_NUMBER.
Continuer vers page deux : « Structures de données » >>
Embarqué
- Cloud vs Serveurs internes : Choisir la bonne solution d'hébergement
- Microsoft Azure Annonce Services de Tokenisation Blockchain & Gestion de Données
- Fondamentaux de la mémoire numérique : adressage, accès et volatilité
- Maîtriser les variables C# et types de données primitifs : guide complet
- Structures C++ vs Classes : guide pratique pour développeurs embarqués
- Boîtes aux lettres dans Nucleus SE : Guide pratique de configuration et d'utilisation
- Sémaphores dans Nucleus SE : Vue d'ensemble, configuration et API essentielles
- Maîtriser les groupes de drapeaux d'événement : Services utilitaires et structures de données dans Nucleus RTOS/SE
- Groupes de drapeaux d'événement dans Nucleus SE : Guide d'introduction à la configuration et l'utilisation des API