?? os_cpu_a.asm
字號:
//**************************************************************
//* by dejam at Shantou University
//* 2006.5.4
//**************************************************************
.include SPCE061A.inc
.external _OSIntNesting
.external _OSTCBCur
.external _OSTCBHighRdy
.external _OSRunning
.external _OSPrioCur
.external _OSPrioHighRdy
.external _OSTaskSwHook
.external _OSIntEnter
.external _OSIntExit
.external _OSTimeTick
.public _OSStartHighRdy
.public _OSCtxSw
.public _OSIntCtxSw
.public _OSTickISR
//定義壓棧、出棧
PUSHALL: .MACRO
push r1,r5 to [sp]
.ENDM
POPALL: .MACRO
pop r1,r5 from [sp]
.ENDM
//*******************************************************
// 下面開始定義前面聲明的四個可重入函數
//*******************************************************
.code
_OSStartHighRdy:
call _OSTaskSwHook
r1=[_OSTCBHighRdy]
sp=[r1] //TCB的第一個元素是OSTCBStkPtr,指向任務堆棧的指針
r1=1 //置OSRunning=TURE
[_OSRunning]=r1
POPALL //從新堆棧中恢復所以的寄存器內容
reti
_OSCtxSw:
PUSHALL
OSIntCtxSw_in:
r1=[_OSTCBCur] //獲得當前TCB的指針
[r1]=sp //OSTCBCur->OSTCBStkPtr = Stack Pointer
call _OSTaskSwHook
r1=[_OSTCBHighRdy]
[_OSTCBCur]=r1
r2=[_OSPrioHighRdy]
[_OSPrioCur]=r2
sp=[r1] //得到需要恢復的任務的堆棧指針
POPALL
reti
_OSIntCtxSw:
r1=sp
r1+=7
sp=r1
jmp OSIntCtxSw_in //除了前面一點不同,OSIntCtxSw()的代碼和OSCtxSw()是一樣的
.text
.public _IRQ6
_IRQ6:
_OSTickISR:
PUSHALL
R1=C_IRQ6_TMB2 //判斷是否為IRQ_TMB2中斷
TEST R1,[P_INT_Ctrl]
JNZ IRQ_TMB2 //是,進入IRQ_TMB2;否,進入IRQ_TMB1
IRQ_TMB1:
R1=C_IRQ6_TMB1 //清中斷標志
[P_INT_Clear]=R1
R1=0x0001
[P_Watchdog_Clear]=R1 //清看門狗
R1=[_OSIntNesting] // \ 中斷嵌套標志加1
R1+=1 // | 也可call _OSIntEnter
[_OSIntNesting]=R1 // /
call _OSTimeTick
call _OSIntExit
POPALL
reti
IRQ_TMB2: //中斷子程序IRQ_TMB2
R1=C_IRQ6_TMB2 //清中斷標志
[P_INT_Clear]=R1
POPALL
reti
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -