ELE-542 Systèmes ordinés en temps réels Cours # 8 Système d
Transcription
ELE-542 Systèmes ordinés en temps réels Cours # 8 Système d
ELE-542 Systèmes ordinés en temps réels Cours # 8 Système d’exploitation Temps Réel Jean-Marc Beaulieu et Bruno De Kelper Site internet: http://www.ele.etsmtl.ca/academique/ele542/ Systèmes ordinés en temps réel Cours 8 1 Systèmes d’exploitation en temps réel complet - Augmente les fonctionnalités des noyaux temps réel en ajoutant des fonctionnalités tels que des interfaces réseaux, des pilotes compliqués, des outils de déverminage, … - Utilise un ordonnanceur de type Round-Robin, priorité préemptive ou les deux. - Le répartiteur s’appuie habituellement sur le modèle des “blocs de contrôle de tâche” car le nombre de tâches à gérer est indéterminé et dynamique. - Deux catégories de OS : - Les systèmes multitâches permettent l’exécution concurrente de plusieurs tâches (multiprocessus ou multifils) Ex. : µC/OS-II, Linux, QNX, VXworks, IRIX, UNIX - Les systèmes plus simples permettent l’exécution d’une seule tâche. Ex. : DOS, CPU32BUG Systèmes ordinés en temps réel Système d'exploitation temps réel Cours 8 cours 8 2 1 Systèmes d’exploitation en temps réel complet Définitions : Tâches, processus et fil d’exécution Un fil d’exécution (« thread ») comprend 2 éléments : • Une séquence d’instructions en exécution (ou exécutable) • Un « état du processeur » et une pile ; ceci inclut un locus (ou point) de contrôle dans la séquence d’instructions (compteur de programme). Note : Deux ou plusieurs fils peuvent avoir le même code; cependant, ils contrôlent leur « point d’exécution » indépendamment. • Pour nous, tâche et fil d’exécution sont synonymes. Un processus comprend : • Un ou plusieurs fils d’exécutions • Un espace mémoire Systèmes ordinés en temps réel Cours 8 3 Systèmes d’exploitation en temps réel complet Définitions : Section critique, ressource, ressource partagée Section (de code) critique ou atomique • Une partie de code (séquence d’instructions) qui doit être exécutée sans interruption Ressource • Une entité utilisée par une tâche Ex. : périphérique tel que imprimante, clavier, écran variable, structure de données, vecteur Ressource partagée (« shared resource ») • Ressource utilisée par plusieurs tâches • Généralement, l’accès à une ressource partagée doit être contrôlé afin d’éviter les conflits Ex. : 2 tâches écrivant dans une variable en même temps Réf. : Labrosse, chap. ordinés 2 Systèmes en temps réel Système d'exploitation temps réel Cours 8 cours 8 4 2 Systèmes d’exploitation en temps réel complet Modèle des “blocs de contrôle de tâche” : (Task-Control Blocks) - Utile dans les systèmes d’exploitation complet car il permet de gérer efficacement un nombre variable de tâches. - Associe à chaque tâche une structure de donnée appelée TCB (Task-Control Block) qui contient toute l’information nécessaire pour exécuter la tâche: TCB Contexte - Compteur de programme - Pointeur de pile - Registre de statut - Adresses des données -… Code d’identification Niveau de priorité Systèmes ordinés en temps réel Cours 8 5 Systèmes d’exploitation en temps réel complet Processus avec 1 fil Réf: Grehan, Moote et Cyliax Real-time programming Systèmes ordinés en temps réel Système d'exploitation temps réel Processus avec 2 fils Cours 8 cours 8 6 3 Systèmes d’exploitation en temps réel complet États d’une tâche : 1 - En exécution : La tâche est exécutée par le processeur. En exécution Prête Suspendue Dormante 2 – Prête : Dans la file d’attente pour être exécutée. 3 – Suspendue : En attente d’une ressource/d’un évènement. 4 – Dormante/Inactive : État utilisé seulement lorsque le nombre de tâches est fixe et permet de conserver une tâche dans le système sans avoir à la gérer. Systèmes ordinés en temps réel Cours 8 7 Systèmes d’exploitation en temps réel complet Gestionnaire de tâches : - Le système d’exploitation gère les tâches (ne devrait pas utiliser plus de 2% à 5% du temps du processeur). - Le système d’exploitation est la tâche de priorité la plus élevée. - Chaque interruption matérielle et chaque appel système, tels que les requêtes à une ressource, invoque le système d’exploitation. - L’OS possède au moins 2 listes : - Liste des tâches prêtes → gérée en Round-Robin ou préemption - Liste des tâches suspendues → gérée en priorité préemptive - L’OS possède aussi au moins 2 tables : - Tables des ressources - Tables des requêtes aux ressources Systèmes ordinés en temps réel Système d'exploitation temps réel Cours 8 cours 8 8 4 Gestion des tâches – Notion de préemption OS multitâches préemptif : • La tâche/interruption qui est la plus prioritaire interrompt les tâches/interruptions de plus basse priorité. • Déjà vue dans le cas des interruptions hiérarchiques OS multitâches coopératif (sans préemption) : • Chaque tâche doit libérer explicitement (par une instruction) le processeur.. • Chaque tâche doit « relâcher » le processeur fréquemment. • Évènements asynchrones sont toujours traités par les interruptions mais sont traitées seulement lorsque le processeur est « libéré » par la tâche courante. • Avantages : Pas besoin de fonctions réentrantes, sauf pour les ISR. Moins de protection des données partagées. • Inconvénient : Temps de réponse est plus long. Réf. : Labrosse, chap. 2 Systèmes ordinés en temps réel Cours 8 9 Exécution – Système coopératif 1) Une tâche est interrompue (IRQ). 2) Saut vers ISR 3) ISR traite l’événement et rend une tâche plus prioritaire prête pour l’exécution 4) Retour de ISR 5) Continuation de la tâche interrompue 6) La tâche de basse priorité relâche le CPU 7) La tâche de haute priorité exécute Tâche de priorité basse ISR rend la tâche de priorité haute « prête » Tâche de priorité haute Tâche de priorité basse libère le CPU Réf. : Labrosse, chap. 2 Systèmes ordinés en temps réel Système d'exploitation temps réel Temps Cours 8 cours 8 10 5 Exécution – Système préemptif Tâche de priorité basse 1) Une tâche de basse priorité est interrompue (IRQ) 2) Saut vers ISR 3) ISR traite l’événement et rend une tâche plus prioritaire prête pour l’exécution. 4) Retour de ISR 5) Exécution immédiate de la tâche de haute priorité exécute 6) Retour à la tâche de plus basse priorité (1) (2) (3) (4) ISR rend la tâche de priorité haute « prête » (6) (5) Temps Tâche de priorité haute Note : Une interruption périodique de la minuterie est utilisée pour déclencher régulièrement le séquenceur. (7) Réf. : Labrosse, chap. 2 Systèmes ordinés en temps réel 11 Cours 8 Systèmes d’exploitation en temps réel complet Représentation structurelle : ISR Tâches dormantes : MEM Tâches 0 1 2 Priorité 7 6 5 4 3 2 1 0 Tâche active Tâches en attente : PC SP Priorité 7 6 5 4 3 2 1 Autres registres Tâches prêtes : 0 3 4 CODE CPU 5 6 7 0 1 Liste de tâches ID État Priorité 3 Autres registres Autres registres ID État Priorité PC SP Autres registres PC SP 4 ID État Priorité ID État Priorité 6 Systèmes ordinés en temps réel Système d'exploitation temps réel PILE PC SP Autres registres 2 PC SP 5 Cours 8 cours 8 7 12 6 µC/OS-II – Les états d’une tâche Réf. : Labrosse, chap. 2 Systèmes ordinés en temps réel Cours 8 13 Noyaux en temps réel – Services offerts Il est possible de regrouper les principaux services offerts par les noyaux en temps réel. Nous utiliserons le cas de µC/OS-II : Gestion des interruptions Æ Activation, désactivation et traitement Gestion des tâches Æ Création, … Communication intertâches Æ Sémaphores, boîte à courrier, queue Séquenceur Gestion du temps ÆHorloge et délais Gestion de la mémoire Æ Mémoire partagée, … Systèmes ordinés en temps réel Système d'exploitation temps réel Cours 8 cours 8 14 7 Noyaux en temps réel – Gestion des tâches Les fonctions nécessaires à la gestion des tâches dans µC/OS-II sont : Création d’une tâche Élimination d’une tâche Suspendre/reprendre une tâche Retardement d’une tâche Requête d’information ISR Tâches dormantes : Tâches en attente : Priorité 7 6 5 4 CPU 3 2 1 0 Tâche active PC SP Priorité 7 6 5 4 3 2 1 Autres registres • • • • • 0 Tâches prêtes : Sujets connexes • Les fonctions internes du noyau (répartiteur, séquenceur) • Les tâches systèmes (Ex : fonctions « Idle », « statistique ») Systèmes ordinés en temps réel 15 Cours 8 Noyaux en temps réel – Gestion des tâches Création d’une tâche Allocation de mémoire pour la pile et TCB Initialisation de la pile : configuration de départ Initialisation de la table de contrôle de la tâche (TCB) Rendre la tâche active (prête pour exécution) Appeler le séquenceur ACTION Tâches dormantes : Priorité 7 6 Liste des tâches Quelles sont les informations nécessaires dans le TCB? • Un compteur ordinal (numéro ou ID de la tâche) • État et priorité • Pointeur vers la pile • Durée de retard fixée par une minuterie • Copie des registres : SP (stack pointer), registres généraux, registres du coprocesseur mathématique Systèmes ordinés en temps réel Système d'exploitation temps réel Cours 8 cours 8 5 4 3 2 1 0 Tâches prêtes : Nouvelle tâche PC SP Autres registres • • • • ID État Priorité 16 8 Noyaux en temps réel – Gestion des tâches Création d’une tâche : uC/OS-II - 2 fonctions de création d’une tâche : ErrCode OSTaskCreate(maTâche, ¶mètre, &pile, priorité) Code de retour Code de la tâche Pointeur vers Pointeur vers OS_NO_ERR (nom de la fonction) paramètre la pile de la tâche OS_PRIO_EXIST (début de la pile) (optionnel) OS_PRIO_INVALID OS_NO_MORE_TCB Niveau de priorité de la tâche (code d’identité) ErrCode OSTaskCreateExt(maTâche, ¶mètre, &pile, priorité, ID, &pileFin, pileTaille, &TCBextension, options) Code d’identité (optionnel) Pointeur vers le bas de la pile Options de la tâche Pointeur vers une Taille de la pile extension du TCB Systèmes ordinés en temps réel OS_TASK_OPT_STK_CHK OS_TASK_OPT_STK_CLR OS_TASK_OPT_SAVE_FP 17 Cours 8 Noyaux en temps réel – Gestion des tâches Création de tâche dans uC/OS-II • Une tâche est constituée de 3 choses : exemple - Code de la tâche : fournit par le programmeur (vous !). - Bloc de contrôle de tâche (TCB) : créé lorsque la tâche est créée. - Pile de la tâche : statique ou dynamique créé avant de créer la tâche. Déclaration d’une pile : Code d’une tâche : Pointeur vers paramètres Boucle infinie void Task (void *pdata) { déclarations de variables locales Statique #define TASK_STK_SIZE 512 OS_STK TaskStk [TASK_STK_SIZE]; Code d’initialisation (optionnel) for (;;) { Code d’exécution de la tâche (contient des appels au système) } Dynamique #define TASK_STK_SIZE 512 OS_STK *pStk; } pStk = (OS_STK *)malloc(TASK_STK_SIZE); Systèmes ordinés en temps réel Système d'exploitation temps réel Cours 8 cours 8 18 9 Noyaux en temps réel – Gestion des tâches Création d’une tâche (suite) Problème : Comment estimer la taille de la pile de façon à éviter les débordements? • Changer la taille de la pile de façon dynamique Æ Pas recommandé parce que l’allocation dynamique est lente et il n’y a pas de garantie de succès • Estimer la taille de la pile (variables locales, récursivité, niveau d’interruptions imbriqués, …). Une bonne marge de sécurité (1,5 à 2 fois la taille estimée) est à prévoir • Tester le code plusieurs fois, dans des conditions critiques, pour établir une taille sécuritaire Problème : La création d’une tâche peut consommer beaucoup de temps. Comment en minimiser l’impact? • Créer toutes les tâches au départ (initialisation). Si elles ne sont pas utilisées au départ, les mettre en attente (suspension) Systèmes ordinés en temps réel 19 Cours 8 Noyaux en temps réel – Gestion des tâches Élimination d’une tâche µC/OS-II procède en deux (2) étapes : ACTION Problème : Comment s’assurer que la tâche éliminée ne possède pas l’accès exclusif à une ressource partagée qui ne sera jamais relâchée? • • Une tâche ne doit pas éliminer d’autres tâches (sauf elle-même). Utilisation d’un mécanisme de « requête d’élimination » où on demande à une tâche de terminer « proprement ». Systèmes ordinés en temps réel Système d'exploitation temps réel Cours 8 cours 8 Tâches dormantes : Priorité 7 6 5 4 3 2 1 0 Tâches prêtes : Tâche PC SP Autres registres Soustraire la tâche du séquenceur (l’enlever des différentes tables qu’il utilise). 2. Libère la mémoire occupée par le TCB et la pile. Note : ceci permet de réactiver les IRQ après la première étape (p-c-q la tâche à éliminer ne peut plus être « exécutée ». Liste des tâches 1. ID État Priorité 20 10 Noyaux en temps réel – Gestion des tâches Élimination d’une tâche : uC/OS-II - 2 fonctions d’élimination d’une tâche : - Pas sécuritaire. ErrCode OSTaskDel(priorité) - Permet à une tâche Niveau de priorité de la tâche de s’auto-détruire (sert en même temps de Code de retour (préférable). code d’identification) OS_TASK_DEL_ERR OS_TASK_DEL_ISR OS_NO_ERR OS_TASK_DEL_IDLE OS_PRIO_INVALID (commun au deux) OS_TASK_NOT_EXIST OS_TASK_DEL_REQ - Plus sécuritaire. ErrCode OSTaskDelReq(priorité) - Demande à une tâche de s’auto-détruire. Systèmes ordinés en temps réel 21 Cours 8 Noyaux en temps réel – Gestion des tâches action Suspendre/reprendre une tâche • • • • Tâches en attente : Il est parfois utile de suspendre l’exécution d’une tâche. Ex. : Tâches créées au début mais utiles seulement à la fin du traitement. Utile dans le débogage et les tests : Permet d’isoler l’effet de l’exécution d’une tâche µC/OS-II utilise deux (2) fonctions à cette fin : Code de retour (commun au deux) 6 5 4 3 2 1 0 Priorité 6 5 4 3 2 1 0 7 Tâches prêtes : Niveau de priorité de la tâche OS_NO_ERR OS_PRIO_INVALID OS_TASK_SUSPEND_IDLE OS_TASK_SUSPEND_PRIO ErrCode OSTaskSuspend(priorité) OS_TASK_RESUME_PRIO OS_TASK_NOT_SUSPENDED ErrCode OSTaskResume(priorité) Systèmes ordinés en temps réel Système d'exploitation temps réel Priorité 7 Cours 8 cours 8 22 11 Noyaux en temps réel – Gestion des tâches Retardement d’une tâche Ce service permet de retarder une tâche pour un certain nombre de Ticks d’horloge ou une durée de temps (H.M.S.mS). Utile pour les tâches cycliques ou pour accorder du temps aux autres tâches. Un retardement nul est parfois utilisé pour déclencher l’exécution du séquenceur. La résolution de la durée d’attente dépend de l’initialisation du Timer. • • • Retardement d’une tâche Délai Fin du délai Tâches en attente : Priorité 7 6 6 5 5 4 4 3 3 Tâches en attente : CPU 2 2 1 1 Tâches prêtes : 0 0 Priorité 7 Tâche active 6 5 4 CPU 3 2 1 0 Tâche active PC PC SP SP Autres registres Priorité 7 ISR (Timer) Priorité 7 6 5 4 3 2 1 Autres registres • 0 Tâches prêtes : Systèmes ordinés en temps réel 23 Cours 8 Noyaux en temps réel – Gestion des tâches Retardement d’une tâche : • uC/OS-II uC/OS-II fournit 2 fonctions qui permettent à une tâche de se mettre en attente pendant un délai déterminé : Résolution dépend de l’initialisation du Timer void OSTimeDly(Ticks) Nombre de Ticks d’horloge (0 à 65535) void OSTimeDlyHMSM(heures,minutes,secondes,millisecondes) Max : • 0 à 255 0 à 59 0 à 59 0 à 999 uC/OS-II fournit aussi 1 fonction qui permet à une tâche de forcer le retour d’une tâche qui a été mise en attente : Code de retour ErrCode OSTimeDlyResume(priorité) OS_NO_ERR OS_PRIO_INVALID OS_TIME_NOT_DLY OS_TASK_NOT_EXIST Note : ne peut pas forcer le retour d’une tâche retardée pour plus de 65535 Ticks. Systèmes ordinés en temps réel Système d'exploitation temps réel Cours 8 cours 8 Niveau de priorité de la tâche 24 12 Noyaux en temps réel – Gestion des tâches Autopsie d’un système simple : uC/OS-II Les déclarations : #include (Librairies standards à inclure) Déclarations des librairies Déclarations des constantes Déclarations des variables globales (piles, sémaphores, drapeaux, …) Déclarations des prototypes (tâches, fonctions) #include #include #include #include "\software\ucos-ii\ix86l\bc45\os_cpu.h" "os_cfg.h" "\software\ucos-ii\source\ucos_ii.h" "\software\blocks\pc\bc45\pc.h“ #define TASK_STK_SIZE OS_STK OS_STK OS_STK OS_STK void void void void 512 TaskStk1 [TASK_STK_SIZE]; TaskStk2 [TASK_STK_SIZE]; TaskStk3 [TASK_STK_SIZE]; TaskStartStk[TASK_STK_SIZE]; Task1(void *data); Task2(void *data); Task3(void *data); TaskStart(void *data); Systèmes ordinés en temps réel Cours 8 25 Noyaux en temps réel – Gestion des tâches Autopsie d’un système simple : Le démarrage du système : uC/OS-II void main (void) { OSInit(); Initialise uC/OS-II et crée une tâche “inactive“ (Idle Task) PC_DOSSaveReturn(); Sauve le contexte du DOS PC_VectSet(uCOS, OSCtxSw); Installe l’interruption pour les changements de contexte OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0); OSStart(); Démarre uC/OS-II } (Tout ceci est obligatoire et selon cet ordre) Crée une 1ière tâche de niveau de priorité très élevé (niveau 0). Cette tâche va servir à démarrer. les autres tâches. Systèmes ordinés en temps réel Système d'exploitation temps réel Cours 8 cours 8 26 13 Noyaux en temps réel – Gestion des tâches Autopsie d’un système simple : Le démarrage du système : uC/OS-II void TaskStart (void *pdata) { INT16S key; pdata = pdata; OS_ENTER_CRITICAL(); PC_VectSet(0x08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL(); Obligatoire pour initialiser le Timer utilisé par uC/OS-II et doit être fait après OSStart() Créer les tâches ici for (;;) { if (PC_GetKey(&key) == TRUE) { if (key == 0x1B) { PC_DOSReturn(); } } OSTimeDlyHMSM(0, 0, 1, 0); } Obligatoire sous DOS seulement pour permettre d’arrêter le système Permet d’accorder du temps aux autres tâches } Systèmes ordinés en temps réel Système d'exploitation temps réel Cours 8 cours 8 27 14