📄 vector.s
字号:
ModeMask EQU 0x1F
SVC32Mode EQU 0x13
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
User32Mode EQU 0x10
Abort32Mode EQU 0x17
Undef32Mode EQU 0x1B
IRQ_BIT EQU 0x80
FIQ_BIT EQU 0x40
GBLS MainEntry
MainEntry SETS "main"
IMPORT $MainEntry
;*******************************************************************
;检查是否使用tasm.exe进行编译
GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CODE32
|
THUMBCODE SETL {FALSE}
]
[ THUMBCODE
CODE32 ;for start-up code for Thumb mode
]
;*******************************************************************
AREA SelfBoot, CODE, READONLY
IMPORT UDF_INS_VECTOR
IMPORT SWI_SVC_VECTOR
IMPORT INS_ABT_VECTOR
IMPORT DAT_ABT_VECTOR
IMPORT IRQ_SVC_VECTOR
IMPORT FIQ_SVC_VECTOR
ENTRY
IF :DEF: |ads$version|
ELSE
EXPORT __main
__main
ENDIF
ResetEntry
b SYS_RST_HANDLER
b UDF_INS_HANDLER
b SWI_SVC_HANDLER
b INS_ABT_HANDLER
b DAT_ABT_HANDLER
b .
b IRQ_SVC_HANDLER
b FIQ_SVC_HANDLER
;*******************************************************************
MACRO
$Label HANDLER $Vector
$Label
sub lr, lr, #4
stmfd sp!, {r0-r3, lr}
ldr r0, =$Vector
ldr pc, [r0]
ldmfd sp!, {r0-r3, pc}^
MEND
UDF_INS_HANDLER
stmfd sp!, {r0-r3, lr}
ldr r0, =UDF_INS_VECTOR
mov lr, pc
ldr pc, [r0]
ldmfd sp!, {r0-r3, pc}^
SWI_SVC_HANDLER
stmfd sp!, {r0-r3, lr}
ldr r0, =SWI_SVC_VECTOR
mov lr, pc
ldr pc, [r0]
ldmfd sp!, {r0-r3, pc}^
INS_ABT_HANDLER
sub lr, lr, #4
stmfd sp!, {r0-r3, lr}
ldr r0, =INS_ABT_VECTOR
mov lr, pc
ldr pc, [r0]
ldmfd sp!, {r0-r3, pc}^
DAT_ABT_HANDLER
sub lr, lr, #4
stmfd sp!, {r0-r3, lr}
ldr r0, =DAT_ABT_VECTOR
mov lr, pc
ldr pc, [r0]
ldmfd sp!, {r0-r3, pc}^
IRQ_SVC_HANDLER
SUB sp, sp, #4
STMFD sp!, {r0}
LDR r0, =HandleIrq
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD sp!, {r0, pc}
FIQ_SVC_HANDLER
sub lr, lr, #4
stmfd sp!, {r0-r12, lr}
mrs r0, spsr
stmfd sp!, {r0}
ldr r0, =IRQ_SVC_VECTOR
ldr pc, [r0]
;*******************************************************************
SYS_RST_HANDLER
mrs r0, cpsr ;enter svc mode and disable irq,fiq
bic r0, r0, #ModeMask
orr r0, r0, #(SVC32Mode :OR: IRQ_BIT :OR: FIQ_BIT)
msr cpsr_c, r0
IMPORT InitSystem
bl InitSystem
adr r0, ResetEntry
ldr r1, BaseOfROM
cmp r0, r1
ldreq r0, TopOfROM
beq InitRamData
ldr r2, =CopyProcBeg
sub r1, r2, r1
add r0, r0, r1
ldr r3, =CopyProcEnd
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0
ldr r3, TopOfROM
ldr pc, =CopyProcBeg
;*******************************************************************
CopyProcBeg
0
ldmia r0!, {r4-r11}
stmia r2!, {r4-r11}
cmp r2, r3
bcc %B0
CopyProcEnd
sub r1, r2, r3
sub r0, r0, r1
InitRamData
ldr r2, BaseOfBSS
ldr r3, BaseOfZero
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0
mov r0, #0
ldr r3, EndOfBSS
1
cmp r2, r3
strcc r0, [r2], #4
bcc %B1
mrs r0,cpsr
orr r0,r0,#0xdf
msr cpsr_cxsf,r0
ldr pc, GotoMain
SystemIrqHandler
IMPORT ISR_IrqHandler
;Handler In C source file
;IMPORT OSIntNesting
stmfd sp,{r0-r2}
IMPORT IntOffSet
ldr r0,=0x01e00020 ;I_ISPR
ldr r0,[r0]
;ldr r2,=IntOffSet
;str r0,[r2]
mov r1,r0
mov r2,#0
0
movs r1,r1,lsr #1
bcs %f1
add r2,r2,#1
b %b0
1
ldr r1,=IntOffSet
str r2,[r1]
;mov r0,r0,lsr #2
;mov r1,#1
;mov r0,r1,lsl r0
ldr r2,=0x01e00024 ;I_ISPC
str r0,[r2]
sub r0,sp,#12
sub r2,lr,#4
mrs r1,spsr
orr r1,r1,#0x80
;bic r1,r1,#0x80
msr cpsr_cxsf,r1
stmfd sp!,{r2} ;pc
stmfd sp!,{lr} ;lr
stmfd sp!,{r3-r12}
ldmia r0!,{r3-r5}
stmfd sp!,{r3-r5}
bic r1,r1,#0x80
stmfd sp!,{r1}
;mrs r1,spsr
stmfd sp!,{r1}
BL ISR_IrqHandler
LDMFD sp!, {r0}
;msr SPSR_cxsf, r0 ; 运行在sys模式下,无需SPSR的更新
LDMFD sp!, {r0}
MSR CPSR_cxsf, r0
LDMFD sp!, {r0-r12, lr, pc}
;现场恢复完毕
;*******************************************************************
HandleIrq DCD SystemIrqHandler
GotoMain DCD $MainEntry
;*******************************************************************
IMPORT |Image$$RO$$Base| ; ROM code start
IMPORT |Image$$RO$$Limit| ; RAM data starts after ROM program
IMPORT |Image$$RW$$Base| ; Pre-initialised variables
IMPORT |Image$$ZI$$Base| ; uninitialised variables
IMPORT |Image$$ZI$$Limit| ; End of variable RAM space
BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|
EXPORT GetBaseOfROM
EXPORT GetEndOfROM
EXPORT GetBaseOfBSS
EXPORT GetBaseOfZero
EXPORT GetEndOfBSS
EXPORT GetPC
GetBaseOfROM
ldr r0, BaseOfROM
mov pc, lr
GetEndOfROM
ldr r0, TopOfROM
mov pc, lr
GetBaseOfBSS
ldr r0, BaseOfBSS
mov pc, lr
GetBaseOfZero
ldr r0, BaseOfZero
mov pc, lr
GetEndOfBSS
ldr r0, EndOfBSS
mov pc, lr
GetPC
mov r0,pc
mov pc,lr
;*******************************************************************
__user_initial_stackheap
LDR r0,=bottom_of_heap ;库函数的堆空间
MOV pc,lr
AREA Myheap, DATA, NOINIT, ALIGN=2
bottom_of_heap SPACE 1024 ;库函数的堆空间初始化
;Byte
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -