Étape 10 : Être comme Kanye - interruption !
Alors maintenant, nous allons écrire ce qui est sans doute la partie la plus importante du code ; les interruptions.Le gestionnaire d’interruption se chargera de la « réaction » à des apports extérieurs. Dans ce cas, les apports extérieurs sont des raccourcis clavier (avancer, tourner, etc.) et les capteurs tactiles. Nous voulons au robot de se déplacer vers l’avant lorsqu’il détecte une certaine touche, en arrière, d’autre part et ainsi de suite.
Alors, sans plus tarder, le gestionnaire d’interruption :
.Data
theChar : .byte ' "# le personnage qui sera envoyé. Il est lu par notre programme et écrasée par le gestionnaire d’interruption.
/ * Ceci est la fonction principale du robot Walker. */
.section .exceptions, « hache »
.Align 2
Gestionnaire :
addi sp, sp, #save ea-12, et, ctl1 sur pile
STW et, 0(sp)
rdctl HE, ctl1
STW et, 4(sp)
STW ea, 8(sp)
addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
rdctl HE, ctl4 / * vérifier l’interruption dans l’attente de Registre (ctl4) * /
Andi et, HE, LEGO_IRQ11 / * vérifier si l’interruption en attente est de GPIO JP1 * /
BNE et, r0, handle_sensor
rdctl HE, ctl4 / * vérifier l’interruption dans l’attente de Registre (ctl4) * /
Andi et, HE, LEGO_IRQ8 / * vérifier si l’interruption en attente est de JTAG UART * /
BNE et, r0, handle_JTAG
BR exit_handler
handle_sensor :
/ * Vérifier fausse interruption * /
MOVIA r2, LEGO #_IRQ11 / * charger GPIO JP1 dans r2 * /
ldwio r4, 0(r2)
SRLI r4, r4, 27
Andi r4, r4, 0x01f
cmpeqi r5, r4, 0x01f
BNE r5, r0, exit_handler / * fausse interruption * /
cmpeqi r5, r4, 0x01e / * vérifier le capteur 0 * /
BNE r5, r0, handle_sensor_left
cmpeqi r5, r4, 0x01d / * vérifier le capteur 1 * /
BNE r5, r0, handle_sensor_right
BR exit_handler
handle_JTAG :
MOVIA r7, JTAG_UART
ldwio r2, 0(r7)
Andi r13, r2, 0 x 8000 # vérifier si bit 15 est 1 (lecture valide)
BEQ r13, r0, exit_handler
Andi r2, r2, 0xff #mask octet inférieur
/ * Recherchez « w » * /
MOVIA r12, « w » # « w »
BEQ r2, r12, handle_forward
/ * Recherchez de ' * /
MOVIA r12, de ' # s
BEQ r2, r12, handle_stop
/ * Recherchez « x » * /
MOVIA r12, « x » # « x »
BEQ r2, r12, handle_reverse
/ * Recherchez « a » * /
MOVIA r12, « a » # « a »
BEQ r2, r12, handle_left
/ * vérifier pour eu ' * /
MOVIA r12,'d ' # a '
BEQ r2, r12, handle_right
BR exit_handler
handle_sensor_left :
addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
MOVIA r4, LEDR
lightup appel
MOVIA r4, LEGO / * déplacez-y r4 LEGO pour que les fonctions motrices peuvent référencer * /
appel wall_escape_right
MOVIA r4, LEDR
appel lightdown
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
addi sp, sp, 32
movi HE, 0 x 1 / * ré-activer les interruptions * /
wrctl ctl0, et / * affecte à tarte bits pack 1 (enable inerrupts) * /
BR exit_handler
handle_sensor_right :
addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
MOVIA r4, LEDR
lightup appel
MOVIA r4, LEGO / * déplacez-y r4 LEGO pour que les fonctions motrices peuvent référencer * /
appel wall_escape_left
MOVIA r4, LEDR
appel lightdown
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
addi sp, sp, 32
movi HE, 0 x 1 / * ré-activer les interruptions * /
wrctl ctl0, et / * affecte à tarte bits pack 1 (enable inerrupts) * /
BR exit_handler
handle_forward :
MOVIA r7, JTAG_UART
ldwio r7,0(r7)
movi HE, 0 x 1 / * ré-activer les interruptions * /
wrctl ctl0, et / * affecte à tarte bits pack 1 (enable inerrupts) * /
addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
MOVIA r4, LEGO / * déplacez-y r4 LEGO pour que les fonctions motrices peuvent référencer * /
appel motors_forward
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
addi sp, sp, 32
BR exit_handler
handle_reverse :
MOVIA r7, JTAG_UART
ldwio r7,0(r7)
movi HE, 0 x 1
wrctl ctl0, et
addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
MOVIA r4, LEGO
appel motors_backward
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
addi sp, sp, 32
BR exit_handler
handle_left :
MOVIA r7, JTAG_UART
ldwio r7,0(r7)
movi HE, 0 x 1
wrctl ctl0, et
addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
MOVIA r4, LEGO
appel motors_turn_left
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
addi sp, sp, 32
BR exit_handler
handle_right :
MOVIA r7, JTAG_UART
ldwio r7,0(r7)
movi HE, 0 x 1
wrctl ctl0, et
addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
MOVIA r4, LEGO
appel motors_turn_right
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
addi sp, sp, 32
BR exit_handler
handle_stop :
MOVIA r7, JTAG_UART
ldwio r7,0(r7)
movi HE, 0 x 1 / * ré-activer les interruptions * /
wrctl ctl0, et / * affecte à tarte bits pack 1 (enable inerrupts) * /
addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
MOVIA r4, LEGO
appelez le motors_stop / * partent tous les moteurs et désactiver tous les capteurs * /
stwio r9, 0(r2)
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
addi sp, sp, 32
BR exit_handler
exit_handler :
MOVIA r9, LEGO_Edge / * effacer la gâchette de bord capteur lego * /
stwio r0,0(r9)
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
addi sp, sp, 32
LDW et, 0(sp)
LDW et 4(sp) # restauration ctl1, ea, et
wrctl ctl1, et
LDW ea, 8(sp)
addi sp, sp, # 12 restaurer pointeur de pile
roukia ea, ea, 4 # Assurez-vous que nous exécutons l’instruction qui a été interrompue. EA/r29 points à l’instruction après qu’il
eret # retour d’interruption (cela il rétablit ctl0? état précédent s enregistré dans pc ctl1 et ne = ea)
Juste pour être clair, copiez le code suivant dans inclus dans le fichier main.s téléchargeable sur la page précédente.
Maintenant que l’interruption a été pris en charge, nous allons ajouter quelques clignotement de la LED et une fonction supérieure en code C pour l’envelopper tout cela !