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é

Sémaphores :services utilitaires et structures de données


Voir la série RTOS Revealed

Cet article continue le regard sur les sémaphores.

Semaphore Utility Services

Nucleus RTOS dispose de quatre appels d'API qui fournissent des fonctions utilitaires associées aux sémaphores :réinitialiser le sémaphore, renvoyer des informations sur un sémaphore, renvoyer le nombre de sémaphores dans l'application et renvoyer des pointeurs vers tous les sémaphores de l'application. Les trois premiers d'entre eux sont implémentés dans Nucleus SE.

Réinitialiser un sémaphore

Cet appel d'API restaure le sémaphore à son état initial inutilisé. Cette fonction API est inhabituelle, comparée à celle disponible pour d'autres objets du noyau, car, bien qu'il s'agisse d'une réinitialisation, elle n'initialise pas simplement son compteur à la valeur de démarrage ; un nouveau compte initial est fourni dans l'appel. Toutes les tâches suspendues sur le sémaphore sont reprises et reçoivent un code retour NUSE_SEMAPHORE_WAS_RESET (dans Nucleus SE, ou NU_SEMAPHORE_RESET avec Nucleus RTOS).

Appel d'API Nucleus RTOS pour réinitialiser un sémaphore

Prototype d'appel de service :

STATUT NU_Reset_Semaphore(NU_SEMAPHORE  *sémaphore,
UNSIGNED initial_count );

Paramètres :

sémaphore – pointeur vers le bloc de contrôle de sémaphore fourni par l'utilisateur

initial_count – la valeur à laquelle le compteur du sémaphore doit être mis

Retours :

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

NU_INVALID_SEMAPHORE – le pointeur du sémaphore n'est pas valide

Appel API Nucleus SE pour réinitialiser un sémaphore

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

Prototype d'appel de service :

STATUS NUSE_Semaphore_Reset(NUSE_SEMAPHORE sémaphore,
U8 initial_count);

Paramètres :

sémaphore – l'index (ID) du sémaphore à réinitialiser

initial_count – la valeur à laquelle le compteur du sémaphore doit être mis

Retours :

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

NUSE_INVALID_SEMAPHORE – l'index sémaphore n'est pas valide

Implémentation de Nucleus SE de la réinitialisation des sémaphores

Le travail principal du NUSE_Semaphore_Reset() La fonction API - après vérification des paramètres - consiste simplement à définir l'entrée appropriée dans NUSE_Semaphore_Counter[] à la valeur initiale fournie.

Lorsque le blocage est activé, un code supplémentaire est requis pour débloquer les tâches :

while (NUSE_Semaphore_Blocking_Count[semaphore] !=0){ U8 index ; /* vérifie si des tâches sont bloquées */ /* sur ce sémaphore */ for (index=0; index 

Chaque tâche suspendue sur le sémaphore est marquée comme « prête » avec un code de retour de suspension de NUSE_SEMAPHORE_WAS_RESET . Une fois ce processus terminé, si le planificateur de priorité est utilisé, un appel est effectué vers NUSE_Reschedule() , car une ou plusieurs tâches de priorité plus élevée peuvent avoir été préparées et doivent être autorisées à s'exécuter.

Informations sur le sémaphore

Cet appel de service obtient une sélection d'informations sur un sémaphore. L'implémentation Nucleus SE diffère de Nucleus RTOS en ce sens qu'elle renvoie moins d'informations, car la dénomination des objets et l'ordre de suspension ne sont pas pris en charge et la suspension des tâches peut ne pas être activée.

Appel API Nucleus RTOS pour informations sur les sémaphores

Prototype d'appel de service :

STATUT NU_Semaphore_Information(NU_SEMAPHORE *semaphore,
CHAR *nom, UNSIGNED *current_count, OPTION *suspend_type,
UNSIGNED *tasks_waiting, NU_TASK **first_task);

Paramètres :

sémaphore – pointeur en haut du bloc de contrôle du sémaphore sur lequel des informations sont demandées

nom – pointeur vers une zone de destination de 8 caractères pour le nom du sémaphore; cela inclut l'espace pour le terminateur nul

current_count – un pointeur vers une variable, qui recevra la valeur courante du compteur sémaphore

suspend_type – pointeur vers une variable qui contient le type de suspension de la tâche ; les types de suspension de tâche valides sont NU_FIFO et NU_PRIORITY

tasks_waiting – un pointeur vers une variable qui recevra le nombre de tâches suspendues sur ce sémaphore

first_task – un pointeur vers une variable de type NU_TASK qui recevra un pointeur vers le bloc de contrôle de la première tâche suspendue

Retours :

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

NU_INVALID_SEMAPHORE – le pointeur du sémaphore n'est pas valide

Appel API Nucleus SE pour informations sur les sémaphores

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

Prototype d'appel de service :

STATUS NUSE_Semaphore_Information(NUSE_SEMAPHORE sémaphore,
U8 *current_count, U8 *tasks_waiting, NUSE_TASK *first_task );

Paramètres :

sémaphore – l'index du sémaphore sur lequel l'information est demandée

current_count – un pointeur vers une variable, qui recevra la valeur courante du compteur sémaphore

tasks_waiting – un pointeur vers une variable qui recevra le nombre de tâches suspendues sur ce sémaphore (rien n'est renvoyé si la suspension de tâche est désactivée)

first_task – un pointeur vers une variable de type NUSE_TASK qui recevra l'index de la première tâche suspendue (rien de renvoyé si la suspension de tâche est désactivée)

Retours :

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

NUSE_INVALID_SEMAPHORE – l'index sémaphore n'est pas valide

NUSE_INVALID_POINTER – un ou plusieurs paramètres du pointeur sont invalides

Implémentation Nucleus SE des informations sur les sémaphores

La mise en œuvre de cet appel d'API est assez simple :

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) { indice U8 ; for (index=0; index 

La fonction renvoie l'état du sémaphore. Ensuite, si le blocage des appels API est activé, le nombre de tâches en attente et l'index de la première sont renvoyés (sinon ces deux paramètres sont mis à 0).

Obtention du nombre de sémaphores

Cet appel de service renvoie le nombre de sémaphores configurés dans l'application. Alors que dans Nucleus RTOS, cela variera dans le temps et que la valeur renvoyée représentera le nombre actuel de sémaphores, dans Nucleus SE, la valeur renvoyée est définie au moment de la construction et ne peut pas changer.

Appel d'API Nucleus RTOS pour le nombre de sémaphores

Prototype d'appel de service :

UNSIGNED NU_Established_Semaphores (VOID) ;

Paramètres :

Aucun

Retours :

Le nombre de sémaphores créés dans l'application

Appel API Nucleus SE pour le décompte des sémaphores

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

Prototype d'appel de service :

U8 NUSE_Semaphore_Count(void);

Paramètres :

Aucun

Retours :

Le nombre de sémaphores configurés dans l'application

Implémentation Nucleus SE du décompte des sémaphores

La mise en œuvre de cet appel d'API est presque trivialement simple :la valeur du #define symbole NUSE_SEMAPHORE_NUMBER est renvoyé.

Continuer à la page deux :"Structures de données">>


Embarqué

  1. Les avantages et les inconvénients du cloud par rapport aux services internes
  2. Services de gestion de données et de jetons Blockchain Microsoft Azure
  3. Termes et concepts de la mémoire numérique
  4. Variables C# et types de données (primitifs)
  5. Structures et classes en C++
  6. Boîtes aux lettres :présentation et services de base
  7. Sémaphores :introduction et services de base
  8. Groupes d'indicateurs d'événement :services publics et structures de données
  9. Groupes d'indicateurs d'événement :introduction et services de base