📄 os_cpu_a.asm
字号:
.def _OSCtxSw, _OSIntCtxSw
.def _OSStartHighRdy
.ref _OSTCBHighRdy, _OSTaskSwHook, _OSRunning, _OSTCBCur
.ref _OSPrioCur, _OSPrioHighRdy
.text
;**************** Context Save and Restore Routines ************
;
; CTX_SAVE and CTX_REST are just renamed versions of I$$SAVE
; and I$$REST, which you can extract from rts.src by using the
; dspar utility. I'v also stripped away unrelated portions of
; code for clarify and 'C2400 Series specific. - Ding Curie
;
;**************************************************************
_CTX_SAVE:
LARP AR1 ; CURRENT ARP = STACK POINTER
ADRK 1 ; SKIP TOP ELEMENT ON STACK
SST1 *+ ; SAVE STATUS REGISTERS
SST *+
SACH *+ ; SAVE ACCUMULATOR
SACL *+
ROVM ; turn off overflow mode
SPM 0 ; product shift count of 0
SPH *+ ; SAVE P REGISTER
SPL *+
MPYK 1 ; SAVE T REGISTER
SPL *+
SAR AR0,*+ ; SAVE AUXILIARY REGISTERS
SAR AR2,*+
SAR AR3,*+
SAR AR4,*+
SAR AR5,*+
SAR AR6,*+
SAR AR7,*+
POPD * ; POP RETURN ADDRESS OF i$$save
LAC * ; PUT RETURN ADDRESS IN ACCUMULATOR
RPTK 6 ; SAVE REST OF HARDWARE STACK
POPD *+
BACC ; RETURN TO INTERRUPT HANDLER
_CTX_REST:
MAR *- ; POINT TO TOP ELEMENT ON STACK
RPTK 6 ; RESTORE TOP 6 ELEMENTS OF STACK
PSHD *-
LAR AR7,*- ; RESTORE ALL AUX REGISTERS EXCEPT AR1
LAR AR6,*-
LAR AR5,*-
LAR AR4,*-
LAR AR3,*-
LAR AR2,*-
LAR AR0,*-
MAR *- ; SKIP T REGISTER (FOR NOW)
LT *+
MPYK 1 ; RESTORE LOW PRODUCT REGISTER
LT *- ; RESTORE T REGISTER
MAR *- ; SKIP LOW PRODUCT REGISTER VALUE
LPH *- ; RESTORE HIGH PRODUCT REGISTER
ZALS *- ; RESTORE ACCUMULATOR
ADDH *-
LST *- ; RESTORE STATUS REGISTERS
LST1 *- ; OLD ARP IS RESTORED *NOW*
EINT ; RESTORE INTERRUPTS
RET ; RETURN TO INTERRUPTED CODE
;*********************************************************************************************************
; START MULTITASKING
; void OSStartHighRdy(void)
;
; Note : OSStartHighRdy() MUST:
; a) Call OSTaskSwHook() then,
; b) Set OSRunning to TRUE,
; c) Switch to the highest priority task.
;*********************************************************************************************************
_OSStartHighRdy:
CALL _OSTaskSwHook ; OSTaskSwHook();
LACK 1 ; OSRunning = TRUE;
LDPK _OSRunning
SACL _OSRunning
LDPK _OSTCBHighRdy ; SP = OSTCBHighRdy->OSTCBStkPtr;
LAR AR3, _OSTCBHighRdy
MAR *, AR3
LAR AR1, *
B _CTX_REST, AR1 ; Context restore & interrupt return
;*********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From task level)
; void OSCtxSw(void)
;
; Note(s):
;*********************************************************************************************************
_OSCtxSw:
CALL _CTX_SAVE
LDPK _OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP;
LAR AR3, _OSTCBCur ;
MAR *, AR3
SAR AR1, * , AR1
_OSIntCtxSw:
CALL _OSTaskSwHook ; OSTaskSwHook();
LDPK _OSTCBHighRdy ; OSTCBCur = OSTCBHighRdy;
BLDD _OSTCBHighRdy,#_OSTCBCur
LDPK _OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy;
BLDD _OSPrioHighRdy,#_OSPrioCur
LDPK _OSTCBHighRdy ; SP = OSTCBHighRdy->OSTCBStkPtr;
LAR AR3, _OSTCBHighRdy
MAR *, AR3
LAR AR1, *
B _CTX_REST, AR1
;*********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From an ISR)
; void OSIntCtxSw(void)
;
; Note(s): See above.
;*********************************************************************************************************
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -