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

📄 initstack.s

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 S
字号:
;=========================================
;初始化堆栈
;07-09-17,huangsl,单独提取出来作为函数.
;=========================================
		INCLUDE CONDEFINE.s

;SRAM(FIRST 4K BYTES)
;/********************************************************************************************************
AREA_SRAM_START				EQU 		0X00000000
AREA_SRAM_END					EQU 		0X00001000
;********************************************************************************************************/

;SDRAM (16M BYTES)
;/********************************************************************************************************
; ENABLEMMU 编译开关有编译器配置 
	IF	:DEF: ENABLEMMU 
AREA_SDRAM_START 			EQU 		0X01000000
AREA_SDRAM_END 				EQU 		0X01800000
	ELSE
AREA_SDRAM_START 			EQU 		0X60000000
AREA_SDRAM_END 				EQU 		0X61000000
	ENDIF
;********************************************************************************************************/	
;		IMPORT		gRockIrqStackStart
;/*********************************************************************************************************
    EXPORT		InitStacks
;		EXPORT		Cpu_Init
;/*********************************************************************************************************
		CODE32
		AREA   LOADER, CODE, READONLY

;/*********************************************************************************************************
;** Initialize the stacks  初始化堆栈
;********************************************************************************************************/
InitStacks
		
		;080301,huangsl,根据最新 SOCLE 方案,把 IRQ 堆栈定位在 SRAM.
		;LDR			R2, =gRockIrqStackStart		
		LDR     R2, =AREA_SRAM_END			
		
		MSR	CPSR_c,#IRQMODE|NOINT  ; No interrupts
		MOV     SP, R2 
		
		LDR     R2, =AREA_SRAM_END			;080220,huangsl,OTHER SET TO SRAM.
		
		MSR	CPSR_c,#FIQMODE|NOINT  ; No interrupts
		MOV     SP, R2 
	
		MSR	CPSR_c,#ABORTMODE|NOINT  ; No interrupts
		MOV     SP, R2 


		MSR	CPSR_c,#UNDEFMODE|NOINT  ; No interrupts
		MOV     SP, R2 
	
	;必须 保证 SVC 退出.
		MSR	CPSR_c,#SVCMODE|NOINT  ; No interrupts
		MOV     SP, R2 
  
		mov	pc,lr 


;/************************************************************************************************
    
;/************************************************************************************************	
;080530,huangsl,增加保存相关的变量名称,以便外部访问.
;/************************************************************************************************	

		EXPORT 		gSysHeapEnd
		EXPORT 		gKerlImageSize
;		EXPORT		gIrqStackLimit	;put to sram .
		EXPORT		gSysLoaderFlag
		EXPORT		gGuiDspBmpBufferLimit	
		EXPORT		gIrqStackLimit
		EXPORT		gpSysSaveDataStartPtr
		EXPORT 		gSysSaveDataBytesLen
		
		IMPORT		||Image$$STACK_SDRAM$$ZI$$Limit||		
		IMPORT		||Image$$REALTABLE_SDRAM$$Base||
		IMPORT		||Image$$CACHE_SRAM$$ZI$$Limit|| 	
		IMPORT		||Image$$HEAP_SDRAM$$Base|| 	
		IMPORT		||Image$$FSZI_SDRAM$$Base||
		
		IMPORT	||Load$$DAT_SYSSAVE$$Base||	
		IMPORT	||Image$$DAT_SYSSAVE$$Length||		
		
gKerlImageSize	
		DCD				||Image$$STACK_SDRAM$$ZI$$Limit||	;固件 RO,RW,ZI 的大小.
gSysHeapEnd		
		DCD				||Image$$REALTABLE_SDRAM$$Base|| 	;系统堆 的 结束地址.
;gIrqStackLimit		
;		DCD				||Image$$CACHE_SRAM$$ZI$$Limit||+4	;IQR 栈 的 LIMIT 地址。
gSysLoaderFlag
		DCD				||Image$$HEAP_SDRAM$$Base||-20			; LOADER FLAG 的地址.080228,HUANGSL,CHANGE to 5 words.
gGuiDspBmpBufferLimit
		DCD				||Image$$FSZI_SDRAM$$Base||
gIrqStackLimit		
		DCD				||Image$$CACHE_SRAM$$ZI$$Limit||	;IQR 栈 的 LIMIT 地址。			

gpSysSaveDataStartPtr
		DCD				||Load$$DAT_SYSSAVE$$Base||	
gSysSaveDataBytesLen
		DCD				||Image$$DAT_SYSSAVE$$Length||+4	; +4 for CRC .						
;/************************************************************************************************		
; 系统死机 调试信息.
;
		IF :LNOT: :DEF: SETUP
		EXPORT SYSTEM_DUMP
		EXPORT DebugSystem
		
;		IMPORT TASK_DUMP
		IMPORT OSCurrTaskDump
		IMPORT ||Image$$REALTABLE_SDRAM$$ZI$$Limit||
		
SYSTEM_DUMP
		STMFD 	sp!, {lr} 					; OSCtxSw是被调用的,lr的值就是调用前的PC值,入栈 
		STMFD 	sp!, {r0-r12,lr} 		; 将lr和其他寄存器入栈 
		MRS 		r0, cpsr 						;通过MRS指令将cpsr入栈 
		STMFD 	sp!, {r0}
		
		;080220,为了和 任务压栈兼容,只压 CPSR,SPSR 此时无意义.
		;MRS 		r0, spsr 						;SPSR
		;STMFD 	sp!, {r0}
		
		MOV			r0,sp
		MSR     CPSR_c, #SVCMODE|NOINT			;切换到 SVC 模式,且关闭中断.

		MOV			R1,SP
		LDR			SP,=||Image$$REALTABLE_SDRAM$$ZI$$Limit||
	
		BL			OSCurrTaskDump
		
		LDMFD 	sp!, {r4} 								
		MSR 		spsr_cxsf, r4 						
		LDMFD 	sp!, {r0-r12,lr,pc}^ 		

		
					 		   

DebugSystem
		STMFD 	sp!, {lr} 							;为了和 SYSTEM_DUMP 兼容.
		STMFD 	sp!, {r0-r12,lr} 				;SAVE ALL REGISITER
		
		;080220,为了和 任务压栈兼容,只压 CPSR,用于记录 异常模式,SPSR 一般为 SVC.
		MRS     R0, SPSR   		
		STMFD 	sp!, {R0} 							;SAVE SPSR --> 异常之前的 寄存器模式.	
		
	  MRS     R0, CPSR   		
		STMFD 	sp!, {R0} 							;SAVE CPSR --> 异常 模式.	
		
  	MOV			R0,SP					; r0 保存 堆栈 数据.
		MSR     CPSR_c, #SVCMODE|NOINT			;切换到 SVC 模式.
		
		;080220,huangsl,要保存当前 任务的 SP,否则,当前任务的堆栈信息无法获得.
		;通过 第二个参数来传递.
		MOV			R1,SP
		LDR			SP,=||Image$$REALTABLE_SDRAM$$ZI$$Limit||

		ldr	pc, __OSCurrTaskDump
		
__OSCurrTaskDump	DCD		OSCurrTaskDump
		
;__TASK_DUMP				DCD 	TASK_DUMP
;__Reboot					DCD 	ISystemReboot
			
	ENDIF   ; :LNOT: :DEF: SETUP		 		   
	
		EXPORT	UHEnableInt
UHEnableInt 
				MRS r0, cpsr 				;由于任务和内核都运行在svc模式下,因此可方便地操作cpsr 
				BIC r1, r0, #0x80 		;屏蔽FIQ,IRQ中断 
				MSR cpsr_c, r1 			;回写cpsr,只屏蔽IRQ中断 
				MOV pc, lr 			
				
		EXPORT  SET_ROM_SP
		
SET_ROM_SP
			 MRS		R1,cpsr		;保存 CPSR,以便返回地址没有错误.
       MSR     CPSR_c, #0xd2
       LDR     R0, =0x18200458
       MOV     R13, R0

       MSR     CPSR_c, #0xd3
       LDR     R0, =0x18200858
       MOV     R13, R0
       
       MSR			cpsr_cxsf,R1 	;恢复 CPSR
       MOV     PC, LR				   	  
    END
;/*********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/

⌨️ 快捷键说明

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