📄 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
]
;******************************************************
; SelfBoot edited by tianjh 05.04.06
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;***************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;IMPORT HandleADC
;IMPORT HandleRTC
;IMPORT HandleUTXD1
;IMPORT HandleUTXD0
;IMPORT HandleSIO
;IMPORT HandleIIC
;IMPORT HandleURXD1
;IMPORT HandleURXD0
;IMPORT HandleTIMER5
;IMPORT HandleTIMER4
;IMPORT HandleTIMER3
;IMPORT HandleTIMER2
;IMPORT HandleTIMER1
;IMPORT HandleTIMER0
;IMPORT HandleUERR01
;IMPORT HandleWDT
;IMPORT HandleBDMA1
;IMPORT HandleBDMA0
;IMPORT HandleZDMA1
;IMPORT HandleZDMA0
;IMPORT HandleTICK
;IMPORT HandleEINT4567
;IMPORT HandleEINT3
;IMPORT HandleEINT2
;IMPORT HandleEINT1
;IMPORT HandleEINT0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ENTRY
IF :DEF: |ads$version|
ELSE
EXPORT __main
__main
ENDIF
ResetEntry
b SYS_RST_HANDLER ;FOR debugging
b UDF_INS_HANDLER ;handlerUndef
b SWI_SVC_HANDLER ;SWI(SoftWare Interrupt) interrupt handler
b INS_ABT_HANDLER ;handler PAbort
b DAT_ABT_HANDLER ;handler DAbort
b . ;reserved by ARM
b IRQ_SVC_HANDLER ;handler IRQ
b FIQ_SVC_HANDLER ;handler FIQ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;******************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7
MACRO
$Label HANDLER $Vector
$Label
sub lr, lr, #4
stmfd sp!, {r0-r3, lr} ;FD满递减堆栈 执行寄存器压栈操作
ldr r0, =$Vector ;汇编里的处理函数地址,然后跳到C中,在DRAM
ldr pc, [r0] ;中断向量地址给R0
ldmfd sp!, {r0-r3, pc}^ ;数据出栈
MEND
; ^ = MAP -->定义一个结构化的内存表(Storage Map)的首地址
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 lr, lr, #4
stmfd sp!, {r0-r12, lr}
mrs r0, spsr
stmfd sp!, {r0}
ldr r0, =IRQ_SVC_VECTOR
ldr pc, [r0]
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]
;在程序的开始处,首先建立了默认的中断调用函数.这个过程大家一定非常熟悉,
;首先执行了压栈,然后给出了中断入口地址.这个HandleFiq就是我们前面提到的在DRAM中建立的中断向量其中一个的地址。
;在HandleFiq开始的四个字节中,放着汇编中断处理函数的入口地址。
;*******************************************************
;*************** start ********************************
;*******************************************************
SYS_RST_HANDLER
mrs r0, cpsr ;mrs--> 状态寄存器到通用寄存器的传送指令
;enter svc mode and disable irq,fiq
; disable irq,fiq ??????? tianjh
bic r0, r0, #ModeMask ;MODEMASK-->0x1f tianjh
; orr r0, r0, #(SVC32Mode :OR: IRQ_BIT :OR: FIQ_BIT)
orr r0, r0, #SVC32Mode
;-->1101 0011
;SVC32Mode-->0x13;IRQ_BIT-->0x80;FIQ_BIT -->0x40 tianjh
msr cpsr_c, r0 ;mrs--> 通用寄存器到状态寄存器的传送指令
;*******************************************************
IMPORT InitSystem
bl InitSystem ;转移连接到
;***********************************************
;设置IQR处理程序入口, 在配置好RAM后设置
;ldr r0, =IRQ_SVC_VECTOR
;ldr r1, =IRQ_SERVICE
;str r1, [r0]
;***********************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;copy and plaste RW data/zero initialized data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
adr r0, ResetEntry
ldr r1, BaseOfROM
cmp r0, r1
ldreq r0, TopOfROM
beq InitRamData
;*****************************
;;计算拷贝程序在Flash中的位置
;*****************************
ldr r2, =CopyProcBeg
sub r1, r2, r1
add r0, r0, r1
ldr r3, =CopyProcEnd
;;****************************
;;将拷贝程序复制到RAM中
;;****************************
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0
;;****************************
;;将拷贝程序复制到RAM中
;;****************************
ldr r3, TopOfROM
ldr pc, =CopyProcBeg
;***************************************************;
;本段将代码由实际烧入的地址拷贝到RO-BASE所指定的位置;
;只拷贝CopyProcEnd 以后的代码
;***************************************************;
CopyProcBeg
0
ldmia r0!, {r4-r11}
stmia r2!, {r4-r11}
cmp r2, r3
bcc %B0
CopyProcEnd
sub r1, r2, r3
sub r0, r0, r1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;******** INIT RAM DATA *******
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
ldr pc, GotoMain
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
;***********************************************
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
;***********************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -