📄 init.s
字号:
.INCLUDE "netstart.mac"
/****************************************************/
/* AREA Init, CODE, READONLY */
/* --- Define entry point */
/****************************************************/
.text
.global __main /* defined to ensure that C runtime system */
__main: /* is not linked in */
__ENTRY:
/****************************************************/
/* --- Setup interrupt / exception vectors */
/****************************************************/
B SystemResetHandler
B SystemUndefinedHandler
B SystemSwiHandler
B SystemPrefetchHandler
B SystemAbortHandler
nop /* Reserved vector not use*/
B SystemIrqHandler
B SystemFiqHandler
/****************************************************/
/* AREA Main, CODE, READONLY */
/* The Reset Entry Point */
/****************************************************/
.global Reset_Handler
SystemResetHandler:
Reset_Handler: /* Reset Entry Point */
LDR r1, =IntMask
LDR r0, =0xFFFFFFFF
STR r0, [r1]
/*======================================*/
/* LED Display */
/*======================================*/
LDR r1, =IOPMODE
LDR r0, =0x30080
STR r0, [r1]
LDR r1, =IOPDATA
LDR r0, =0x30080
STR r0, [r1]
/*======================================*/
/* Initialise STACK */
/*======================================*/
INITIALIZE_STACK:
MRS r0, cpsr
BIC r0, r0, #LOCKOUT | MODE_MASK /*0xC0 | 0x1F*/
ORR r2, r0, #USR_MODE
ORR r1, r0, #LOCKOUT | FIQ_MODE /*0xC0 | 0x11*/
MSR cpsr_cf, r1
MSR spsr_cf, r2
LDR sp, =FIQ_STACK
ORR r1, r0, #LOCKOUT | IRQ_MODE /*0xC0 | 0x12*/
MSR cpsr_cf, r1
MSR spsr_cf, r2
LDR sp, =IRQ_STACK
ORR r1, r0, #LOCKOUT | ABT_MODE /*0xC0 | 0x17*/
MSR cpsr_cf, r1
MSR spsr_cf, r2
LDR sp, =ABT_STACK
ORR r1, r0, #LOCKOUT | UDF_MODE /*0xC0 | 0x1B*/
MSR cpsr_cf, r1
MSR spsr_cf, r2
LDR sp, =UDF_STACK
ORR r1, r0, #LOCKOUT | SUP_MODE /*0xC0 | 0x13*/
MSR cpsr_cf, r1
MSR spsr_cf, r2
LDR sp, =SUP_STACK /* Change CPSR to SVC mode */
/*======================================*/
/* Initialise memory required by C code */
/*======================================*/
.extern Image_RO_Limit /* limit of ROM */
.extern Image_RW_Base /* Base of RAM to initialise */
.extern Image_ZI_Base /* Base and limit of area */
.extern Image_ZI_Limit /* to zero initialise */
LDR r0, =Image_RO_Limit
LDR r1, =Image_RW_Base
LDR r3, =Image_ZI_Base
CMP r0, r1
BEQ LOOP1
LOOP0:
CMP r1, r3
LDRCC r2, [r0], #4
STRCC r2, [r1], #4
BCC LOOP0
LOOP1:
LDR r1, =Image_ZI_Limit /* Zero init base => top of initialised data */
MOV r2, #0 /* Top of zero init segment */
LOOP2:
CMP r3, r1 /* Zero init */
STRCC r2, [r3], #4
BCC LOOP2
/*======================================================*/
/* Now change to user mode and set up user mode stack. */
/*======================================================*/
MRS r0, cpsr
BIC r0, r0, #LOCKOUT | MODE_MASK
ORR r1, r0, #SYS_MODE
MSR cpsr_cf, r1
LDR sp, =USR_STACK
/*==============================================================*/
/* Call C_Entry application routine with a pointer to the first */
/* available memory address after ther compiler's global data */
/* This memory may be used by the application. */
/*==============================================================*/
/*======================================*/
/* Now we enter the C Program */
/*======================================*/
.extern C_Entry
BL C_Entry
/****************************************************/
/* Exception Vector Function Definition */
/* Consist of function Call from C-Program. */
/****************************************************/
.extern ISR_UndefHandler
SystemUndefinedHandler:
STMFD sp!, {r0-r12, lr}
BL ISR_UndefHandler
LDMFD sp!, {r0-r12, pc}^
.extern ISR_SwiHandler
SystemSwiHandler:
STMFD sp!, {r0-r12,lr}
LDR r0, [lr, #-4]
BIC r0, r0, #0xff000000
CMP r0, #0xff
BEQ MakeSVC
BL ISR_SwiHandler
LDMFD sp!, {r0-r12, pc}^
MakeSVC:
LDMFD sp!, {r0-r12, pc}
.extern ISR_PrefetchHandler
SystemPrefetchHandler:
STMFD sp!, {r0-r12, lr}
BL ISR_PrefetchHandler
LDMFD sp!, {r0-r12, lr}
SUBS pc, lr, #4
.extern ISR_AbortHandler
SystemAbortHandler:
STMFD sp!, {r0-r12, lr}
BL ISR_AbortHandler
LDMFD sp!, {r0-r12, lr}
SUBS pc, lr, #8
SystemReserv:
SUBS pc, lr, #4
.extern ISR_IrqHandler
SystemIrqHandler:
STMFD sp!, {r0-r12, lr}
BL ISR_IrqHandler
LDMFD sp!, {r0-r12, lr}
SUBS pc, lr, #4
.extern ISR_FiqHandler
SystemFiqHandler:
STMFD sp!, {r0-r7, lr}
BL ISR_FiqHandler
LDMFD sp!, {r0-r7, lr}
SUBS pc, lr, #4
.global TEST
TEST:
MOV r1, #5
MOV r0, #6
MOV pc, lr
/****************************************************/
/* AREA SYS_STACK, NOINIT */
/****************************************************/
.data
.SPACE USR_STACK_SIZE
USR_STACK:
.SPACE UDF_STACK_SIZE
UDF_STACK:
.SPACE ABT_STACK_SIZE
ABT_STACK:
.SPACE IRQ_STACK_SIZE
IRQ_STACK:
.SPACE FIQ_STACK_SIZE
FIQ_STACK:
.SPACE SUP_STACK_SIZE
SUP_STACK:
#--------------------------------------------------------------------------------------
# END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -