CATEGORII DOCUMENTE |
Bulgara | Ceha slovaca | Croata | Engleza | Estona | Finlandeza | Franceza |
Germana | Italiana | Letona | Lituaniana | Maghiara | Olandeza | Poloneza |
Sarba | Slovena | Spaniola | Suedeza | Turca | Ucraineana |
DOCUMENTE SIMILARE |
|
Le C50 possède 4 broches externes d’interruption INT1 à INT4. A ces interruptions d’usage général s’ajoute une broche reset RS et une broche NMI (Non Maskable Interrupt).
Des interruptions internes peuvent être générées par des périphériques intégrés :
le timer génère l’interruption TINT,
les 2 ports séries génèrent les interruptions RINT, XINT et TRNT, TXNT ( pour le port série multiprocesseur).
Les interruptions externes sont aussi générées par les instructions TRAP, INTR n et NMI (Interruption logicielle).
Deux mots mémoire sont réservés pour chaque vecteur d’interruption. Cela permet, par exemple de mémoriser une instruction de branchement.
Il existe (Cf figure 34) 32 vecteurs d’interruption placés au reset à l’adresse 0000h jusqu'à l’adresse 003Fh. On peut accéder à n’importe quel vecteur d’interruption par l’instruction INTR n ( avec n compris entre 0 et 31). Chaque vecteur est classé par priorité. Ce qui veut dire que si 2 interruptions apparaissent en même temps, ce sera la plus prioritaire qui sera servie en premier.
Fig. 34 :Adresses et priorité des vecteurs d’interruption.
Bien que localisés normalement à l’adresse 0 en mémoire programme, les vecteurs d’interruption peuvent être repositionnés au commencement de chaque bloc de 2 Kmots, en modifiant le contenu du pointeur de vecteur d’interruption IPTR (5 bits situés dans le registre de contrôle PMST). L’adresse du vecteur d’interruption est en effet formée des 5 bits de IPTR (poids fort de l’adresse) et du numéro d’interruption fois 2.
Mémoire programme
Exemple :
relocation des vecteurs d’interruption à l’adresse F800h
F800h interupt
location
F83Fh
SAMM PMST ; de IPTR
SOLUTION 2 LDP #0 ; sélection de la page 0
OPL #F800h, PMST ; mise à 1 des 5 bits de IPTR
SOLUTION3 LDP #0 ; sélection de la page 0
SPLK #31, IFR ; IFR est mappé en mémoire page 0 (MMR)
La solution 1 utilise l’adressage mappé (MMR) alors que la deuxième solution force seulement les bits de IPTR dans le registre PMST à l’aide d’un adressage direct. Ce qui explique la sélection auparavant de la page 0. La solution 3 utilise l’instruction SPLK qui vient placer la valeur 31 (soit 11111b) dans IFR (adressage direct). IFR est mappé en mémoire 0 (Cf figure 18).
Fabrication de l’adresse des vecteurs d’interruption dans l’exemple:
0 0 0 0 |
numéro d’it * 2 |
IPTR
Toutes les interruptions, à part le reset (broche RS) et NMI (broche Non Maskable Interrupt), peuvent être masquées individuellement au moyen d’un bit dédié dans le registre de masque d’interruption IMR (Interrupt Mask Register)
9 | |||||||||
Réservé |
INT4 |
TXNT |
TRNT |
XINT |
RINT |
TINT |
INT3 |
INT2 |
INT1 |
Registre IMR : si TINT = 1 interruption TIMER autorisée
si TINT = 0 interruption TIMER masquée
Exemple :
CLRC INTM ; autorisation des interruptions
LDP #0
OPL #0008h, OMR ; autorisation d’activation de l’interruption TINT
Attention : il existe un bit du registre ST0 (registre de contrôle) noté INTM qui doit être mis à 0 pour autoriser les interruptions non masquées. Si une interruption est activée et que INTM = 0 et le bit de IMR correspondant à l’it = 1, le processeur se branche vers le vecteur d’interruption et place le bit INTM à 1 pour masquer toutes les interruptions masquables (sauf RS et NMI) jusqu’au retour d’interruption RETE (qui remet INTM à 0).
Lorsqu’une interruption arrive, un bit appelé drapeau est activé dans le registre de drapeaux d’interruption IFR (Interrupt Flag Register), que l’interruption soit autorisée ou non.
9 | |||||||||
Réservé |
INT4 |
TXNT |
TRNT |
XINT |
RINT |
TINT |
INT3 |
INT2 |
INT1 |
Registre IFR : si TINT = 1 demande d’interruption du TIMER
si TINT = 0 pas de demande d’interruption du TIMER
Un 1 logique dans IFR indique que l’interruption est active, ou en attente de service. On peut effacer une interruption en écrivant un 1 dans le bit concerné de IFR et, ainsi effacer toutes les interruptions en attente, en réécrivant le contenu courant de IFR dans IFR.
Un drapeau dans IFR peut être effacé par l’un des événements suivants :
Un reset du circuit,
le programme sert l’interruption ,
le programme écrit un 1 dans le bit correspondant de IFR,
exécution de l’instruction INTR avec le numéro d’interruption correspondant.
Remarque : l’interruption logicielle INTR n permet d’accéder à n’importe qu’elle interruption matérielle ou logicielle. Ainsi l’instruction INTR 1 va nous envoyer vers le vecteur d’interruption de l’interruption matérielle INT1. Ce qui nous permet de simuler une interruption matérielle dans le programme.
Exemple :
LACL IFR ;lecture de IFR
SACL IFR ; effacement de toutes les interruptions non encore traitées
Quand le CPU accepte une interruption, le compteur de programme est poussé au sommet de la pile matérielle 8 niveaux (Cf fig. 10). Cette pile matérielle est aussi utilisée pour les appels à procédure.
De plus, le processeur sauve le contexte dans une pile matérielle un niveau : soient ACC, ACCB, PREG, ST0, ST1, PMST, TREG, INDX et ARCR. INTM est mis à 1 et donc toutes les interruptions masquables sont masquées. Puis le compteur de programme est chargé avec l’adresse du vecteur d’interruption. Il y a alors branchement vers la routine d’interruption.
En fin de routine, l’instruction RETE dépile le contexte et le pointeur de programme et démasque les interruptions. Une nouvelle interruption (la plus prioritaire) peut alors être activé.
La figure 34 donne un exemple de fonctionnement de l’interruption INT1. Pour éviter des déclenchements intempestifs une interruption matérielle est validée si elle dure plus de 3 cycles à l’état bas et 2 cycles à l’état haut (rappel : un cycle = 50 ns pour un fclk = 40 MHz). Ce principe est illustré par la figure 35. A partir de ce moment là, le bit 0 de IFR est mis à 1 et si l’interruption est non masquée, il y a branchement à l’adresse 02h. S’il y a apparition d’un nouvelle interruption au cours de la routine d’interruption, cette interruption ne sera servie qu’après le retour d’interruption RETE.
La broche IACK est utilisée lorsque la table des vecteurs d’interruption est placée en mémoire externe, et c’est le cas à l’adresse 0. Dans ce cas le processeur met le numéro d’it sur le bus externe et vient lire l’instruction lorsque IACK passe de 0 à 1.
Conditions
initiales : INTM = 0 IMR =0001h : INT1
non masqué IPTR = 0 :
vecteur d’it à l’adresse 0h
3 cycles min
INT1 | ||||||||||||||||||||||||
Détection de INT1 9 cycles | ||||||||||||||||||||||||
| ||||||||||||||||||||||||
IFR(bit0) |
| |||||||||||||||||||||||
INTM | ||||||||||||||||||||||||
rout_iint1 |
Branchement à l’adresse 02h (service d’it INT1) sauvegarde du contexte RETE : retour d’it INTM = 0 restauration du contexte
Branchement à l’adresse 02h (service d’it INT1)
Fig. 34 : Chronogramme.
Exemple :
On désire compter le nombre de fois que l’interruption INT1 passe à 0. Pour cela on place sur la broche INT1 un bouton poussoir. On désire placer la table des vecteurs d’interruption à l’adresse 0800h en mémoire programme (mémoire SARAM on chip).
.ps 0802h ; directive assembleur : permet de spécifier
; l’adresse d’écriture en mémoire programme
int1 : B rout_it1 ; Branchement vers la routine d’interruption INT1
.ps 0840h
.entry ; point d’entrer du programme
SETC INTM ; désactivation des interruptions
LDP #0 ; sélection page 0
OPL #0810h, PMST ; IPTR = 1 donc table d’it à l’adresse 0800h et SARAM en mémoire programme
OPL #01h, IMR ; démasque INT1
LACL #0 ; mise à 0 du compteur
CLRC INTM ; activation des interruption
; a partir de là, l’interruption int1 peut être prise en compte
WAIT B WAIT . boucle infinie
rout_it1 ADD #1 ; ACC ACC + 1
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 819
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved