;/*************************************************************************************
; File Name : retarget_.s
;
; File Description : This file implements the stack & heap initilaization
;*************************************************************************************/
GET ..\inc\option.inc
AREA |C$$code|, CODE, READONLY
Mode_USR EQU 0x10 ;用户模式
Mode_FIQ EQU 0x11 ;快速中断模式
Mode_IRQ EQU 0x12 ;中断请求模式
Mode_SVC EQU 0x13 ;管理模式
Mode_ABT EQU 0x17 ;异常中断模式
Mode_UND EQU 0x1b ;未定义模式
Mode_SYS EQU 0x1f ;系统模式
I_Bit EQU 0x80 ;禁止IRQ中断
F_Bit EQU 0x40 ;禁止FRQ中断
;定义中断堆栈空间大小
Size_FIQ_Stack EQU 256
Size_IRQ_Stack EQU 256
Size_ABT_Stack EQU 256
Size_UND_Stack EQU 256
Size_SVC_Stack EQU 8192
;定义堆栈偏移量
Offset_FIQ_Stack EQU 0
Offset_IRQ_Stack EQU Offset_FIQ_Stack + Size_FIQ_Stack
Offset_ABT_Stack EQU Offset_IRQ_Stack + Size_IRQ_Stack
Offset_UND_Stack EQU Offset_ABT_Stack + Size_ABT_Stack
Offset_SVC_Stack EQU Offset_UND_Stack + Size_UND_Stack
EXPORT __user_initial_stackheap
__user_initial_stackheap ;初始化堆栈
ldr r0,=top_of_stacks ;将栈顶的地址赋给r0
msr CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_FIQ_Stack
msr CPSR_c,#Mode_IRQ:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_IRQ_Stack
msr CPSR_c,#Mode_ABT:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_ABT_Stack
msr CPSR_c,#Mode_UND:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_UND_Stack
msr CPSR_c,#Mode_SVC:OR:I_Bit:OR:F_Bit
sub r1,r0,#Offset_SVC_Stack
;IMPORT |Image$$ZI$$Limit| ;表示ZI的结束地址
;LDR r0, =|Image$$ZI$$Limit|
ldr r0, =base_of_heap
mov r2,#0
mov r3,#0
mov pc,lr ;R14的值复制到PC,子程序返回
;-------------------------------------------------------
[ (VIC_MODE = 0) ;VIC_MODE预定义为1,跳过该段程序
IMPORT IntHandlerTable
EXPORT IsrIRQ
IsrIRQ
sub sp,sp,#4 ; reserved for PC
stmfd sp!,{r8-r9}
ldr r9,=0x71200f00 ; rVIC0ADDR
ldr r9,[r9]
ldr r8,=IntHandlerTable
add r8,r8,r9,lsl #2 ;r8=r8+r9*4
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc}
]
LTORG ;数据缓冲池伪指令
END