Accueil Démo Exercices formatifs Travaux pratiques Simulation libre ❯
Sessions sauvegardées
|
TP4: Gestion des interruptions et ordonnancement de processusCe travail pratique vaut 4% de la note totale du cours. Comme le stipule le plan de cours, le travail doit être fait individuellement. ObjectifsCe travail pratique vise les objectifs suivants:
PréparationPour ce TP, nous allons mettre en place une interruption périodique de type FIQ dans le simulateur. Cela permettra de simuler l'utilisation d'une horloge interne au processeur, capable d'interrompre régulièrement son travail. Pour ce faire, cliquez sur le bouton « Configurations » en bas à gauche. Entrez les informations suivantes:
Une fois ces étapes complétées, vous devriez obtenir la configuration suivante: Cliquez sur le « x » en haut à droite du panneau de configuration pour retourner au simulateur. ÉtapesCe TP s'effectue en deux étapes: écrire du code (pour 50% de la note du TP) et répondre à des questions (pour 50% de la note). Étape 1: code (75%)Premièrement, il vous faudra coder un système d'exploitation (très) rudimentaire, capable de gérer l'exécution alternative de deux processus distincts, sans que ces derniers ne soient affectés. Pour ce faire, le processeur génère périodiquement une interruption, indépendamment de ce que font les processus. Cette interruption est gérée par le système d'exploitation, qui peut alors décider d'arrêter temporairement un processus pour laisser la place à un autre. Ce système est qualifié de préemptif, puisqu'il peut interrompre un processus à n'importe quel moment, même si ce dernier est dans une boucle infinie. Nous verrons plus en détail les notions reliées à l'ordonnancement des processus dans la suite du cours, mais sachez pour l'instant que cette gestion des processus est tout à fait similaire à ce que fait votre ordinateur lorsque plusieurs programmes requièrent simultanément du temps de calcul. Vous devez implémenter trois sections de code distinctes :
Vous trouverez plus d'informations sur chacune de ces sections dans la section détails ci-bas. Lorsque vous avez terminé, téléchargez tout d'abord votre fichier Étape 2: questions (25%)Deuxièmement, une fois votre code implanté et testé (nous verrons comment vous pouvez tester son bon fonctionnement), vous devez répondre à dix (10) questions sur le portail des cours. Notez que contrairement aux travaux pratiques précédents, ces questions ne portent pas sur des lignes en particulier, mais bien sur le fonctionnement global de votre programme et des interruptions en ARM. Détails sur le codeImportant: n'écrivez votre code qu'aux endroits indiqués, sans toucher au reste. Toute autre modification au code pourrait causer des problèmes! 1. La table des vecteurs d'interruptionComme beaucoup d'architectures, l'ARM utilise une table des vecteurs d'interruption pour permettre au programmeur de spécifier quoi faire pour chaque type d'interruption. Cette table est située au tout début de la mémoire, à partir de l'adresse
Comme vous pouvez le constater, vous utilisiez déjà une interruption sans le savoir, soit l'interruption Reset, en écrivant Dans ce TP, nous avons implanté l'entrée de la table pour l'interruption Reset (voir 2. Initialisation du système et des processusLorsqu'une interruption survient, le processus en cours d'exécution peut être n'importe où dans son code assembleur. Il nous faut par conséquent être capables d'enregistrer l'état du processus afin d'être en mesure de le restaurer plus tard, sans que ce dernier ne « remarque » qu'il a été interrompu. Plus précisément, dans ce TP, vous devrez sauvegarder :
Pour sauvegarder ces données, votre système dispose de deux piles différentes : Il vous faudra tout d'abord initialiser les piles
Pour ce faire, utilisez la fonction 3. Routine de traitement de l'interruptionVotre routine de traitement de l'interruption correspond à l'étiquette
Comme nous utilisons une interruption de type FIQ, votre routine de traitement de l'interruption peut utiliser les registres R8 à R15 sans interférer avec les processus. Pour vous simplifier la vie, servez-vous de ces registres comme registres de travail dans votre fonction Tester et valider le bon fonctionnement du systèmeAfin de vous aider à déboguer votre code, il est recommandé d'utiliser les points d'arrêt (« breakpoints »), comme au TP3. Vous pouvez par exemple mettre un de ces points d'arrêt dans la routine d'interruption elle-même, afin de vérifier son bon fonctionnement. Une autre vérification simple est de vous assurer que les blocs correspondant aux processus 1 et 2 sont bel et bien exécutés en alternance à chaque interruption. En ce qui concerne la validation de votre code, le code fourni prévoit un système capable de détecter certaines erreurs. Il fonctionne en écrivant un code correspondant à cette erreur dans le registre R7, nous vous demandons donc de vous abstenir d'utiliser ce registre. Si la valeur de R7 est toujours à 0 à la fin du code de processus1 et 2 à la fin du code de processus2 après plusieurs centaines de cycles, vous pouvez considérer votre système comme suffisamment stable. Dans le cas contraire, cela indique un problème dans votre procédure de sauvegarde/restauration de l'état des processus. N'utilisez pas le registre R7 pour vos calculs car il vous servira à valider votre code. Cependant, vous devez le sauvegarder (et le restaurer) comme les autres (R0 à R7) sur la pile.
RessourcesRemerciementsMerci à Marc-André Gardner pour la création de ce TP!
|