📄 initstack.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 + -