📄 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 + -