Ordonnancement, cœurs et événements · Leçon 27 sur 30 · environ 15 minutes
Interruptions et gestionnaires
Traitez un événement et restaurez la valeur du programme interrompu.
01 / Expliquer
Comprendre l’idée
Une interruption est un événement qui détourne temporairement une tâche en cours vers un gestionnaire. Celui-ci doit sauvegarder l’état encore nécessaire au code interrompu, effectuer son travail, puis reprendre l’exécution interrompue. Le laboratoire des systèmes consigne explicitement la réception de l’événement et la reprise.
Le processeur à 25 instructions n’a pas d’instruction d’interruption cachée. Ce défi représente un gestionnaire avec CALL et une sauvegarde/restauration sur la pile de données. La valeur du programme principal doit retrouver R0 après le gestionnaire ; les octets de l’événement sont aux adresses 240 et 241.
02 / Essayer
Observer le fonctionnement
Vous devriez voir la valeur principale restaurée, 17, puis le résultat de l’événement traité, 5. La pile est vide après le retour.
STORE 4 240
LOAD 17
CALL handler
PRINT
LOAD [241]
PRINT
HALT
handler: PUSH
LOAD [240]
ADD 1
STORE 241
POP
RETURNAvancez pas à pas pour suivre une instruction à la fois. Vous pouvez modifier l’exemple et le rejouer.
03 / Défi
Le faire fonctionner
Lisez un entier du programme principal, puis un octet d’événement. Enregistrez l’événement à l’adresse 240. Appelez un gestionnaire qui écrit événement + 1 dans l’octet mémoire 241 en préservant R0 avec PUSH et POP. Affichez la valeur principale restaurée, puis le résultat enregistré de l’événement.
Le vérificateur exécute votre programme actuel de l’éditeur sur une nouvelle machine pour chacun des 3 cas de test. Il fournit lui-même les entrées et la mémoire préparée ; la sortie et la mémoire actuelles du laboratoire ne décident pas du résultat.
INPUT
COPY R0 R1
INPUT
STORE 240
LOAD R1
CALL handler
PRINT
LOAD [241]
PRINT
HALT
handler:
#
RETURNBesoin d’un indice ?
Utilisez PUSH avant de charger l’événement et POP après l’enregistrement du résultat du gestionnaire.
Afficher une solution expliquée
Lisez le programme, prévoyez l’effet de chaque instruction, puis suivez-le pas à pas dans le laboratoire.
INPUT
COPY R0 R1
INPUT
STORE 240
LOAD R1
CALL handler
PRINT
LOAD [241]
PRINT
HALT
handler: PUSH
LOAD [240]
ADD 1
STORE 241
POP
RETURNLaboratoire du processeur en émojis
Programme en émojis
Saisissez LOAD, ADD ou un autre nom d’instruction, puis Espace pour insérer l’émoji. Ctrl/⌘ + Entrée exécute ou suspend ; Échap suspend ; Ctrl/⌘ + ] indente. Tab déplace le focus. Les étiquettes utilisent deux-points. Les sauts utilisent des adresses d’instructions à partir de zéro.
Carte des instructions et points d’arrêt (0)
Un point d’arrêt suspend avant son instruction. Exécuter franchit une fois le point d’arrêt actuel ; Pas à pas exécute directement son instruction. Modifier le code efface les anciens points d’arrêt et l’état machine.
Registres du processeur
- R0
- 0
- R1
- 0
- R2
- 0
- R3
- 0
- R4
- 0
- R5
- 0
- R6
- 0
- R7
- 0
Piles et cadres de boucle
SP = 255 − profondeur des données − profondeur des appels. La pile est distincte de la mémoire.
Pile de données (bas → haut)
Vide
Adresses de retour des appels (bas → haut)
Vide
Cadres de boucle
Vide
Sorties et entrées
Exécutez une instruction PRINT pour voir une sortie.
Entrées en attente: Vide
Mémoire · 256 octets · 0 non nuls
Chaque case indique adresse:valeur. R = lecture à ce pas ; W = écriture à ce pas. Sélectionnez une case pour l’examiner ou l’initialiser avant l’exécution. Les flèches déplacent la sélection, Début/Fin visent les extrémités de la ligne et Ctrl/⌘ + Début/Fin celles de toute la mémoire.
Trace d’exécution · 0 entrées
Les entrées récentes sont ci-dessous. Examinez n’importe quel indice à partir de zéro pour voir les états complets et indépendants avant et après.
Vérifier votre défi
Vous pouvez lancer cette vérification à tout moment. Tous les cas doivent réussir pour enregistrer la leçon comme terminée.
La progression utilise seulement localStorage. Elle reste dans ce navigateur et n’est jamais envoyée à un serveur.