Dans cet exemple, nous allons simuler un chronomètre en nous basant sur la vitesse d'exécution du simulateur. Les interruptions FIQ sont réglées de manière à se déclencher tous les 12 cycles; par ailleurs, la vitesse d'exécution du simulateur est réglée à 40 ms / cycle. Par conséquent, la durée écoulée entre deux interruptions sera de 12*40=480 millisecondes. Nous utilisons cela pour chronométrer une durée, en tenant compte des minutes, secondes et millisecondes.
Attention à régler correctement les paramètres du simulateur avant de lancer la simulation!
Activer
Type
cycles
cycles (premier)
Vitesse d'exécution : ms
Français
; ATTENTION : pour fonctionner, ce code suppose que les paramètres de simulation
; suivants sont définis :
; - Interruption de type FIQ
; - Tous les 12 cycles, sauf le premier (5 cycles)
; - Vitesse d'exécution : 40 ms
; - La vue des registres doit être en mode décimal (signé ou non)
; Section de la table des vecteurs d'interruption
SECTION INTVEC
B main
NOP
NOP
NOP
NOP
NOP
NOP
LDR PC, =miseajourTemps ; Une autre façon de charger la bonne adresse dans PC
minutes ASSIGN32 0 ; Compteurs pour le temps
secondes ASSIGN32 0
millisec ASSIGN32 0
millisecparinterrupt ASSIGN32 480 ; Combien de temps s'écoule-t-il entre 2 interruptions?
; Section du code principal
SECTION CODE
miseajourTemps
; Code de l'interruption
; Nous ne pouvons utiliser que les registres R8 à R13, sinon il nous
; faudrait sauvegarder les autres registres sur la pile avant de les utiliser!
LDR R11, =minutes
LDM R11, {R8,R9,R10,R12} ; On charge tous les compteurs d'un seul coup
; LDM est l'équivalent d'un POP, mais en utilisant
; un autre registre que SP
ADD R10, R10, R12 ; On ajoute le nombre de ms écoulées
; depuis la dernière interruption
CMP R10, #1000 ; Est-ce qu'on est à + de 1000 ms?
SUBGE R10, R10, #1000 ; Si oui, on soustrait 1000 ms à ce compteur
ADDGE R9, R9, #1 ; Et on ajoute 1 au compteur de secondes
CMP R9, #60 ; Est-ce qu'on est à + de 60 secondes?
SUBGE R9, R9, #60 ; Si oui, on soustrait 60 à ce compteur
ADDGE R8, R8, #1 ; Et on ajoute 1 au compteur de minutes
STM R11, {R8,R9,R10} ; On écrit en mémoire tous les compteurs
; STM est l'équivalent d'un PUSH, mais avec un registre
; potentiellement autre que SP
SUBS PC, LR, #4 ; On revient de l'interruption
main ; Le main ne fait rien d'autre qu'attendre
B main
SECTION DATA