📄 os_cpu_a.asm
字号:
//******************************************************************
//** 文件名: OS_CPU_A.ASM
//** Copyright (c) 2007-2008 华中科技大学电工电子创新中心
//** 创建人:周峡
//** 日 期:2007.3.26
//** 描 述:此文件包含了所有与CPU相关的ASM代码
//**
//** 版 本:V2.52
//**--------------------------------------------------------------------------
//---
//******************************************************************/
.include hardware.inc
.external _OSTCBCur
.external _OSTCBHighRdy
.external _OSRunning
.external _OSPrioCur
.external _OSPrioHighRdy
.external _OSIntNesting
.external _OSTaskSwHook
.external _OSIntEnter
.external _OSIntExit
.external _OSTimeTick
.CODE
//**********************************************************************
.public _OSStartHighRdy
_OSStartHighRdy: .proc
CALL _OSTaskSwHook
R1 = 0x0001
[_OSRunning] = R1 //OSRunning = True
R1 = [_OSTCBHighRdy] //得到将要重新执行的任务的堆栈指针
SP = [R1]
POP R1,R5 FROM [SP] //从新的任务堆栈中恢复所有处理器寄存器
RETI
.endp
//**********************************************************************
//**********************************************************************
.public _OSCtxSw
_OSCtxSw: .proc
PUSH R1,R5 TO [SP]
R1 = [_OSTCBCur] //在当前任务的任务控制块中保存当前任务的堆栈指针
[R1] = SP
CALL _OSTaskSwHook
R1 = [_OSTCBHighRdy] // OSTCBCur = OSTCBHighRdy
[_OSTCBCur] = R1
R1 = [_OSPrioHighRdy] // OSPrioCur = OSPrioHighRdy
[_OSPrioCur] = R1
R1 = [_OSTCBHighRdy] //得到将要重新执行的任务的堆栈指针
SP = [R1]
POP R1,R5 FROM [SP] //从新的任务堆栈中恢复所有处理器寄存器
RETF
.endp
//**********************************************************************
//**********************************************************************
.public _OSTickISR
_OSTickISR: .proc
R1=0x0002 //选用8HZ的TMB1中断作为系统时钟
[P_INT_Ctrl]=R1
RETF
.endp
.text
.public _IRQ6
_IRQ6:
PUSH R1,R5 TO [SP]
R1=0x0002
test R1,[P_INT_Ctrl]
JZ OUT
CALL _OSIntEnter
R1 = [_OSIntNesting] //if(OSIntNesting == 1)
CMP R1,0x0001 // {
JNE LOOPTemp // OSTCBCur->OSTCBStkPtr = SP;
R1 = [_OSTCBCur] // }
[R1] = SP
LOOPTemp:
R1=0x0002
[P_INT_Clear]=R1
CALL _OSTimeTick
CALL _OSIntExit
OUT:
R1=0x0002
[P_INT_Clear]=R1
POP R1,R5 FROM [SP]
RETI
//**********************************************************************
//**********************************************************************
.public _OSIntCtxSw
_OSIntCtxSw: .proc
CALL _OSTaskSwHook //调用用户定义的OSTaskSwHook()
R1 = [_OSTCBHighRdy] // OSTCBCur = OSTCBHighRdy
[_OSTCBCur] = R1
R1 = [_OSPrioHighRdy] // OSPrioCur = OSPrioHighRdy
[_OSPrioCur] = R1
R1 = [_OSTCBHighRdy] //得到将要重新执行的任务的堆栈指针
SP = [R1]
POP R1,R5 FROM [SP] //从新的任务堆栈中恢复所有处理器寄存器
RETI //中断返回
.endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -