📄 stt.asm
字号:
AREA IDLE_TASK, CODE, READONLY
LOCKOUT EQU 0xC0 ; Interrupt lockout value
LOCK_MSK EQU 0xC0 ; Interrupt lockout mask value
IMPORT STD_Idle_Count
IMPORT TCD_Interrupt_Level
Idle_Count DCD STD_Idle_Count
Int_Level DCD TCD_Interrupt_Level
;
;void STT_Lock_Interrupt(void);
;
EXPORT STT_Lock_Interrupt
STT_Lock_Interrupt
;close arm interrupt
MRS a1,CPSR ; Pickup current CPSR
ORR a1,a1,#LOCKOUT ; Build interrupt lockout value
MSR CPSR_cxsf,a1 ; Lockout interrupts
BX lr ;return
;
;void STT_Restore_Interrupt()
;
EXPORT STT_Restore_Interrupt
STT_Restore_Interrupt
;restore interrupt according to TCD_Interrupt_Level
LDR a2,[pc, #Int_Level-.-8] ; Pickup address of interrupt
; lockout
MRS a1,CPSR
BIC a1,a1,#LOCK_MSK ; Clear lockout mask
LDR a3,[a2, #0] ; Pickup interrupt lockout mask
ORR a1,a1,a3 ; Build new interrupt lockout mask
MSR CPSR_cxsf,a1 ; Place it into the SPSR
BX lr ;return
;
;idle task:just do counting, the interrupt MUST be disabled during counting
;
EXPORT STT_Idle_Loop
STT_Idle_Loop
;BL STT_Lock_Interrupt ;lock interrupt
;close arm interrupt
MRS a1,CPSR ; Pickup current CPSR
ORR a1,a1,#LOCKOUT ; Build interrupt lockout value
MSR CPSR_cxsf,a1 ; Lockout interrupts
;do counting
LDR a2,[pc,#Idle_Count-.-8] ; Pickup idle count address
LDR a1,[a2, #0] ; Pickup current count
ADD a1,a1,#1
STR a1,[a2,#0]
;BL STT_Restore_Interrupt ;restore interrupt
;restore interrupt according to TCD_Interrupt_Level
LDR a2,[pc, #Int_Level-.-8] ; Pickup address of interrupt
; lockout
MRS a1,CPSR
BIC a1,a1,#LOCK_MSK ; Clear lockout mask
LDR a3,[a2, #0] ; Pickup interrupt lockout mask
ORR a1,a1,a3 ; Build new interrupt lockout mask
MSR CPSR_cxsf,a1 ; Place it into the SPSR
B STT_Idle_Loop ;loop again
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -