Toute la vérité sur RTOS. Article # 23. Files d'attente: introduction et services de base



Les files d'attente ont été mentionnées dans l'un des articles précédents (# 5). Ils offrent un moyen plus flexible de transférer des messages simples entre les tâches par rapport aux boîtes aux lettres.

Articles précédents de la série:
Article # 22. Boîtes aux lettres: services auxiliaires et structures de données
Article # 21. Boîtes aux lettres: introduction et services de base
Article # 20. Sémaphores: services auxiliaires et structures de données
Article # 19. Sémaphores: introduction et services de base
Article # 18. Groupes d'indicateurs d'événements: services d'assistance et structures de données
Article # 17. Groupes de drapeaux d'événements: introduction et services de base
Article # 16. Signaux
Article # 15. Partitions de mémoire: services et structures de données
Article # 14. Sections de mémoire: introduction et services de base
Article # 13. Structures de données de tâche et appels d'API non pris en charge
Article # 12. Services pour travailler avec des tâches
Article # 11. Tâches: configuration et introduction à l'API
Article # 10. Scheduler: fonctionnalités avancées et préservation du contexte
Article # 9. Scheduler: implémentation
Article # 8. Nucleus SE: conception interne et déploiement
Article # 7. Nucleus SE: Introduction
Article # 6. Autres services RTOS
Article # 5. Interaction et synchronisation des tâches
Article # 4. Tâches, changement de contexte et interruptions
Article # 3. Tâches et planification
Article # 2. RTOS: Structure et mode temps réel
Article # 1. RTOS: introduction.

Utilisation de files d'attente


Dans Nucleus SE, les files d'attente sont définies pendant la phase de génération. Une application peut avoir jusqu'à 16 files d'attente. S'il n'y a pas de files d'attente dans l'application, ni les structures de données ni le code de service lié aux files d'attente ne sont inclus dans l'application.

Une file d'attente est un ensemble de zones en mémoire suffisamment grandes pour un élément de type ADDR et accessibles en toute sécurité afin que plusieurs tâches puissent l'utiliser. Les tâches peuvent écrire des données dans la file d'attente jusqu'à ce que toutes les zones soient pleines. Les tâches peuvent lire les données de la file d'attente, les données entrant généralement sur une base FIFO (premier entré, premier sorti). Tenter d'écrire des données dans une file d'attente surchargée ou de lire des données dans une file d'attente vide peut entraîner une erreur ou une pause de tâche, selon les paramètres d'appel API sélectionnés et la configuration de Nucleus SE.

Files d'attente et liaisons de données


Nucleus SE prend en charge les canaux de données, qui ont également été mentionnés dans un article précédent (# 5) et seront discutés en détail dans l'un des articles suivants. La principale différence entre les files d'attente et les canaux est la taille du message. Les files d'attente contiennent des messages constitués d'une seule variable de type ADDR (généralement des pointeurs). Le canal contient des messages de taille arbitraire, individuels pour chaque canal de l'application et attribués lors du paramétrage.

Configuration de la file d'attente


Nombre de files d'attente


Comme pour la plupart des objets Nucleus SE, la configuration de la file d'attente est principalement contrôlée par les directives #define du fichier nuse_config.h . Le paramètre principal est NUSE_QUEUE_NUMBER , qui détermine le nombre de files d'attente configurées dans l'application. La valeur par défaut est zéro (c'est-à-dire qu'il n'y a pas de files d'attente dans l'application) et peut prendre des valeurs jusqu'à 16. Une valeur incorrecte entraînera une erreur lors de la compilation, qui sera générée lors de la vérification dans le fichier nuse_config_check.h (elle est incluse dans le fichier nuse_config.c et compilée avec elle), ce qui déclenchera la directive #error .

La sélection d'une valeur différente de zéro sert d'activateur principal pour les files d'attente. Ce paramètre est utilisé lors de la définition des structures de données et leur taille dépend de sa valeur (plus à ce sujet dans l'article suivant). De plus, une valeur différente de zéro active les paramètres de l'API.

Activer les appels API


Chaque fonction API (appel d'utilitaire) dans Nucleus SE a une directive d'activation #define dans nuse_config.h . Pour les files d'attente, ces directives sont les suivantes:

NUSE_QUEUE_SEND NUSE_QUEUE_RECEIVE NUSE_QUEUE_JAM NUSE_QUEUE_RESET NUSE_QUEUE_INFORMATION NUSE_QUEUE_COUNT 

Par défaut, ils sont définis sur FALSE , désactivant ainsi tous les appels de service et bloquant l'inclusion de code qui les implémente. Pour configurer les files d'attente dans l'application, vous devez sélectionner les appels d'API nécessaires et les définir sur TRUE .

Voici un extrait de code du fichier nuse_config.h :

 #define NUSE_QUEUE_NUMBER 0 /* Number of queues in the system - 0-16 */ /* Service call enablers */ #define NUSE_QUEUE_SEND FALSE #define NUSE_QUEUE_RECEIVE FALSE #define NUSE_QUEUE_JAM FALSE #define NUSE_QUEUE_RESET FALSE #define NUSE_QUEUE_INFORMATION FALSE #define NUSE_QUEUE_COUNT FALSE 

Si les fonctions de l'API de file d'attente sont activées, mais qu'il n'y a pas de files d'attente dans l'application (à l'exception de NUSE_Queue_Count () , qui est toujours activé), une erreur de compilation apparaît. Si votre code utilise un appel d'API qui n'a pas été activé, cela entraînera une erreur de mise en page car le code d'implémentation n'a pas été inclus dans l'application.

File d'attente des appels


Nucleus RTOS prend en charge dix appels de service de file d'attente qui offrent les fonctionnalités suivantes:

  • Mettre un message en file d'attente. Nucleus SE est implémenté dans la fonction NUSE_Queue_Send () .
  • Accepter un message de la file d'attente. Nucleus SE implémente la fonction NUSE_Queue_Receive () .
  • Publication en tête de file d'attente. Dans Nucleus SE, implémenté dans NUSE_Queue_Jam () .
  • Restauration de la file d'attente dans un état inutilisé avec la libération de toutes les tâches suspendues (réinitialisation). Nucleus SE est implémenté dans NUSE_Queue_Reset () .
  • Fournir des informations sur une file d'attente spécifique. Nucleus SE implémenté dans NUSE_Queue_Information () .
  • Renvoie le nombre de files d'attente actuellement configurées dans l'application. Dans Nucleus SE, implémenté dans NUSE_Queue_Count () .
  • Ajout d'une nouvelle file d'attente à l'application (création d'une file d'attente). Nucleus SE n'est pas implémenté.
  • Suppression d'une file d'attente d'une application. Nucleus SE n'est pas implémenté.
  • Renvoyez des pointeurs vers toutes les files d'attente de l'application. Nucleus SE n'est pas implémenté.
  • Envoi d'un message à toutes les tâches suspendues dans la file d'attente (diffusion). Nucleus SE n'est pas implémenté.

La mise en œuvre de chacun de ces appels de surdébit est décrite en détail ci-dessous.

Appels de service pour l'écriture et la lecture des files d'attente


Les opérations de base qui sont effectuées sur les files d'attente sont l'écriture (qui est parfois appelée messages de mise en file d'attente) et la lecture (également appelée réception de messages). Il est également possible d'écrire au début de la file d'attente (brouillage). Nucleus RTOS et Nucleus SE fournissent trois appels d'API de base pour ces opérations, qui seront discutés ci-dessous.

File d'attente


L'appel de l'utilitaire Nucleus RTOS API pour l'écriture dans la file d'attente est très flexible et vous permet de suspendre la tâche implicitement, ou avec un délai d'expiration spécifique si l'opération ne peut pas être terminée immédiatement (par exemple, lorsque vous essayez d'écrire dans une file d'attente complète). Nucleus SE offre les mêmes fonctionnalités, mais la pause de tâche est facultative et aucun délai d'attente n'est implémenté.

File d'attente des appels dans Nucleus RTOS

Prototype d'appel de service:

STATUS NU_Send_To_Queue (file d'attente NU_QUEUE *, message VOID *, taille UNSIGNED, suspension UNSIGNED);

Paramètres:

file d'attente - un pointeur vers le bloc de contrôle de file d'attente fourni par l'utilisateur;
message - pointeur sur le message à envoyer;
size - le nombre d'éléments de données UNSIGNED dans le message. Si la file d'attente prend en charge les messages de longueur variable, ce paramètre doit être égal à la taille du message ou inférieur à la taille du message pris en charge par la file d'attente. Si la file d'attente prend en charge les messages d'une taille fixe, ce paramètre doit correspondre exactement à la taille du message pris en charge par la file d'attente;
suspend - la spécification de la suspension de la tâche, peut prendre les valeurs NU_NO_SUSPEND ou NU_SUSPEND ou une valeur de timeout.

Valeur de retour:

NU_SUCCESS - l'appel s'est terminé avec succès;
NU_INVALID_QUEUE - pointeur de file d'attente non valide;
NU_INVALID_POINTER - pointeur nul vers un message ( NULL );
NU_INVALID_SIZE - la taille du message est incompatible avec la taille du message prise en charge par la file d'attente;
NU_INVALID_SUSPEND - la suspension a été effectuée à partir d'un thread non lié à la tâche;
NU_QUEUE_FULL - la file d'attente est pleine et la suspension n'a pas été spécifiée;
NU_TIMEOUT - la file d'attente est pleine même après la suspension de la tâche pour le délai spécifié;
NU_QUEUE_DELETED - la file d'attente a été supprimée alors que la tâche a été suspendue;
NU_QUEUE_RESET - La file d'attente a été réinitialisée lors de la suspension de la tâche.

Mise en file d'attente d'un message dans Nucleus SE
Cet appel de service d'API prend en charge la fonctionnalité de base de l'API Nucleus RTOS.

Prototype d'appel de service:

STATUS NUSE_Queue_Send (file d'attente NUSE_QUEUE, message ADDR *, suspension U8);

Paramètres:

queue - index de file d'attente (ID);
message - un pointeur sur le message à envoyer, est une variable de type ADDR ;
suspend - spécification pour suspendre les tâches; il peut prendre les valeurs NUSE_NO_SUSPEND ou NUSE_SUSPEND .

Valeur de retour:

NUSE_SUCCESS - l'appel s'est terminé avec succès;
NUSE_INVALID_QUEUE - index de file d'attente non valide;
NUSE_INVALID_POINTER - pointeur nul vers un message ( NULL );
NUSE_INVALID_SUSPEND - essayez de suspendre une tâche à partir d'un thread non associé à la tâche ou lorsque les appels de service API sont désactivés pour bloquer les tâches;
NUSE_QUEUE_FULL - la file d'attente est pleine et la suspension n'a pas été spécifiée;
NUSE_QUEUE_WAS_RESET - La file d'attente a été réinitialisée lors de la suspension de la tâche.

Implémenter la mise en file d'attente dans Nucleus SE
La version du code de fonction API NUSE_Queue_Send () (après vérification des paramètres) est sélectionnée à l'aide de la compilation conditionnelle, selon que la prise en charge du verrouillage des tâches est activée ou non. Nous considérerons les deux options.

Si le verrouillage des tâches n'est pas activé, le code de cet appel de service est assez simple:

 if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { return_value = NUSE_QUEUE_FULL; } else /* queue element available */ { NUSE_Queue_Data[queue][NUSE_Queue_Head[queue]++] = *message; if (NUSE_Queue_Head[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Head[queue] = 0; } NUSE_Queue_Items[queue]++; return_value = NUSE_SUCCESS; } 

La fonction vérifie simplement s'il y a de l'espace libre dans la file d'attente et utilise l' index NUSE_Queue_Head [] pour stocker le message dans la zone de données de la file d'attente.

Si le verrouillage des tâches est activé, le code devient plus complexe:

 do { if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_QUEUE_FULL; } else { /* block task */ NUSE_Queue_Blocking_Count[queue]++; NUSE_Suspend_Task(NUSE_Task_Active, (queue << 4) | NUSE_QUEUE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } else { /* queue element available */ NUSE_Queue_Data[queue][NUSE_Queue_Head[queue]++] = *message; if (NUSE_Queue_Head[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Head[queue] = 0; } NUSE_Queue_Items[queue]++; if (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; /* check whether a task is blocked on this queue */ NUSE_Queue_Blocking_Count[queue]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } } while (suspend == NUSE_SUSPEND); 

Certaines clarifications peuvent être utiles.

Le code est enfermé dans une boucle do ... while , qui s'exécute alors que le paramètre de pause de tâche est NUSE_SUSPEND .

Si la file d'attente est pleine et que la suspension est NUSE_NO_SUSPEND , l'appel API se termine par NUSE_QUEUE_FULL . Si le paramètre de suspension est NUSE_SUSPEND , la tâche se met en pause. À la fin (c'est-à-dire lorsque la tâche reprend), si la valeur de retour est NUSE_SUCCESS , c'est-à-dire que la tâche a été reprise car le message a été lu (et non parce que la file d'attente a été réinitialisée), le code revient au début de la boucle.
Si la file d'attente n'est pas pleine, le message fourni est stocké à l'aide de l' index NUSE_Queue_Head [] dans la zone de données de la file d'attente. Il vérifie s'il y a des tâches suspendues (messages en attente) dans la file d'attente. S'il existe de telles tâches, la première d'entre elles reprend. La variable de suspension est définie sur NUSE_NO_SUSPEND et l'appel d'API se termine avec la valeur NUSE_SUCCESS .

Lecture dans la file d'attente


L'appel de l'utilitaire Nucleus RTOS API pour lire à partir de la file d'attente est très flexible et vous permet de suspendre les tâches implicitement, ou avec un délai d'attente spécifique si l'opération ne peut pas être terminée immédiatement (par exemple, lorsque vous essayez de lire à partir d'une file d'attente vide). Nucleus SE offre les mêmes fonctionnalités, mais la pause de tâche est facultative et aucun délai d'attente n'est implémenté.

Appel pour recevoir des messages de la file d'attente dans Nucleus RTOS
Prototype d'appel de service:

STATUS NU_Receive_From_Queue (file d'attente NU_QUEUE *, message VOID *, taille UNSIGNED, UNSIGNED * actual_size, suspension UNSIGNED);

Paramètres:

file d'attente - un pointeur vers le bloc de contrôle de file d'attente fourni par l'utilisateur;
message - un pointeur vers la mémoire pour les messages reçus;
size - le nombre d'éléments de données UNSIGNED dans le message. Ce nombre doit correspondre à la taille de message définie lors de la création de la file d'attente;
suspend - la spécification de la suspension de la tâche, peut prendre les valeurs NU_NO_SUSPEND ou NU_SUSPEND ou une valeur de timeout.

Valeur de retour:

NU_SUCCESS - l'appel s'est terminé avec succès;
NU_INVALID_QUEUE - pointeur de file d'attente non valide;
NU_INVALID_POINTER - pointeur nul vers un message ( NULL );
NU_INVALID_SUSPEND - essayez de suspendre une tâche à partir d'un thread sans rapport avec la tâche;
NU_QUEUE_EMPTY - la file d'attente est vide et la suspension n'a pas été spécifiée;
NU_TIMEOUT - indique que la file d'attente est toujours vide, même après la suspension de la tâche pendant une période de temps spécifiée;
NU_QUEUE_DELETED - la file d'attente a été supprimée alors que la tâche a été suspendue;
NU_QUEUE_RESET - La file d'attente a été réinitialisée lors de la suspension de la tâche.

Appel pour recevoir des messages de la file d'attente Nucleus SE
Cet appel d'API prend en charge la fonctionnalité principale de l'API Nucleus RTOS.

Prototype d'appel de service:

STATUS NUSE_Queue_Receive (file d'attente NUSE_QUEUE, message ADDR *, suspension U8);

Paramètres:

queue - index de file d'attente (ID);
message - un pointeur vers le référentiel pour les messages reçus, il s'agit d'une variable de type ADDR ;
suspend - spécification de la suspension de la tâche, peut prendre les valeurs NUSE_NO_SUSPEND ou NUSE_SUSPEND .

Valeur de retour:

NUSE_SUCCESS - l'appel s'est terminé avec succès;
NUSE_INVALID_QUEUE - index de file d'attente non valide;
NUSE_INVALID_POINTER - pointeur nul vers un message ( NULL );
NUSE_INVALID_SUSPEND - une tentative de suspension d'une tâche à partir d'un thread non associé à la tâche ou avec une prise en charge désactivée pour le blocage des tâches;
NUSE_QUEUE_EMPTY - la file d'attente est vide et la suspension n'a pas été spécifiée;
NUSE_QUEUE_WAS_RESET - La file d'attente a été réinitialisée lors de la suspension de la tâche.

Implémentation de la réception des messages des files d'attente dans Nucleus SE
La version du code de fonction API NUSE_Queue_Receive () (après vérification des paramètres) est sélectionnée à l'aide de la compilation conditionnelle, selon que la prise en charge du verrouillage des tâches est activée ou non. Considérez les deux options.

Si la prise en charge du verrouillage est activée, le code de cet appel d'API est assez simple:

 if (NUSE_Queue_Items[queue] == 0) /* queue empty */ { return_value = NUSE_QUEUE_EMPTY; } else { /* message available */ *message = NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]++]; if (NUSE_Queue_Tail[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Tail[queue] = 0; } NUSE_Queue_Items[queue]--; return_value = NUSE_SUCCESS; } 

La fonction vérifie simplement s'il y a un message dans la file d'attente et utilise l' index NUSE_Queue_Tail [] pour récupérer le message de la file d'attente et renvoyer des données à l'aide d'un pointeur vers le message.

Si le verrouillage des tâches est activé, le code devient plus complexe:

 do { if (NUSE_Queue_Items[queue] == 0) /* queue empty */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_QUEUE_EMPTY; } else { /* block task */ NUSE_Queue_Blocking_Count[queue]++; NUSE_Suspend_Task(NUSE_Task_Active, (queue << 4) | NUSE_QUEUE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } else { /* message available */ *message = NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]++]; if (NUSE_Queue_Tail[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Tail[queue] = 0; } NUSE_Queue_Items[queue]--; if (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; /* check whether a task is blocked */ /* on this queue */ NUSE_Queue_Blocking_Count[queue]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } } while (suspend == NUSE_SUSPEND); 

Certaines clarifications seront utiles.

Le code est enfermé dans une boucle do ... while , qui s'exécute alors que le paramètre de pause de tâche est NUSE_SUSPEND .

Si la file d'attente est vide et que la suspension est NUSE_NO_SUSPEND , l'appel API se termine par NUSE_QUEUE_EMPTY . Si le paramètre de suspension est NUSE_SUSPEND , la tâche se met en pause. À la fin (c'est-à-dire lorsque la tâche reprend), si la valeur de retour est NUSE_SUCCESS , c'est-à-dire que la tâche a été reprise car le message a été envoyé (et non parce que la file d'attente a été réinitialisée), le code retourne au début de la boucle.

Si la file d'attente contient des messages, le message stocké est renvoyé à l'aide de l' index NUSE_Queue_Tail [] . Il vérifie s'il y a des tâches suspendues (en attente) dans cette file d'attente. S'il existe de telles tâches, la première d'entre elles reprend. La variable de suspension est définie sur NUSE_NO_SUSPEND et l'appel API se termine avec le code NUSE_SUCCESS .

Écrivez au chef de file d'attente


L'appel de l'utilitaire Nucleus RTOS API pour écrire un message dans la tête de file d'attente est très flexible et vous permet de suspendre la tâche implicitement, ou avec un délai d'attente spécifique si l'opération ne peut pas être terminée immédiatement (par exemple, lorsque vous essayez d'écrire dans une file d'attente encombrée). Nucleus SE offre les mêmes fonctionnalités, mais la pause de tâche est facultative et aucun délai d'attente n'est implémenté.

Appelez pour écrire un message à la tête de la file d'attente Nucleus RTOS
Prototype d'appel de service:

STATUS NU_Send_To_Front_Of_Queue (file d'attente NU_QUEUE *, message VOID *, taille UNSIGNED, suspension UNSIGNED);

Paramètres:

file d'attente - un pointeur vers le bloc de contrôle de file d'attente fourni par l'utilisateur;
message - pointeur sur le message à envoyer;
size - le nombre d'éléments de données UNSIGNED dans le message. Si la file d'attente prend en charge les messages de longueur variable, ce paramètre doit être égal à la taille du message ou inférieur à la taille de message prise en charge par la file d'attente. Si la file d'attente prend en charge les messages d'une longueur fixe, ce paramètre doit correspondre exactement à la taille du message pris en charge par la file d'attente;
suspend - la spécification de la suspension de la tâche, peut prendre les valeurs NU_NO_SUSPEND ou NU_SUSPEND ou une valeur de timeout.

Valeur de retour:

NU_SUCCESS - l'appel s'est terminé avec succès;
NU_INVALID_QUEUE - pointeur de file d'attente non valide;
NU_INVALID_POINTER - pointeur nul vers un message ( NULL );
NU_INVALID_SIZE - la taille du message est incompatible avec la taille du message prise en charge par la file d'attente;
NU_INVALID_SUSPEND - tentative de pause à partir d'un flux non-tâche
NU_QUEUE_FULL - la file d'attente est pleine et la suspension n'a pas été spécifiée;
NU_TIMEOUT - la file d'attente est pleine, même après la suspension de la tâche pour un certain délai;
NU_QUEUE_DELETED - la file d'attente a été supprimée alors que la tâche a été suspendue;
NU_QUEUE_RESET - La file d'attente a été réinitialisée lors de la suspension de la tâche.

Un appel pour écrire un message à la tête d'une file d'attente dans Nucleus SE
Cet appel d'API prend en charge la fonctionnalité principale de l'API Nucleus RTOS.

Prototype d'appel de service:

STATUS NUSE_Queue_Jam (file d'attente NUSE_QUEUE, message ADDR *, suspension U8);

Paramètres:

queue - index de file d'attente (ID);
message - un pointeur vers un message, est une variable de type ADDR ;
suspend - spécification de la suspension de la tâche, peut prendre les valeurs NUSE_NO_SUSPEND ou NUSE_SUSPEND .

Valeur de retour:

NUSE_SUCCESS - l'appel s'est terminé avec succès;
NUSE_INVALID_QUEUE - index de file d'attente non valide;
NUSE_INVALID_POINTER - pointeur nul vers un message ( NULL );
NUSE_INVALID_SUSPEND - une tentative de suspension d'une tâche à partir d'un thread non associé à la tâche ou avec une prise en charge désactivée pour le blocage des tâches;
NUSE_QUEUE_FULL - la file d'attente est pleine et la suspension n'a pas été spécifiée;
NUSE_QUEUE_WAS_RESET - La file d'attente a été réinitialisée lors de la suspension de la tâche.

Implémentation d'un enregistrement de file d'attente supérieur dans Nucleus SE
La variante de code de fonction API NUSE_Queue_Jam () est très similaire à NUSE_Queue_Send () , seules les données sont stockées à l'aide de l' index NUSE_Queue_Tail [] , donc:

 if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { return_value = NUSE_QUEUE_FULL; } else /* queue element available */ { if (NUSE_Queue_Tail[queue] == 0) { NUSE_Queue_Tail[queue] = NUSE_Queue_Size[queue] - 1; } else { NUSE_Queue_Tail[queue]--; } NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]] = *message; NUSE_Queue_Items[queue]++; return_value = NUSE_SUCCESS; } 

Le prochain article examinera les appels d'API supplémentaires associés aux files d'attente, ainsi que les structures de données.

À 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.

Source: https://habr.com/ru/post/fr431378/


All Articles