Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parGrégoire Robillard Modifié depuis plus de 10 années
1
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 1 NOYAU TEMPS RÉEL Quelques Informations DIAPORAMA EN LIGNE => www.ecole.ensicaen.fr/~viennewww.ecole.ensicaen.fr/~vienne
2
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. 0 1 4332 0000 2 3 4 5 6 7 8 9 10 pNumTache => 4332 0000 TabPrio => 0000 0 1 2 3 4 5 6 7 8 9 10 4332 0000 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.
3
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
4
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 : 0 1 4332 4352 0000 2 3 4 5 6 7 8 9 10 pNumTache => 4332 0000 TabPrio => 0000 0 1 2 3 4 5 6 7 8 9 10 0000 0001 0003 0008 0020 0000 023D 445A 64F1 TCB (Tache_1) => 4372 64F1 SuivTcb << DS:4352 PrecTcb Nid Prio Etat Dormante Status StDormante EvtSig EvtAtt Pet PtrPile BasePile 0000 64F1 0000 023D 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 256 – 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
5
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 :
6
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 6 LA FONCTION StartTask(IdTache) (SUITE) InitNoyau(); CreateTask(1,3,Tache_1); StartTask(1); 0 1 4332 4352 0000 2 3 4 5 6 7 8 9 10 pNumTache => 4332 0000 4352 0000 TabPrio => 0000 0 1 2 3 4 5 6 7 8 9 10 4352 0001 0003 0002 0000 023D 445A 64F1 TCB (Tache_1) => 4372 64F1 SuivTcb << DS:4352 PrecTcb Nid Prio Etat Prete Status StCoursPrete EvtSig EvtAtt Pet PtrPile BasePile 0000 64F1 0000 023D 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);
7
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). 4332 0000 4352 0000 TabPrio => 0000 0 1 2 3 4 5 6 7 8 9 10 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 4352. LE SP ACTUEL POINTE ICI
8
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 4352 0001 0003 0002 0000 023D 445A 64F1 TCB (Tache_1) => 4372 64F1 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. 0000 Etat EnCours 4332 0000 SP 0000 TCB (main) => 0000 SuivTcb PrecTcb Nid Prio Etat EnCours Status StCoursPrete EvtSig EvtAtt Pet PtrPile BasePile 0002 Etat Prete 0000
9
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 4352 0001 0003 0002 0000 023D 445A 64F1 TCB (Tache_1) => 4372 64F1 SuivTcb << DS:4352 PrecTcb Nid Prio Status StCoursPrete EvtSig EvtAtt Pet PtrPile BasePile 0000 64F1 0000 023D 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. 0000 Etat EnCours
10
17 Septembre 2007JF VIENNENOYAU TEMPS RÉEL SLIDE 10 NOYAU TEMPS RÉEL Quelques Informations FIN
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.