grpE_RAMOUCHE_CASEAU/dossier/soft/PjtKEIL_StepDeb_1/Src/Delay.s
2023-03-21 18:23:42 +01:00

61 lines
No EOL
1.8 KiB
ArmAsm

PRESERVE8
THUMB
; ====================== zone de réservation de données, ======================================
;Section RAM (read only) :
area mesdata,data,readonly ; Déclaration de la variable
;Section RAM (read write):
area maram,data,readwrite
VarTime dcd 0 ; Réserve 32 bits en mémoire pour Vartime et on lui affecte la valeur 0
EXPORT VarTime ;On rend la variable globale pour pouvoir l'observer avec le débugger
; ===============================================================================================
;constantes (équivalent du #define en C)
TimeValue equ 900000 ; TimeValue = 900000
EXPORT Delay_100ms ; la fonction Delay_100ms est rendue publique donc utilisable par d'autres modules.
;Section ROM code (read only) :
area moncode,code,readonly
; REMARQUE IMPORTANTE
; Cette manière de créer une temporisation n'est clairement pas la bonne manière de procéder :
; - elle est peu précise
; - la fonction prend tout le temps CPU pour... ne rien faire...
;
; Pour autant, la fonction montre :
; - les boucles en ASM
; - l'accés écr/lec de variable en RAM
; - le mécanisme d'appel / retour sous programme
;
; et donc possède un intérêt pour débuter en ASM pur
Delay_100ms proc ; début de procédure
ldr r0,=VarTime ; Stockage de l'adresse de VarTime dans r0
ldr r1,=TimeValue ; Stockage de l'adresse de TimeValue r1
str r1,[r0] ; Ecriture de la valeur stockée dans r1 dans r0
BoucleTempo ; début de la boucle
ldr r1,[r0] ; Stockage de la valeur pointée par r0 dans r1
subs r1,#1 ; Désincrémentation de la valeur de r1
str r1,[r0] ; Ecriture de la valeur de r1 dans r0
bne BoucleTempo ; "Branch on Not Equal" --> Effectue un saut vers BoucleTempo si la valeur de r1 est différente de 0, sinon continue
bx lr ; renvoie la valeur de lr
endp
END