17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 1 NOYAU TEMPS RÉEL Quelques Informations DIAPORAMA EN LIGNE =>
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 2 LA FONCTION InitNoyau() AU RETOUR DE LA FONCTION, LES TABLEAUX pNumTache, TabPrio et la TCB DE LA TÂCHE main EXISTENT pNumTache => TabPrio => TCB (main) => 0000 SuivTcb DS:4332 PrecTcb Nid Prio Etat Encours Status StCoursPret EvtSig EvtAtt Pet PtrPile BasePile NB : LES VALEURS NUMÉRIQUES ONT ÉTÉ RELEVÉES AVEC TURBO DEBUGER DE PLUS, L'INTERRUPTION TIMER (TYPE 1CH) EST DÉTOURNÉE. DÉSORMAIS, C'EST LA FONCTION GestInt() QUI CORRESPOND AU PROGRAMME D'INTERRUPTION. CETTE FONCTION EST DONC NORMALEMENT EXÉCUTÉE TOUTES LES 55 ms (IT MATÉRIELLE). ELLE PEUT AUSSI ÊTRE EXÉCUTÉE PAR UNE INTERRUPTION LOGICIELLE (geninterrupt(0x1C);). À NOTER QUE LA TCB DE LA TÂCHE main N'A PAS BESOIN D'ÊTRE INITIALISÉE À 100%. C'EST AINSI QU'IL EST INUTILE, ENTRE AUTRES, D'INITIALISER LES DEUX DERNIERS ÉLÉMENTS PUISQUE LA PILE DE LA TÂCHE main EST LA PILE SYSTÈME.
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 3 À PROPOS DE L'INTERRUPTION DE TYPE 0x1C DANS UN PC L'INTERRUPTION LA PLUS PRIORITAIRE EST GÉNÉRÉE PAR UN TIMER. C'EST AINSI QU'UNE INTERRUPTION MATÉRIELLE EST GÉNÉRÉE TOUTES LES 55 MS. LE PROGRAMME D'INTERRUPTION COMPORTE ENTRE AUTRES LES ÉLÉMENTS SUIVANTS : Sauvegarde du contexte - int 1CH - Envoi d'un EOI Restitution du contexte iret TOUTES LES 55 MS L'INTERRUPTION DE TYPE 0x1C SE LIMITE À LA SEULE INSTRUCTION iret. iret InitNoyau() DÉTOURNE CETTE INTERRUPTION : L'ADRESSE DE DÉPART DU PROGRAMME D'INTERRUPTION EST MODIFIÉE ET CORRESPOND DÉSORMAIS À L'ADRESSE DE LA FONCTION GestInt() (ORDONNANCEUR). Sauvegarde du contexte - Restitution du contexte iret FONCTION GestInt() ORDONNANCEUR
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 4 LA FONCTION CreateTask(IdTache, Priorite, Tache) CETTE FONCTION VA CRÉER LA TCB DE LA TÂCHE Tache. PAR EXEMPLE, SI ON ÉCRIT : InitNoyau(); CreateTask(1,3,Tache_1); ON DISPOSE À LA SORTIE DE LA FONCTION CreateTask () DES INFORMATIONS SUIVANTES : pNumTache => TabPrio => D 445A 64F1 TCB (Tache_1) => F1 SuivTcb << DS:4352 PrecTcb Nid Prio Etat Dormante Status StDormante EvtSig EvtAtt Pet PtrPile BasePile F D 5CDD F204 xxxx Non Utilisé << 64F1:4472 Flags CS Offset Tache_1 AX BX CX DX ES DS SI DI 0000 DI BP << 64F1:445A << <<< 64F1: – 12 MOTS DISPONIBLES D'autre part, une pile de 256 mots a été créée. Elle correspond aux 256 mots à partir de l'adresse 64F1:4372. À noter que dans le modèle small les registres DS, ES et SS ont la même valeur (ici 64F1). Le registre CS a une valeur différente (ici 5CDD). Actuellement, le haut de cette pile correspond à l'adresse 64F1:445A. Cela ne fait pas 256 mots. En effet 12 mots ont déjà été mis par la fonction CreateTask(). LA TCB EXISTE (SON ADRESSE APPARAÎT DANS LE TABLEAU pNumTache). MAIS ELLE N'EST PAS CHAÎNÉE ET ELLE EST IGNORÉE DANS LE TABLEAU TabPrio. LA TÂCHE EST DORMANTE. NB : LES VALEURS NUMÉRIQUES ONT ÉTÉ RELEVÉES AVEC TURBO DEBUGER
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 5 LA FONCTION StartTask(IdTache) CETTE FONCTION : -1- COMPLÈTE LA TCB CRÉÉE PAR CreateTask(): - Mise en place des deux premiers éléments SuivTcb et PrecTcb. - L'état de la tâche passe de l'état Dormante (8) à l'état Prete (2). -2- MET À JOUR LE TABLEAU TabPrio. -3- PROVOQUE UN RÉORDONNANCEMENT. InitNoyau(); CreateTask(1,3,Tache_1); StartTask(1); INTÉRESSONS NOUS À LA SÉQUENCE :
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 6 LA FONCTION StartTask(IdTache) (SUITE) InitNoyau(); CreateTask(1,3,Tache_1); StartTask(1); pNumTache => TabPrio => D 445A 64F1 TCB (Tache_1) => F1 SuivTcb << DS:4352 PrecTcb Nid Prio Etat Prete Status StCoursPrete EvtSig EvtAtt Pet PtrPile BasePile F D 5CDD F204 xxxx Non Utilisé << 64F1:4472 Flags CS Offset Tache_1 AX BX CX DX ES DS SI DI 0000 DI BP << 64F1:445A << <<< 64F1:4372 APPEL DE L'ORDONNANCEUR => geninterrupt(0x1C);
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 7 APPEL DE L'ORDONNANCEUR PAR geninterrupt(0x1c) xxxx 64F1 xxxx 5CDD xxxx Flags CS retour IP Retour AX BX CX DX ES DS SI DI BP IL S'AGIT D'UNE INTERRUPTION LOGICIELLE. LE μP SAUVE DANS LA PILE LE REGISTRE DES FLAGS ET L'ADRESSE DE RETOUR (CS ET IP). ACTUELLE LA PILE ACTUELLE MONTE ON ARRIVE DANS LE PROGRAMME D'INTERRUPTION OU LE COMPILATEUR A PLACÉ LA SUITE D'INSTRUCTIONS : PUSH AX, PUSH BX, PUSH CX, PUSH DX, PUSH ES, PUSH DS, PUSH SI, PUSH DI, PUSH BP. L'ORDONNANCEUR BALAIE LE TABLEAU TabPrio EN PARTANT DU BAS (PRIORITÉ MAXIMUM) TabPrio => IL CONSTATE QU'IL EXISTE UNE TÂCHE DE PRIORITÉ SUPÉRIEURE À LA TÂCHE EN COURS. LA TCB DE CETTE TÂCHE EST À L'ADRESSE LE SP ACTUEL POINTE ICI
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 8 APPEL DE L'ORDONNANCEUR PAR geninterrupt(0x1c) (SUITE) xxxx 64F1 xxxx 5CDD xxxx Flags CS retour IP Retour AX BX CX DX ES DS SI DI BP D 445A 64F1 TCB (Tache_1) => F1 SuivTcb PrecTcb Nid Prio Etat Prete Status StCoursPrete EvtSig EvtAtt Pet PtrPile BasePile C'EST AINSI QUE L'ORDONNANCEUR ACCÈDE À LA TCB DE LA TÂCHE 1. IL CONSTATE QUE CETTE TÂCHE EST PRÊTE. IL FAUT DONC PROCÉDER À UNE COMMUTATION DE TÂCHE. POUR CELA, IL COMMENCE PAR SAUVEGARDER LA VALEUR DU SP ACTUEL DANS L'ÉLÉMENT PtrPile DE LA TCB DE LA TÂCHE EN COURS. LA TÂCHE EN COURS PASSE À L'ÉTAT PRÊTE (MODIFICATIONS DE Etat DE LA TCB DE CETTE TÂCHE). PILE ACTUELLE ENSUITE IL MODIFIE L' ÉLÉMENT État DE LA TCB DE LA TÂCHE 1 : CETTE TÂCHE PASSE À L'ÉTAT EnCours. ENFIN, IL MODIFIE LE POINTEUR DE PILE (SP) ET LUI DONNE LA VALEUR 445A Etat EnCours SP 0000 TCB (main) => 0000 SuivTcb PrecTcb Nid Prio Etat EnCours Status StCoursPrete EvtSig EvtAtt Pet PtrPile BasePile 0002 Etat Prete 0000
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 9 APPEL DE L'ORDONNANCEUR PAR geninterrupt(0x1c) (SUITE) xxxx 64F1 xxxx 5CDD xxxx Flags CS retour IP Retour AX BX CX DX ES DS SI DI BP D 445A 64F1 TCB (Tache_1) => F1 SuivTcb << DS:4352 PrecTcb Nid Prio Status StCoursPrete EvtSig EvtAtt Pet PtrPile BasePile F D 5CDD F204 xxxx Non Utilisé << 64F1:4472 Flags CS Offset Tache_1 AX BX CX DX ES DS SI DI 0000 DI BP << 64F1:445A << <<< 64F1:4372 C'EST AINSI QUE L'ORDONNANCEUR ACCÈDE À LA TCB DE LA TÂCHE 1. IL CONSTATE QUE CETTE TÂCHE EST PRÊTE. IL FAUT DONC PROCÉDER À UNE COMMUTATION DE TÂCHE. POUR CELA, IL COMMENCE PAR SAUVEGARDER LA VALEUR DU SP ACTUEL DANS L'ÉLÉMENT PtrPile DE LA TCB DE LA TÂCHE EN COURS. LA TÂCHE EN COURS PASSE À L'ÉTAT SUSPENDUE (MODIFICATIONS DE Etat DE LA TCB DE CETTE TÂCHE. ON ARRIVE MAINTENANT À LA FIN DU PROGRAMME D'INTERRUPTION OU LE COMPILATEUR A PLACÉ LA SUITE D'INSTRUCTIONS : POP BP, POP DI, POP SI, POP DS, POP ES, POP DX, POP CX, POP BX, POP AX, IRET. ET VOICI LA PILE UTILISÉE POUR TOUTES CES INSTRUCTIONS PILE ACTUELLE ENSUITE IL MODIFIE L' ÉLÉMENT État DE LA TCB DE LA TÂCHE 1 : CETTE TÂCHE PASSE À L'ÉTAT EnCours. ENFIN, IL MODIFIE LE POINTEUR DE PILE (SP) ET LUI DONNE LA VALEUR 445A Etat EnCours
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 10 NOYAU TEMPS RÉEL Quelques Informations FIN