
Nous continuons à examiner les services RTOS qui fournissent des informations supplémentaires sur les tâches et les opérations avec eux.
Les appels d'API supplémentaires associés aux tâches incluent les appels pour obtenir l'ID de tâche, vérifier la taille de la pile, réinitialiser la tâche, obtenir des informations sur la tâche et déterminer le nombre de tâches dans le système. Nucleus RTOS et Nucleus SE fournissent 4 appels API majeurs pour ces opérations, que je couvrirai dans cet article.
Articles précédents de la série:
Article # 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.
Obtention de l'ID de la tâche en cours
Cet appel d'utilitaire renvoie l'ID de la tâche appelée. Pour Nucleus RTOS, il s'agit d'un pointeur vers l'unité de contrôle de la tâche en cours. Pour Nucleus SE, l'index (0-15) de la tâche en cours.
Appel de la tâche en cours dans Nucleus RTOSPrototype d'appel de service:
NU_TASK * NU_Current_Task_Pointer (VOID);Paramètres:
Sont absents.
Valeur de retour:
Pointeur vers l'unité de contrôle de la tâche en cours;
NU_NULL - aucune tâche en cours d'exécution.
Défier une tâche en cours dans Nucleus SECet appel d'API prend en charge la fonctionnalité principale de l'API Nucleus RTOS.
Prototype d'appel de service:
NUSE_TASK NUSE_Task_Current (void);Paramètres:
Sont absents.
Valeur de retour:
Index de la tâche actuelle (appelée).
Terminer une tâche en cours dans Nucleus SEL'implémentation de l'appel API dans ce cas est assez simple: la valeur de la variable globale
NUSE_Task_Active est retournée .
Vérification de la taille de pile disponible
Cet appel d'utilitaire renvoie la taille de pile disponible (en octets) pour la tâche en cours. Ceci n'est conseillé que pour les planificateurs, où chaque tâche a sa propre pile; c'est-à -dire Ne convient pas au planificateur Run To Completion (RTC) dans Nucleus SE.
Rappel des informations de volume de pile dans Nucleus RTOSPrototype d'appel de service:
UNSIGNED NU_Task_Check_Stack (VOID);Paramètres:
Sont absents.
Valeur de retour:
Taille de la taille de pile disponible pour la tâche en cours en octets.
Rappel des informations de taille de pile dans Nucleus SECet appel d'API prend en charge la fonctionnalité principale de l'API Nucleus RTOS. Cependant, Nucleus SE nécessite un paramètre formel (factice) pour faciliter l'obtention de la valeur du pointeur sur la pile utilisée.
Prototype d'appel de service:
U16 NUSE_Task_Check_Stack (mannequin U8);Paramètres:
factice - toute valeur, car en fait, il n'est pas utilisé.
Valeur de retour:
Taille de la taille de pile disponible pour la tâche en cours en octets.
ImplémentationPour un tel appel, le code doit être portable:

Si le planificateur RTC est utilisé, la valeur de retour est 0 car il n'est pas possible (à l'aide d'un code portable) de déterminer l'espace de pile disponible pour la tâche.
Dans d'autres cas, la valeur du pointeur de pile est déterminée en trouvant l'adresse du paramètre fictif, qui sera situé presque au début de la pile. À strictement parler, une telle méthode dépend des outils de développement / compilateur, mais fonctionnera toujours. La valeur de retour est la différence entre cette valeur et la valeur d'origine de l'espace de pile, traduite en octets.
Réinitialisation de la tâche
Un appel API, dans ce cas, ramène la tâche à son état inutilisé d'origine. Une telle fonction d'API est différente des fonctions de réinitialisation d'API habituelles pour les autres objets du noyau, ne serait-ce que parce qu'il s'agit d'une réinitialisation, et pas seulement de définir la tâche à son état initial (pour Nucleus SE, il s'agit soit de
NUSE_READY, soit de l'entrée
NUSE_Task_Initial_State [] (voir Structures de données dans article suivant)); la tâche est mise en attente (
NUSE_PURE_SUSPEND ) et doit être reprise pour être à nouveau planifiée. Cette logique est similaire à la fonctionnalité de l'appel d'API correspondant dans Nucleus RTOS.
Appel de réinitialisation de tâche dans Nucleus RTOSPrototype d'appel de service:
STATUS NU_Reset_Task (tâche NU_TASK *, args UNSIGNED, VOID * argv);Paramètres:
tâche - un pointeur vers un bloc de contrôle de tâche;
argc - un élément de données qui peut être utilisé pour transférer des informations à la tâche;
argv est un pointeur qui peut être utilisé pour transmettre des informations à la tâche.
Valeur de retour:
NU_SUCCESS - l'appel s'est terminé avec succès;
NU_INVALID_TASK - pointeur non valide vers la tâche;
NU_NOT_TERMINATED - la tâche décrite n'est pas dans un état de suspension complète (terminée) ou d'achèvement (terminée); seules les tâches en pause ou terminées peuvent être réinitialisées.
Appel de réinitialisation de tâche dans Nucleus SECet appel d'API prend en charge la fonctionnalité principale de l'API Nucleus RTOS.
Prototype d'appel de service:
STATUS NUSE_Task_Reset (tâche NUSE_TASK);Paramètres:
task - index (ID) de la tâche à réinitialiser.
Valeur de retour:
NUSE_SUCCESS - l'appel s'est terminé avec succès;
NUSE_INVALID_TASK - index de tâche non valide.
Implémenter des tâches de réinitialisation dans Nucleus SELe but principal de la fonction API
NUSE_Task_Reset () après avoir vérifié le paramètre est de réinitialiser toutes les structures de données de tâche:

Si la tâche est bloquée lorsque l'API est appelée pour attendre l'accès à l'objet noyau, la première chose à faire est de configurer le compteur des tâches bloquées correspondant à l'objet. Cela se fait par l'instruction switch.
Ensuite, les structures de données de tâche sont initialisées (en gros, avec des zéros, à l'exception de son bloc de contexte) en appelant la fonction d'initialisation
NUSE_Init_Task () . Sa mise en œuvre sera discutée plus en détail dans le prochain article décrivant l'initialisation du système. Enfin, l'état de la tâche est défini sur
NUSE_PURE_SUSPEND .
Obtention d'informations sur les tâches
Cet appel de service fournit des informations partielles sur la tâche. L'implémentation de Nucleus SE diffère de Nucleus PLUS, dans laquelle moins d'informations sont renvoyées, car le nommage des objets, le remplacement d'une tâche et d'une tranche de temps de priorité inférieure ne sont pas pris en charge, et la priorité n'est pas renvoyée, en tant qu'informations redondantes.
Informations sur les tâches d'appel dans Nucleus RTOSPrototype d'appel de service:
STATUS NU_Task_Information (tâche NU_TASK *, nom CHAR *, DATA_ELEMENT * task_status, UNSIGNED * Schedule_count, OPTION * Priority, OPTION * Preempt, UNSIGNED * time_slice, VOID ** stack_base, UNSIGNED * stack_size, UNSIGNED * minimum_stack;Paramètres:
tâche - un pointeur sur la tâche pour laquelle des informations sont demandées;
nom - pointeur vers une chaîne de 8 caractères pour le nom de la tâche; comprend une zone pour les caractères nuls;
task_status - pointeur vers une variable qui reçoit la valeur actuelle de l'état de la tâche;
schedule_count - pointeur sur une variable qui reçoit la valeur du compteur, combien de fois la tâche a été ajoutée au planificateur;
priorité - un pointeur sur une variable pour obtenir la priorité de la tâche;
préemption - un pointeur vers une variable pour les options d'éviction d'une tâche de priorité inférieure;
NU_PREEMPT indique que la tâche peut être
évincée et
NU_NO_PREEMPT indique que la tâche ne peut pas être évincée;
time_slice - pointeur sur une variable pour obtenir la valeur du quantum de temps de la tâche; une valeur de 0 indique que la quantification du temps n'est pas possible pour cette tâche;
stack_base - pointeur vers une variable pour obtenir l'adresse de la pile de tâches;
stack_size - pointeur vers une variable pour obtenir la taille de la pile de tâches;
minimum_stack - un pointeur vers une variable pour obtenir le nombre minimum d'octets restant sur la pile.
Valeur de retour:
NU_SUCCESS - l'appel s'est terminé avec succès;
NU_INVALID_TASK - pointeur non valide vers la tâche.
Appeler des informations sur les tâches dans Nucleus SECet appel prend en charge la fonctionnalité de base de l'API Nucleus PLUS.
Prototype d'appel de service:
STATUS NUSE_Task_Information (tâche NUSE_TASK, U8 * état_tâche, U16 * nombre_planifié, ADDR * pile_base, U16 * pile_taille);Paramètres:
tâche - index de la tâche pour laquelle des informations sont demandées;
task_status - un pointeur vers une variable
U8 , qui reçoit la valeur actuelle de l'état de la tâche (si l'état d'attente de la tâche n'est pas disponible, rien n'est renvoyé);
schedule_count - pointeur sur la variable
U16 , qui reçoit la valeur du compteur du nombre de tâches ajoutées au planificateur (si le compteur des tâches planifiées est désactivé, alors rien n'est retourné);
stack_base - un pointeur vers une variable
ADDR qui reçoit l'adresse de la pile de tâches (si le planificateur RTC est utilisé, rien n'est retourné);
stack_size est un pointeur sur une variable
U16 qui obtient la taille de la pile de tâches (si le planificateur RTC est utilisé, rien n'est retourné).
Valeur de retour:
NUSE_SUCCESS - l'appel s'est terminé avec succès;
NUSE_INVALID_TASK - index de tâche non valide;
NUSE_INVALID_POINTER - les paramètres du pointeur (un ou plusieurs) sont incorrects.
Implémenter la récupération d'informations sur les tâches dans Nucleus SEL'implémentation de cet appel d'API est assez simple:

La fonction renvoie l'état de la tâche en tenant compte des différentes options de configuration.
Obtenir le nombre de tâches
Cet appel de service renvoie des informations sur le nombre de tâches configurées dans l'application. Alors que dans Nucleus RTOS, ce nombre peut changer et que la valeur de retour représentera le nombre actuel de tâches à l'heure actuelle, dans Nucleus SE, la valeur de retour est définie lors de l'assemblage et ne change plus.
Le défi d'obtenir le nombre de tâches dans Nucleus RTOSPrototype d'appel de service:
UNSIGNED NU_Established_Tasks (VOID);Paramètres:
Sont absents
Valeur de retour:
Le nombre de tâches installées (créées et non supprimées) dans l'application.
Le défi d'obtenir le nombre de tâches dans Nucleus SECet appel d'API prend en charge la fonctionnalité principale de l'API Nucleus PLUS.
Prototype d'appel de service:
U8 NUSE_Task_Count (void);Paramètres:
Sont absents
Valeur de retour:
Le nombre de tâches configurées dans l'application.
ImplémentationL'implémentation de cet appel API est assez simple: la valeur de la directive
#define NUSE_TASK_NUMBER est
retournée .
L'article suivant décrit les structures de données dans Nucleus SE liées aux tâches et certains appels d'API standard non pris en charge par Nucleus SE.
À 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.
À propos de la traduction: cette série d'articles semblait intéressante en ce que, malgré les approches décrites obsolètes à certains endroits, l'auteur dans un langage très compréhensible présente au lecteur mal formé les caractéristiques du système d'exploitation en temps réel. J'appartiens moi-même à l'équipe de créateurs du
RTOS russe , que nous avons l'
intention de rendre gratuit , et j'espère que le cycle sera utile aux développeurs novices.