Toute la vérité sur RTOS. Article # 12. Services pour travailler avec des tâches



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

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 RTOS
Prototype 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 SE
Cet 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 SE
L'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 RTOS
Prototype 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 SE
Cet 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émentation
Pour 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 RTOS
Prototype 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 SE
Cet 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 SE
Le 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 RTOS
Prototype 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 SE
Cet 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 SE
L'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 RTOS
Prototype 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 SE
Cet 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émentation
L'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.

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


All Articles