Toute la vérité sur RTOS. Article # 27. Heure système

Le concept de temps dans le contexte de RTOS a été introduit dans l'un des articles précédents , ainsi que l'idée de fonctions liées au temps disponibles dans RTOS.



Articles précédents de la série:
Article # 26. Canaux: services auxiliaires et structures de données
Article # 25. Canaux de données: introduction et services de base
Article # 24. Files d'attente: services auxiliaires et structures de données
Article # 23. Files d'attente: introduction et services de base
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.

Timer timer


Toutes les fonctions liées au temps sont contrôlées par une horloge matérielle. Il s'agit d'un oscillateur simple qui génère des requêtes d'interruption à intervalles réguliers. Pour que les numéros d'horloge aient un sens pour les programmes d'application, la fréquence du générateur doit être connue.

Gestion des interruptions de minuterie


Les interruptions générées par le temporisateur matériel doivent être traitées d'une certaine manière dans le gestionnaire d'interruptions (Routine de service d'interruption, ISR), qui implémente toutes les fonctions RTOS temporelles. Les détails du gestionnaire d'interruption du temporisateur dans Nucleus SE seront abordés dans l'un des articles suivants.

Fonctions liées au temps


Nucleus RTOS et Nucleus SE contiennent plusieurs mécanismes liés au temps:

  • Horloge de pointage système (horloge de pointage) : compteur simple incrémenté à l'aide d'un gestionnaire d'interruption de minuterie. Nucleus RTOS et Nucleus SE ont un compteur 32 bits et les tâches ont des mécanismes pour lire et écrire sa valeur. Dans Nucleus SE, une horloge est facultative.
  • Temporisateurs d' application : Nucleus RTOS et Nucleus SE prennent en charge les objets temporisateur. Leur utilisation et leur implémentation dans Nucleus SE seront discutées plus en détail dans le prochain article.
  • Planification des tranches de temps : dans Nucleus RTOS, les tâches ayant la même priorité sont exécutées à l'aide de l'algorithme Round-robin, mais vous pouvez également utiliser la tranche de temps. Dans Nucleus SE, un planificateur de découpage temporel est facultatif; cela a été discuté en détail dans les articles précédents (une vue générale de l'ordonnanceur TS (tranche de temps) et TS dans Nucleus SE ).
  • Suspendre une tâche (sommeil de tâche) : une tâche peut se suspendre («s'endormir») pendant une période de temps fixe. Ce mécanisme a déjà été décrit en détail précédemment .
  • Délais d'expiration des appels API : dans Nucleus RTOS et Nucleus SE, certains appels API vous permettent de suspendre une tâche en attendant qu'une ressource soit disponible. La pause peut être indéfinie ou, dans le cas de Nucleus RTOS, un délai d'expiration facultatif (période d'attente) peut être indiqué. Nucleus SE ne prend pas en charge les délais d'expiration des appels d'API.

Précision


Et maintenant, il vaut la peine de parler brièvement de la précision de la minuterie du système.

La précision des fonctions temporelles dépend directement de la fréquence du générateur d'horloge. Par exemple, si des impulsions arrivent toutes les 10 millisecondes et que la tâche d'application a besoin d'un délai de 100 millisecondes, elle a évidemment besoin de 10 impulsions. Cependant, on ne sait pas quand l'impulsion précédente a été reçue: elle aurait pu se produire il y a juste ou presque 10 millisecondes. Par conséquent, un délai de 100 millisecondes peut prendre jusqu'à 110 millisecondes.

Une façon évidente de résoudre ce problème est d'augmenter la fréquence du générateur. Si les impulsions suivent à des intervalles de 1 milliseconde, un délai de 100 millisecondes ne prendra jamais plus de cent et une millisecondes. L'inconvénient de cette solution est que le gestionnaire d'interruption du minuteur prendra 10 fois plus de temps processeur, ce qui sera excessif. Le concepteur du système doit trouver un équilibre entre la précision nécessaire du temporisateur et la puissance disponible du processeur.

Réglage de l'heure système


Comme pour la plupart des objets Nucleus SE, les paramètres d'heure du système sont pour la plupart contrôlés par les directives #define du fichier nuse_config.h . Le paramètre principal est NUSE_SYSTEM_TIME_SUPPORT , qui active le mécanisme de prise en charge de l'heure système. Vous n'avez pas besoin de spécifier le nombre d'objets: l'heure système est activée ou non.

Le choix d'une valeur non nulle est le principal activateur de l'heure système. Ce paramètre est utilisé lors de la définition des structures de données, qui seront décrites en détail plus loin dans cet article. De plus, une valeur différente de zéro active les paramètres de l'API.

Activation de l'API


Chaque fonction API (appel d'utilitaire) dans Nucleus SE a une directive d'activation #define dans le fichier nuse_config.h. Pour l'heure système, ces symboles sont:
NUSE_CLOCK_SET
NUSE_CLOCK_RETRIEVE

Par défaut, ils sont définis sur FALSE , donc tous les appels de service sont désactivés, bloquant l'inclusion de code qui les implémente. Pour configurer l'heure système dans l'application, vous devez sélectionner les appels de service API nécessaires et les définir sur VRAI .

Voici un extrait de code du fichier nuse_config.h par défaut.

#define NUSE_SYSTEM_TIME_SUPPORT FALSE /*    */ #define NUSE_CLOCK_SET FALSE /*   */ #define NUSE_CLOCK_RETRIEVE FALSE /*    */ 

Si vous essayez d'utiliser l'appel de service API d'heure système lorsque l'activateur d'heure système est désactivé, une erreur de compilation se produit. Si votre code utilise un appel d'API qui n'a pas été activé, une erreur de mise en page se produira car le code d'implémentation n'a pas été inclus dans l'application.

Appels de l'utilitaire d'heure système


Nucleus RTOS prend en charge deux appels d'utilitaires liés à l'heure système et offrant les fonctionnalités suivantes:

  • Réglage de la valeur de l'heure système. Nucleus SE est implémenté dans la fonction NUSE_Clock_Set () .
  • Obtenir la valeur de l'heure du système. Nucleus SE est implémenté dans la fonction NUSE_Clock_Retrieve () .

Considérez la mise en œuvre de chacun de ces appels plus en détail.

Appels de service pour régler et obtenir l'heure du système


Avec l'heure système, vous ne pouvez effectuer que des opérations de réglage sur une valeur donnée et d'obtention de la valeur actuelle. Nucleus RTOS et Nucleus SE fournissent deux appels d'API de base pour implémenter ces opérations.

L'interprétation de la valeur de temps système dépend de l'application, car il s'agit essentiellement d'un compteur du nombre de "cycles d'horloge" qui se sont produits depuis la dernière réinitialisation du compteur. Pour utiliser ces informations, la fréquence du générateur doit être connue.

Réglage de l'heure


Toute tâche peut définir l'heure système en appelant cette fonction API.

Appel pour définir l'heure système dans Nucleus RTOS

Prototype d'appel de service:
VOID NU_Set_Clock (UNSIGNED new_value);

Paramètres:
new_value - valeur à affecter à l'heure système

Valeur de retour: aucune.

Appel pour définir l'heure du système dans Nucleus SE
Cet appel d'API prend en charge la fonctionnalité principale de l'API Nucleus RTOS.

Prototype d'appel de service:
void NUSE_Clock_Set (U32 new_value);

Paramètres:
new_value - valeur à affecter à l'heure système

Valeur de retour: aucune

Implémentation de la mise à l'heure dans Nucleus SE
Le code est très simple. La valeur fournie est écrite dans NUSE_Tick_Clock dans la section critique.

Obtenir l'heure du système


Une tâche peut obtenir la valeur d'heure système à l'aide de cette fonction API.

Appel pour obtenir l'heure système dans Nucleus RTOS

Prototype d'appel de service:
UNSIGNED NU_Retrieve_Clock (VOID);

Paramètres: aucun

Valeur de retour: valeur actuelle de l'heure système

Appel pour obtenir l'heure système dans Nucleus SE
Prototype d'appel de service:
U32 NUSE_Clock_Retrieve (void);

Paramètres: aucun

Valeur de retour: valeur actuelle de l'heure système

Implémentation de l'acquisition de temps dans Nucleus SE
Le code est très simple. La fonction renvoie la valeur NUSE_Tick_Clock obtenue dans la section critique.

Structures de données


L'heure système utilise une structure de données (située dans la RAM), qui est un mot de 32 bits.

Je recommande fortement que le code d'application n'utilise pas un accès direct à cette structure de données, mais y accède via les fonctions API fournies. Cela évitera l'incompatibilité avec les futures versions de Nucleus SE et les effets secondaires indésirables, ainsi que simplifiera le portage des applications vers Nucleus RTOS. Les détails des structures de données sont fournis ci-dessous pour simplifier la compréhension du code d'appel de service et du débogage.

Données RAM


Structure des données:
NUSE_Tick_Clock - une variable de type U32 , qui stocke le compteur d'horloge de l'heure système.

Cette structure de données est initialisée à zéro par la fonction NUSE_Init_Task () au démarrage de Nucleus SE. L'un des articles suivants contiendra une description complète des procédures de démarrage de Nucleus SE.

Données ROM


Il n'y a aucune structure de données associée à l'heure système dans la ROM.

La quantité de mémoire pour l'heure système


Comme tous les autres objets Nucleus SE, la quantité de mémoire requise pour le temps système est prévisible.

La quantité de mémoire dans la ROM est 0.

La quantité de mémoire en RAM (en octets) est toujours de 4.

Appels d'API non réalisés


Tous les appels de service de l'API Nucleus RTOS au niveau du système ont un équivalent dans Nucleus SE.

Compatible avec Nucleus PLUS


Comme pour tous les autres objets Nucleus SE, mon objectif était de m'assurer que le code d'application est aussi compatible que possible avec Nucleus RTOS. L'heure système ne fait pas exception et, du point de vue de l'utilisateur, elle est implémentée de la même manière que dans Nucleus RTOS. Les appels d'API Nucleus RTOS peuvent être directement portés vers Nucleus SE.

Dans l'article suivant, nous examinerons les minuteries logicielles.

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


All Articles