?? os_cpu_a.a77
字號:
;**********************************************************************************************
; uC/OS-II
; The Real-Time Kernel
;
; (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
; All Rights Reserved
;
;
; Mitsubishi 7700 Family Specific code
;
;
; File : OS_CPU_A.ASM
; By : Jean J. Labrosse
; Ported to Mitsubishi 77xx by : Zhu Yifan
;
;**********************************************************************************************
;
;NOTE: By default, All Variables are assumed to be near type;
; All Funtions are assumed to be far type
;
;**********************************************************************************************
; External Reference Declaration
.EXT _OSTCBCur ;declared as OS_TCB *,16-bit long
.EXT _OSTCBHighRdy ;declared as OS_TCB *,16-bit long
.EXT _OSPrioCur ;declared as INT8U,8-bit long
.EXT _OSPrioHighRdy ;declared as INT8U,8-bit long
.EXT _OSIntNesting ;declared as INT8U,8-bit long
.EXT _OSRunning ;declared as Boolean(unsigned char),8-bit long
.EXT _OSTCBHighRdyStkPtr ;declared as OS_STK *(unsigned char *),16-bit long
.EXT _OSIntExit ;3 external functions written in C
.EXT _OSTimeTick
.EXT _OSTaskSwHook
;**********************************************************************************************
;* Start High Ready Task
;* void OSStartHighRdy(void)
;* Description: This function is called from OSStart()
;*
;* Arguments : none
;*
;* Note(s) :
;**********************************************************************************************
.SECTION program_F
.FUNC _OSStartHighRdy
.PUB _OSStartHighRdy
_OSStartHighRdy:
CLP M,X,D
LDT #00H
JSRL _OSTaskSwHook
CLP M,X
LDA A,_OSTCBHighRdyStkPtr ;Stack Pointer = OSTCBHighRdy->OSTCBStkPtr
TAS
SEM
INC DT:_OSRunning ;set OSRunning = TRUE
CLP M
PUL A,B,X,Y,DPR,DT
RTI
.ENDFUNC _OSStartHighRdy
;**********************************************************************************************
;* Context Switch
;* void OSCtxSW(void)
;* Description: This function is called from OSSched()
;*
;* Arguments : none
;*
;* Note(s) : 1) You must map the head address of OSCtxSw() to BRK interrupt in the vector table in section.inc file
;**********************************************************************************************
.SECTION interrupt
.FUNC _OSCtxSw
.PUB _OSCtxSw
_OSCtxSw:
CLP M,X,D
PSH A,B,X,Y,DPR,DT
LDT #00H ;set DT and DPR=00H
LDA A,#00H
TAD
TSA ;OSTCBCur->OSTCBStkPtr = Stack pointer
LDX DT:_OSTCBCur
STA A,00H,X
JSRL _OSTaskSwHook ;Call user definable OSTaskSwHook()
CLP M,X
LDA A,_OSTCBHighRdy ;OSTCBCur = OSTCBHighRdy
STA A, _OSTCBCur
SEM
LDA A,_OSPrioHighRdy ;OSPrioCur = OSPrioHighRdy
STA A,_OSPrioCur
CLP M
LDA A,_OSTCBHighRdyStkPtr ;Stack Pointer = OSTCBHighRdy->OSTCBStkPtr
TAS
CLP M,X
PUL A,B,X,Y,DPR,DT ;Restore all processor registers from the new task's stack
RTI
.ENDFUNC _OSCtxSw
;**********************************************************************************************
;* Context Switch from ISR
;* void OSIntCtxSw(void)
;* Description: This function is called from OSIntExit()
;*
;* Arguments : none
;*
;* Note(s) : 1) Using OS_ENTER_CRITICAL() Methord 1.
;**********************************************************************************************
.SECTION program_F
.FUNC _OSIntCtxSw
.PUB _OSIntCtxSw
_OSIntCtxSw:
CLP M,X,D
PUL A ;Adjust the stack pointer S to be S+6
PUL A ;inorder to remove the calls to 2 far function: OSIntExit(),OSIntCtxSw(),each was assumed to be invoked by JSRL
PUL A ;PS was not pushed into stack by OS_ENTER_CRITICAL(),so needn't pop it here.
LDT #00H ;set DT and DPR=00H
LDA A,#00H
TAD
TSA ;OSTCBCur->OSTCBStkPtr = Stack pointer
LDX DT:_OSTCBCur
STA A,00H,X
LDT #00H
JSRL _OSIntTaskSwHook ;Call user definable OSTaskSwHook()
CLP M,X
LDA A,_OSTCBHighRdy ;OSTCBCur = OSTCBHighRdy
STA A, _OSTCBCur
SEM
LDA A,_OSPrioHighRdy ;OSPrioCur = OSPrioHighRdy
STA A,_OSPrioCur
CLP M
LDA A,_OSTCBHighRdyStkPtr ;Stack Pointer = OSTCBHighRdy->OSTCBStkPtr
TAS
PUL A,B,X,Y,DPR,DT ;Restore all processor registers from the new task's stack
RTI
.ENDFUNC _OSIntCtxSw
;**********************************************************************************************
;* Time ticker ISR
;* void OSTickISR(void)
;* Description: This function is invoked by hardware timer
;*
;* Arguments : none
;*
;* Note(s) : 1)
;**********************************************************************************************
.SECTION interrupt
.FUNC _OSTickISR
.PUB _OSTickISR
_OSTickISR:
CLP M,X,D
PSH A,B,X,Y,DPR,DT
SEM
INC DT:_OSIntNesting ;increment OSIntNesting,or call OSIntEnter()
CLP M
LDT #00H
JSRL _OSTimeTick ;Call OSTimeTick()
LDT #00H
JSRL _OSIntExit ;call OSIntExit()
PUL A,B,X,Y,DPR,DT ;Restore all processor registers from the new task's stack
RTI
.ENDFUNC _OSTickISR
.END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -