📄 startup.s
字号:
/******************************************************************************
* Startup code
*
* startup.S
*
*****************************************************************************/
.text
.code 32
.align 0
.global startup
.global reset
.global main
.global stack_start
.global stack_end
.EQU IRQ_STACK_SIZE, (3*8*4)
.EQU ARM_MODE_FIQ, 0x11
.EQU ARM_MODE_IRQ, 0x12
.EQU ARM_MODE_SVC, 0x13
.equ AIC_IVR, (256)
.equ AIC_FVR, (260)
.equ AIC_EOICR, (304)
.equ AT91C_BASE_AIC, (0xFFFFF000)
.EQU I_BIT, 0x80
.EQU F_BIT, 0x40
/******************************************************************************
* Exception vectors
*****************************************************************************/
Vectors:
reset:
b startup // reset
ldr pc,_undf // undefined
ldr pc,_swi // SWI
ldr pc,_pabt // program abort
ldr pc,_dabt // data abort
nop // reserved
ldr pc,[pc,#-0xFF0] // IRQ
ldr pc,_fiq // FIQ
_undf: .word exit
_swi: .word exit
_pabt: .word exit
_dabt: .word exit
_fiq: .word exit
/*****************************************************************************
* Start - Setup hardware and start main()
*****************************************************************************/
.text
startup:
//Temporary stack at end of ram
ldr r13,=stack_end
//Init hardware (hwinit.c)
ldr r0,=hwinit
mov lr, pc
bx r0
//Set up Fast Interrupt Mode and set FIQ Mode Stack
mov r0,r13
msr CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT
//Init the FIQ register
ldr r8, =AT91C_BASE_AIC
//Set up Interrupt Mode and set IRQ Mode Stack
msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
mov r13, r0
sub r0, r0, #IRQ_STACK_SIZE
//Set up Supervisor Mode and set Supervisor Mode Stack
msr CPSR_c, #ARM_MODE_SVC
mov r13, r0
//Copy .data from ROM to RAM
LDR R1, =_etext
LDR R2, =_data
LDR R3, =_edata
LoopRel:
CMP R2, R3
LDRLO R0, [R1], #4
STRLO R0, [R2], #4
BLO LoopRel
//Write zeros to .bss section
MOV R0, #0
LDR R1, =__bss_start__
LDR R2, =__bss_end__
LoopZI:
CMP R1, R2
STRLO R0, [R1], #4
BLO LoopZI
//Go to main()
ldr lr,=exit
ldr r0,=main
bx r0
//Loop forever is main is ended...
exit:
b exit
/*****************************************************************************
* Exception vector
*****************************************************************************/
.global AT91F_Default_FIQ_handler
.func AT91F_Default_FIQ_handler
AT91F_Default_FIQ_handler:
b AT91F_Default_FIQ_handler
.size AT91F_Default_FIQ_handler, . - AT91F_Default_FIQ_handler
.endfunc
.global AT91F_Default_IRQ_handler
.func AT91F_Default_IRQ_handler
AT91F_Default_IRQ_handler:
b AT91F_Default_IRQ_handler
.size AT91F_Default_IRQ_handler, . - AT91F_Default_IRQ_handler
.endfunc
.global AT91F_Spurious_handler
.func AT91F_Spurious_handler
AT91F_Spurious_handler:
b AT91F_Spurious_handler
.size AT91F_Spurious_handler, . - AT91F_Spurious_handler
.endfunc
/*****************************************************************************
* Stack
*****************************************************************************/
.data
stack_start:
.fill 1024
stack_end:
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -