⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_a.asm

📁 UCOSII-V2.53在SPCE061A的移植 使用开发环境u nSP 1.84
💻 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 + -