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

📄 os_cpu_a.s

📁 ucos2400移植的源码。从网上下载供大家分享。
💻 S
📖 第 1 页 / 共 2 页
字号:
		add		r2, r2, r3					; Enlarge Code Area to cover RW Area

COPY_CODE
		cmp		r0, r2
		ldrne	r3, [r0], #4
		strne	r3, [r1], #4
		bne		COPY_CODE

;--------------------------------------------------------------------------------
;   Setting MMU
;   Page Table is fetched from MMU.S
;--------------------------------------------------------------------------------
		ldr		r0, =0x00000000
		mcr		p15, 0, r0, c5, c0
		mcr		p15, 0, r0, c7, c0

;--------------------------------------------------------------------------------
; 	Set user mode access for all 16 domains.
;--------------------------------------------------------------------------------
		ldr		r0, =0x55555555
		mcr		p15, 0, r0, c3, c0

;--------------------------------------------------------------------------------
; 	Tell the MMU where to find the page table.
;--------------------------------------------------------------------------------
		IMPORT	PageTable

		ldr		r0, =PageTable
		mcr		p15, 0, r0, c2, c0

;--------------------------------------------------------------------------------
; 	Enable the MMU.
;--------------------------------------------------------------------------------
		ldr		r0, =0x0000007d
		mcr		p15, 0, r0, c1, c0

;--------------------------------------------------------------------------------
; 	There should always be two NOP instructions following the enable or
; 	disable of the MMU.
;--------------------------------------------------------------------------------
		mov		r0, r0
		mov		r0, r0
	
;--------------------------------------------------------------------------------
;	Variable Area of C code Initialization
;--------------------------------------------------------------------------------

		IMPORT	|Image$$RO$$Limit|		; End of ROM code (=start of ROM data)
		IMPORT	|Image$$RW$$Base|		; Base of RAM to initialise
		IMPORT	|Image$$ZI$$Base|		; Base and limit of area
		IMPORT	|Image$$ZI$$Limit|		; to zero initialise

		ldr		r0, =|Image$$RO$$Limit|	; Get pointer to ROM data
		ldr		r1, =|Image$$RW$$Base|	; and RAM copy
		ldr		r3, =|Image$$ZI$$Base|	; Zero init base => top of initialised data
		cmp		r0, r1					; Check that they are different
		beq		%1

0		cmp		r1, r3					; Copy init data
		ldrcc	r2, [r0], #4
		strcc	r2, [r1], #4
		bcc		%0

1		ldr		r1, =|Image$$ZI$$Limit|	; Top of zero init segment
		mov		r2, #0

2		cmp		r3, r1					; Zero init
		strcc	r2, [r3], #4
		bcc		%2


;--------------------------------------------------------------------------------
; 	Long Jump to External SDRAM
;--------------------------------------------------------------------------------
		IMPORT	entry
		b	entry   ; Jump to C!

;--------------------------------------------------------------------------------
; void enable_irq(void) // Enable irq by resetting "I bit" of CPSR...
;--------------------------------------------------------------------------------
		EXPORT enable_irq

enable_irq
		mrs r1, cpsr		; Copy cpsr to r1
		bic r2, r1, #0x80	; reset cpsr[7] to '0' -> Enable IRQ
		msr cpsr_cf, r2		; restore cpsr

		mov pc, lr			; return to the caller

;--------------------------------------------------------------------------------
; void disable_irq(void) // Disable irq by setting "I bit" of CPSR...
;--------------------------------------------------------------------------------
		EXPORT disable_irq

disable_irq
        mrs r1, cpsr		; Copy cpsr to r1
		orr r2, r1, #0x80	; set cpsr[7] to '1' -> Disable IRQ
		msr cpsr_cf, r2		; restore cpsr
    
		mov pc, lr		; return to the caller

;------------------------------------------------------------------------
;	int splx(int onoff) // IRQ On/Off
;			    // onoff : 1 -> IRQ Disable
;			    // onoff : 0 -> IRQ Enable
	EXPORT  splx
splx
        MRS     r1, cpsr        
        BIC     r2, r1, #0x80   
        CMP     r0, #1          
        ORREQ   r2, r2, #0x80   
        MSR     CPSR_cxsf, r2   
        MOVS    r1, r1, LSL #25 
        MOV     r0, #0          
        MOVCS   r0, #1          
        mov	pc,lr


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;-----------------------------------------------------------------------------; 
;	uC/OS Porting Core Function : OSStartHighRdy                          ;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

	IMPORT	OSTaskSwHook
	IMPORT	OSRunning
	IMPORT	OSTCBHighRdy

	EXPORT	OSStartHighRdy

OSStartHighRdy  

	BL	OSTaskSwHook			; Call user defined task switch hook

	LDR	r0,=OSRunning			; Indicate that multitasking has started
	MOV	r1,#1
	STRB	r1,[r0]

	LDR	r0,=OSTCBHighRdy		; r0 <= &OSTCBHighRdy
	LDR	r0,[r0]				; r0 <=  OSTCBHighRdy

	LDR	sp,[r0]				; sp <=  OSTCBHighRdy->OSTCBStkPtr

	LDMFD	sp!,{r0}			; restore SP...
	MSR	CPSR_xsf,r0
	LDMFD   sp!,{r0 - r12, lr , pc}		; Load task's context & Run task

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;-----------------------------------------------------------------------------; 
;	uC/OS Porting Core Function : OSCtxSw                                 ;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

	IMPORT	OSTCBCur
	IMPORT	OSTaskSwHook
	IMPORT	OSTCBHighRdy
	IMPORT	OSPrioCur
	IMPORT	OSPrioHighRdy

	EXPORT	OSCtxSw

OSCtxSw	
	STMFD	sp!,{lr}			; push resume address
	STMFD	sp!,{r0 - r12, lr}		; push rest context
	MRS	r0,CPSR
	STMFD	sp!,{r0}			; push CPSR

	LDR	r0,=OSTCBCur			; r0 <= &OSTCBCur
	LDR	r0,[r0]				; r0 <=  OSTCBCur
	STR	sp,[r0]				; OSTCBCur->OSTCBStkPtr = sp

	BL	OSTaskSwHook			; Call user defined task switch hook

	LDR	r0,=OSTCBCur			; r0 <= &OSTCBCur
	LDR	r1,=OSTCBHighRdy		; r1 <= &OSTCBHighRdy
	
	LDR	r2,[r1]				; r2 <=  OSTCBHighRdy
	STR	r2,[r0]				; OSTCBCur = OSTCBHighRdy

	LDR	r0,=OSPrioCur			; r0 <= &OSPrioCur
	LDR	r1,=OSPrioHighRdy		; r1 <= &OSPrioHighRdy
	
	LDRB	r3,[r1]				; r3 <=  OSPrioHighRdy
	STRB	r3,[r0]				; OSPrioCur = OSPrioHighRdy

	LDR	sp,[r2]				; sp <=  OSTCBHighRdy->OSTCBStkPtr

	LDMFD	sp!,{r0}			; restore SP...
	MSR	CPSR_xsf,r0
	LDMFD   sp!,{r0 - r12, lr , pc}		; Load task's context & Run task


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;-----------------------------------------------------------------------------; 
;	uC/OS Porting Core Function : OSIntCtxSw                              ;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

	IMPORT	OSTCBCur
	IMPORT	OSTaskSwHook
	IMPORT	OSTCBHighRdy
	IMPORT	OSPrioCur
	IMPORT	OSPrioHighRdy

	EXPORT	OSIntCtxSw 

OSIntCtxSw 

	ADD	sp,sp,#4

	LDR	r0,=OSTCBCur			; r0 <= &OSCTBCur
	LDR	r0,[r0]				; r0 <=  OSCTBCur

	STR	sp,[r0]				; OSTCBCur->OSTCBStkPtr = sp
	
	BL	OSTaskSwHook			; Call user defined task switch hook

	LDR	r0,=OSTCBCur			; r0 <= &OSTCBCur
	LDR	r1,=OSTCBHighRdy		; r1 <= &OSTCBHighRdy
	
	LDR	r2,[r1]				; r2 <=  OSTCBHighRdy
	STR	r2,[r0]				; OSTCBCur = OSTCBHighRdy

	LDR	r0,=OSPrioCur			; r0 <= &OSPrioCur
	LDR	r1,=OSPrioHighRdy		; r1 <= &OSPrioHighRdy
	
	LDRB	r3,[r1]				; r3 <=  OSPrioHighRdy
	STRB	r3,[r0]				; OSPrioCur = OSPrioHighRdy

	LDR	sp,[r2]				; sp <=  OSTCBHighRdy->OSTCBStkPtr
	LDMFD	sp!,{r0}			; restore SP...
	MSR	CPSR_xsf,r0
	LDMFD   sp!,{r0 - r12, lr , pc}		; Load task's context & Run task

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;-----------------------------------------------------------------------------; 
;	uC/OS Porting Core Function : OSTickISR                               ;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
	IMPORT	OSIntNesting
	IMPORT	OSTimeTick
	IMPORT	OSIntExit

OSTickISR  

	LDR	r0,=OSIntNesting		; Notify uC/OS-II of ISR
	LDRB	r1,[r0]
	ADD	r1,r1,#1
	STRB	r1,[r0]
	
	BL	OSTimeTick			; Process system tick
        BL	OSIntExit			; Notify uC/OS-II of end of ISR

	LDMFD	sp!,{r0}
	MSR	CPSR_xsf,r0
	LDMFD   sp!,{r0 - r12, lr , pc}      



;--------------------------------------------------------------------------------
;	MEMORY Setting Table.
;--------------------------------------------------------------------------------

SMRDATA DATA

		DCD 0x22011111	; BWSCON B7:32B, B6:32B, B5:8B, B4:16B, B3:16B, B2:16B, B1:16B, B0:16B
		DCD 0x00001f50	; GCS0
		DCD 0x00000700	; GCS1
		DCD 0x00000700	; GCS2
		DCD 0x00000700	; GCS3
		DCD 0x00000700	; GCS4
		DCD 0x00001100	; GCS5
		DCD 0x00018005	; GCS6, SDRAM (MT=3(SDRAM),Trcd=01(3Clock),SCAN=01(9Bit))
		DCD 0x00018005	; GCS7, SDRAM (MT=3(SDRAM),Trcd=01(3Clock),SCAN=01(9Bit))
		DCD 0x00900000 + 192  ;	Refresh(REFEN=1, TREFMD=0,	Trp=3, Trc=5, Tchr=3)
		DCD 0x00000000	; Bank Size, 32MB/32MB
		DCD 0x00000030	; MRSR 6(CL=3)
		DCD 0x00000030	; MRSR 7(CL=3)

;--------------------------------------------------------------------------------
; 	Zero-initialied read/write data area at the end of RAM.
;--------------------------------------------------------------------------------
    	AREA    |Assembly$$endofram|, DATA, READWRITE, NOINIT

;--------------------------------------------------------------------------------
; The following contains the address of the first free word if internal SRAM.
;--------------------------------------------------------------------------------
    	EXPORT  ulEndOfRAM
ulEndOfRAM
    	DCD     0
;--------------------------------------------------------------------------------

	 	END

⌨️ 快捷键说明

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