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

📄 os_cpu_a.a77

📁 这个是ucos II 2.52在80系列上应用的部分原代码,已经证实好用
💻 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 + -