📄 startup.s
字号:
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 ; available on ARM Arch 4 and later
I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled
F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled
Len_UND_Stack EQU 256 ;定义各个异常模式的堆栈大小
Len_ABT_Stack EQU 256
Len_FIQ_Stack EQU 256
Len_IRQ_Stack EQU 256
Len_SVC_Stack EQU 1024
Len_SYS_Stack EQU 1024
offset_FIQ_Stack EQU 0
offset_IRQ_Stack EQU offset_FIQ_Stack + Len_FIQ_Stack
offset_UND_Stack EQU offset_IRQ_Stack + Len_IRQ_Stack
offset_ABT_Stack EQU offset_UND_Stack + Len_UND_Stack
offset_SVC_Stack EQU offset_ABT_Stack + Len_ABT_Stack
offset_SYS_Stack EQU offset_SVC_Stack + Len_SVC_Stack
IMPORT __main ;C库初始化代码
IMPORT BSP_Init ;初始化目标板
EXPORT Reset
EXPORT __user_initial_stackheap
CODE32
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, DataAbort_Addr
DCD 0xb9205f80 ;LPC2000系列独有的特征
LDR PC, [PC, #-0xff0] ;获取优先级最高的ISR地址
LDR PC, FIQ_Addr
Reset_Addr DCD ResetInit
Undefined_Addr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
Prefetch_Addr DCD PrefetchAbort
DataAbort_Addr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
Undefined
B Undefined
SoftwareInterrupt
B SoftwareInterrupt
PrefetchAbort
B PrefetchAbort
DataAbort
B DataAbort
FIQ_Handler ;快速中断入口点
B FIQ_Handler
InitStack
MOV r1, lr
LDR r0, =stack_base
MSR CPSR_c, #Mode_FIQ|I_Bit|F_Bit
SUB sp, r0, #offset_FIQ_Stack
MSR CPSR_c, #Mode_IRQ|I_Bit|F_Bit
SUB sp, r0, #offset_IRQ_Stack
MSR CPSR_c, #Mode_UND|I_Bit|F_Bit
SUB sp, r0, #offset_UND_Stack
MSR CPSR_c, #Mode_ABT|I_Bit|F_Bit
SUB sp, r0, #offset_ABT_Stack
MSR CPSR_c, #Mode_SVC|I_Bit|F_Bit
SUB sp, r0, #offset_SVC_Stack
MSR CPSR_c, #Mode_SYS|I_Bit|F_Bit
SUB sp, r0, #offset_SYS_Stack
MOV pc, r1
ResetInit
BL InitStack ;初始化堆栈
BL BSP_Init ;初始化目标板
B __main
__user_initial_stackheap ;放置堆
LDR r0,=heap_base
MOV pc,lr
AREA heap, DATA, NOINIT
EXPORT heap_base
heap_base SPACE 1 ;在ZW ZI之后放置,在链接时确定
AREA stacks, DATA, NOINIT
EXPORT stack_base ;在分散加载文件中定义,栈底为0x40004000
stack_base SPACE 1
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -