grpC_RAMARA_CROS/PjtKEIL_StepDeb_1/Src/Delay.s
2023-03-24 17:44:04 +01:00

60 řádky
Žádný EOL
1,6 KiB
ArmAsm

PRESERVE8
THUMB
; ====================== zone de réservation de données, ======================================
;Section RAM (read only) :
area mesdata,data,readonly ;réserve une zone dans la RAM pour une utilisation particulière et set les droits
;Section RAM (read write):
area maram,data,readwrite
VarTime dcd 0 ;init variable vartime à 0
EXPORT VarTime
; ===============================================================================================
;constantes (équivalent du #define en C)
TimeValue equ 900000 ;set timevalue à 900 000
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 Delay_100ms
ldr r0,=VarTime ; r0 = VarTime
ldr r1,=TimeValue ; r1 = 900 000
str r1,[r0] ; VarTime = TimeValue;
BoucleTempo
ldr r1,[r0]
subs r1,#1
str r1,[r0] ; 3 instructions : VarTime = VarTime - 1
bne BoucleTempo ; retourne au début de la fct BoucleTempo
bx lr ; return : fini la boucle si pas le bne donc quand timer = 0
endp ; fin de procédure
END ; fin programme/code