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

📄 os_cpu_asm.s

📁 移植好的UCOS2.86版
💻 S
📖 第 1 页 / 共 2 页
字号:
;//*********************************************************************************************************
;//                                               uC/OS-II
;//                                         The Real-Time Kernel
;//
;//                          (c) Copyright 1992-2003, Jean J. Labrosse, Weston, FL
;//                                          All Rights Reserved
;//
;//                                              ARM920T Port
;//                                            ADS v1.2 Compiler
;//                                             Samsung S3C2440A
;//
;// File    : os_cpu_a.s refrence to ucos application note for arm AN-1014
;// Des	  : S3C2440 uC/OS-II Port 
;// by      : tangxiaofeng xidian 503
;// History : 
;// OSCtxSw(), OSIntCtxSw()  OSStartHighRdy() OS_CPU_IRQ_ISR() OSTickISR()
;//******************************************************************************************************** */

SRCPND   	EQU  0x4a000000    ;// Source pending
INTPND   	EQU  0x4a000010    ;// Interrupt request status

rEINTPEND   EQU  0x560000a8
INTOFFSET   EQU  0x4a000014


USERMODE    EQU 	0x10
FIQMODE     EQU 	0x11
IRQMODE     EQU 	0x12
SVCMODE     EQU 	0x13
ABORTMODE   EQU 	0x17
UNDEFMODE   EQU 	0x1b
MODEMASK    EQU 	0x1f
NOINT       EQU 	0xc0

;//*********************************************************************************************************
;//                                    EXPORT and EXTERNAL REFERENCES
;//*********************************************************************************************************/
	IMPORT  OSRunning
	IMPORT  OSTCBCur
	IMPORT  OSTCBHighRdy
	IMPORT  OSPrioCur
	IMPORT  OSPrioHighRdy
	IMPORT  OSIntNesting
	
			
	IMPORT  OSIntEnter
	IMPORT  OSIntExit
	IMPORT  OSTaskSwHook
	IMPORT  OSTimeTick
	
	IMPORT  HandleEINT0
	

	EXPORT  OSStartHighRdy
	EXPORT  OSCtxSw
	EXPORT  OSTickISR	
	EXPORT  OSIntCtxSw

	EXPORT  OSCPUSaveSR
	EXPORT  OSCPURestoreSR
	
	EXPORT  OS_CPU_IRQ_ISR
	
	
	AREA UCOS_ARM, CODE, READONLY
	
;//*********************************************************************************************************
;//                                          START MULTITASKING
;//                                       void OSStartHighRdy(void)
;//
;// The stack frame is assumed to look as follows:
;//
;//							    Entry Point(Task Name)				(High memory)
;//                               LR(R14)
;//                               R12
;//                               R11
;//                               R10
;//                               R9
;//                               R8
;//                               R7
;//                               R6
;//                               R5
;//                               R4
;//                               R3
;//                               R2
;//                               R1
;//                               R0 : argument
;// OSTCBHighRdy->OSTCBStkPtr --> CPSR								(Low memory)
;//
;// Note : OSStartHighRdy() MUST:
;//           a) Call OSTaskSwHook() then,
;//           b) Set OSRunning to TRUE,
;//           c) Switch to the highest priority task.
;//********************************************************************************************************** */
OSStartHighRdy  
	;//----------------------------------------------------------------------------------	
	;// OSRunning = TRUE;//
	;//----------------------------------------------------------------------------------	
	
	;//MSR     CPSR_cxsf,#SVCMODE|NOINT     ;//Switch to SVC mode with IRQ&FIQ disable
	
	BL		OSTaskSwHook            ;//Call user define Task switch hook
	
	LDR		R0, =OSRunning          ;// OSRunning =TRUE
	MOV		R1, #1
	STRB 	R1, [R0]

	;//----------------------------------------------------------------------------------		
	;// 		SP = OSTCBHighRdy->OSTCBStkPtr;//
	;//----------------------------------------------------------------------------------	
	LDR 	R0, =OSTCBHighRdy
	LDR 	R0, [R0]         
	LDR 	SP, [R0]         

	;//----------------------------------------------------------------------------------		
	;// Prepare to return to proper mode
	;//----------------------------------------------------------------------------------	
	LDMFD 	SP!, {R0}  
	MSR 	SPSR_cxsf, R0
	LDMFD 	SP!, {R0-R12, LR, PC}^


;//**********************************************************************************************************
;//                                PERFORM A CONTEXT SWITCH (From task level)
;//                                           void OSCtxSw(void)
;//
;// Note(s): 	   1) Upon entry: 
;//              	  OSTCBCur      points to the OS_TCB of the task to suspend
;//              	  OSTCBHighRdy  points to the OS_TCB of the task to resume
;//
;//          	   2) The stack frame of the task to suspend looks as follows:
;//                                                   
;//                                                   PC                    (High memory)
;//				  									LR(R14)					
;//           					                    R12
;// 			                      			        R11
;//           		                			    R10
;//                   		           			 	R9
;//                           		    			R8
;//                               					R7
;//                               					R6
;//                               					R5
;//                               					R4
;//                               					R3
;//                               					R2
;//                               					R1
;//                               					R0
;// 						OSTCBCur->OSTCBStkPtr ----> CPSR					(Low memory)
;//
;//
;//          	   3) The stack frame of the task to resume looks as follows:
;//
;//			  		  								PC				(High memory)
;//                                                   LR(R14)	
;//			           			                    R12
;//           		            			        R11
;//                   		        			    R10
;//                           		   			 	R9
;//                               					R8
;//                               					R7
;//			                               			R6
;//           		                    			R5
;//                   		            			R4
;//                           		    			R3
;//                               					R2
;//                               					R1
;//			                               			R0
;// 					OSTCBHighRdy->OSTCBStkPtr ---->	CPSR					(Low memory)
;//*********************************************************************************************************/
OSCtxSw
	
	STMFD	SP!, {LR}           ;//PC
	STMFD	SP!, {R0-R12, LR}   ;//R0-R12 LR
	MRS		R0,  CPSR       ;//Push CPSR
	STMFD	SP!, {R0}	
		
	;//----------------------------------------------------------------------------------
	;// 		OSTCBCur->OSTCBStkPtr = SP
	;//----------------------------------------------------------------------------------		
	LDR		R0, =OSTCBCur
	LDR		R0, [R0]
	STR		SP, [R0]
	
	;//----------------------------------------------------------------------------------		
	;// OSTaskSwHook();//
	;//---------------------------------------------------------------------------------	
	BL 		OSTaskSwHook

	;//----------------------------------------------------------------------------------			
	;// OSTCBCur = OSTCBHighRdy;//
	;//----------------------------------------------------------------------------------		
	LDR		R0, =OSTCBHighRdy
	LDR		R1, =OSTCBCur
	LDR		R0, [R0]
	STR		R0, [R1]
	
	;//----------------------------------------------------------------------------------		
	;// OSPrioCur = OSPrioHighRdy;//
	;//----------------------------------------------------------------------------------		
	LDR		R0, =OSPrioHighRdy
	LDR		R1, =OSPrioCur
	LDRB	R0, [R0]
	STRB	R0, [R1]
	
	;//----------------------------------------------------------------------------------		
	;//  OSTCBHighRdy->OSTCBStkPtr;//
	;//----------------------------------------------------------------------------------		
	LDR		R0, =OSTCBHighRdy
	LDR		R0, [R0]
	LDR		SP, [R0]

	;//----------------------------------------------------------------------------------	
	;//Restore New task context
	;//----------------------------------------------------------------------------------	
	LDMFD 	SP!, {R0}		;//POP CPSR
	MSR 	SPSR_cxsf, R0
	LDMFD 	SP!, {R0-R12, LR, PC}^	

	
;//*********************************************************************************************************
;//                                            TICK HANDLER
;//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -