📄 init.s
字号:
;******************************************************************************
;
; STARTUP CODE FOR ARM1176
;
;******************************************************************************
PRESERVE8
AREA INIT, CODE, READONLY ; Name this block of code ;
;******************************************************************************
; IMPORTS
;******************************************************************************
IMPORT __main
IMPORT ||Image$$ARM_LIB_STACK$$ZI$$Limit|| ; Import stack limit from scatter-loading file ;
;******************************************************************************
; EXPORTS
;******************************************************************************
EXPORT ResetHndlr
;******************************************************************************
; DEFINITIONS
;******************************************************************************
MODE_BITS EQU 0x1F ; Bit mask for mode bits in CPSR
USR_MODE EQU 0x10 ; User mode
FIQ_MODE EQU 0x11 ; Fast Interrupt Request mode
IRQ_MODE EQU 0x12 ; Interrupt Request mode
SVC_MODE EQU 0x13 ; Supervisor mode
ABT_MODE EQU 0x17 ; Abort mode
UND_MODE EQU 0x1B ; Undefined Instruction mode
SYS_MODE EQU 0x1F ; System mode
I_BIT EQU 0x80
F_BIT EQU 0x40
; Define stack sizes ;
IRQ_STK_SIZE EQU 0x00000400
FIQ_STK_SIZE EQU 0x00000400
SVC_STK_SIZE EQU 0x00000400
ABT_STK_SIZE EQU 0x00000400
UND_STK_SIZE EQU 0x00000400
SYS_STK_SIZE EQU 0x00000800
; Constants for remapping Flash ;
ROM_BASE EQU 0x24000000 ; Address of ROM (being the Flash) after remap ;
ROM_INSTRUCT_2 EQU ROM_BASE + 4 ; Address of the second instruction in ROM ;
CM_CTL_REG EQU 0x1000000C ; Address of Core Module Control Reigster ;
REMAP_BIT EQU 0x04
; Define stack pointers ;
;******************************************************************************
; PERFORM ROM/RAM REMAPPING
;******************************************************************************
ENTRY
IF :DEF: ROM_RAM_REMAP
LDR pc, =ROM_INSTRUCT_2
LDR r1, =CM_CTL_REG
LDR r0, [r1]
ORR r0, r0, #REMAP_BIT
STR r0, [r1]
ENDIF
ResetHndlr
;******************************************************************************
; SETUP STACK POINTERS
;******************************************************************************
ldr r1, =||Image$$ARM_LIB_STACK$$ZI$$Limit||
mrs r0,cpsr ; Original PSR value
bic r0,r0,#MODE_BITS ; Clear the mode bits
orr r0,r0,#IRQ_MODE ; Set IRQ mode bits
msr cpsr_c,r0 ; Change the mode
mov sp, r1
sub r1, r1, #IRQ_STK_SIZE
mrs r0,cpsr ; Original PSR value
bic r0,r0,#MODE_BITS ; Clear the mode bits
orr r0,r0,#ABT_MODE ; Set IRQ mode bits
msr cpsr_c,r0 ; Change the mode
mov sp, r1
sub r1, r1, #ABT_STK_SIZE
mrs r0,cpsr ; Original PSR value
bic r0,r0,#MODE_BITS ; Clear the mode bits
orr r0,r0,#SVC_MODE ; Set IRQ mode bits
msr cpsr_c,r0 ; Change the mode
mov sp, r1
sub r1, r1, #SVC_STK_SIZE
mrs r0,cpsr ; Original PSR value
bic r0,r0,#MODE_BITS ; Clear the mode bits
orr r0,r0,#UND_MODE ; Set IRQ mode bits
msr cpsr_c,r0 ; Change the mode
mov sp, r1
sub r1, r1, #UND_STK_SIZE
mrs r0,cpsr ; Original PSR value
bic r0,r0,#MODE_BITS ; Clear the mode bits
orr r0,r0,#FIQ_MODE ; Set IRQ mode bits
msr cpsr_c,r0 ; Change the mode
mov sp, r1
sub r1, r1, #FIQ_STK_SIZE
mrs r0,cpsr ; Original PSR value
bic r0,r0,#MODE_BITS ; Clear the mode bits
orr r0,r0,#SYS_MODE ; Set IRQ mode bits
msr cpsr_c,r0 ; Change the mode
mov sp, r1
msr cpsr_c, #SYS_MODE:OR:F_BIT ; Enable interrupts, if required ;
;******************************************************************************
; MOVE TO MAIN
;******************************************************************************
ldr r0, =__main
bx r0 ; Save this in register for possible long jump ;
LTORG
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -