📄 samboot.s
字号:
;/****************************************************************************************************************/
;/********************* Startup code for AT91SAM7S ***************************************************************/
;/ hotislandn@hotmail.com /
;/ WWW.MCUZONE.COM
;/
;/ Rev 0.3 /
;/****************************************************************************************************************/
MODUSR EQU 0x10
MODSYS EQU 0x1F
MODSVC EQU 0x13
MODABT EQU 0x17
MODUDF EQU 0x1B
MODIRQ EQU 0x12
MODFIQ EQU 0x11
IRQBIT EQU 0x80
FIQBIT EQU 0x40
RAMBASE EQU 0x00200000 ; AT SAM series, internal RAM base
RAMLEN EQU 0x00002000 ; S32 : 8KB RAM
;RAMLEN EQU 0x00204000 ; S64 : 16KB RAM
;/****************************************************************************************************************/
; Reserved RAM area
; If modified, the scatter load file also need to be updated!
; 1
; RAM vect size (768B)
; Include vectors and RAM code
VECTSIZE EQU 0x300 ; 驻留RAM的代码区域定为0x300字节
; 2
; Stack (1KB + 768B)
SvcStkSz EQU 1024 ; size of SVC stack
FiqStkSz EQU 128 ; size of FIQ stack
IrqStkSz EQU 256 ; size of IRQ stack
UdfStkSz EQU 16 ; size of UDF stack
AbtStkSz EQU 96 ; size of ABT stack
UsrStkSz EQU 16 ; size of USR stack
SysStkSz EQU 128 ; size of SYS stack
;/****************************************************************************************************************/
; startup code
EXPORT RESET
EXPORT SYSINIT
EXPORT DABTHANDLER
;/***********************************************************************/
PRESERVE8
AREA START, CODE, READONLY
CODE32
ENTRY
RESET
LDR PC,=SYSINIT ; Reset
B UDFHANDLER ; UNDEFINED
LDR PC,SWIHANDLER ; SWI
B PABTHANDLER ; PREFETCH ABORT
B DABTHANDLER ; DATA ABORT
B . ; RESERVED
LDR PC,_OS_CPU_IRQ_ISR ; IRQ
LDR PC,_OS_CPU_FIQ_ISR ; FIQ
;EXTERN vPortPreemptiveTick
;EXTERN OS_CPU_FIQ_ISR
IMPORT CPU_IRQ_ISR
_OS_CPU_IRQ_ISR
;DCD vPortPreemptiveTick
DCD CPU_IRQ_ISR
B .
_OS_CPU_FIQ_ISR
;DCD vPortPreemptiveTick
B .
UDFHANDLER
B .
;EXTERN vPortYieldProcessor
SWIHANDLER
;DCD vPortYieldProcessor
B .
PABTHANDLER
STR R14, [SP] ; keep the abort program point in Abort Stack(do not change SP_abt)
; return to the original mode
MRS R14, SPSR
; disable all interrupts
ORR R14, R14, #(IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf, R14
; check all the original mode's registers
; the abort point can be calculated use the LR_abt in Abort Stack
; check MC_ASR [0xFFFFFF04] & MC_AASR [0xFFFFFF08]
B .
DABTHANDLER
STR R14, [SP] ; keep the abort program point in Abort Stack(do not change SP_abt)
; return to the original mode
MRS R14, SPSR
; disable all interrupts
ORR R14, R14, #(IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf, R14
; check all the original mode's registers
; the abort point can be calculated use the LR_abt in Abort Stack
; check MC_ASR [0xFFFFFF04] & MC_AASR [0xFFFFFF08]
B .
;/****************************************************************************************************************/
SYSINIT
;设置各模式堆栈,关闭IRQ,FIQ
MRS R0,CPSR
BIC R0,R0,#0x1F
MOV R2,#RAMBASE
ADD R2,R2,#RAMLEN ; TOP of internal RAM
; Abort mode
ORR R1,R0,#(MODABT :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER ABT MODE
MOV sp,R2
SUB R2,R2,#AbtStkSz
; Undefine mode
ORR R1,R0,#(MODUDF :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER UDF MODE
MOV sp,R2
SUB R2,R2,#UdfStkSz
; FIQ mode
ORR R1,R0,#(MODFIQ :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER FIQ MODE
MOV sp,R2
SUB R2,R2,#FiqStkSz
; IRQ mode
ORR R1,R0,#(MODIRQ :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER IRQ MODE
MOV sp,R2
SUB R2,R2,#IrqStkSz
; SYS mode
ORR R1,R0,#(MODSYS :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER SYS MODE
MOV SP,R2
; SVC32 mode
ORR R1,R0,#(MODSVC :OR: IRQBIT :OR: FIQBIT)
MSR cpsr_cxsf,R1 ; ENTER SVC MODE
MOV sp,R2
SUB R2,R2,#SvcStkSz
; User mode
;ORR R1,R0,#(MODUSR :OR: IRQBIT :OR: FIQBIT)
;MSR CPSR_cxsf,R1 ; ENTER USR MODE
;MOV sp,R2
;SUB R2,R2,#UsrStkSz
;/****************************************************************************************************************/
; 禁止WDT
;/****************************************************************************************************************/
; 初始化代码.
IMPORT SAMInit
LDR R0,=SAMInit
MOV LR,PC
BX R0
;/****************************************************************************************************************/
IMPORT |Image$$ER_IROM1$$Base|
IMPORT |Image$$ER_IROM1$$Limit|
IMPORT |Load$$RAM_VECT$$Base|
IMPORT |Image$$RAM_VECT$$Base|
IMPORT |Image$$RAM_VECT$$Limit|
IMPORT |Image$$RAM_VECT$$Limit|
IMPORT |Load$$RW_IRAM1$$Base|
IMPORT |Image$$RW_IRAM1$$Base|
IMPORT |Image$$RW_IRAM1$$Limit|
IMPORT |Image$$RW_IRAM1$$ZI$$Base|
IMPORT |Image$$RW_IRAM1$$ZI$$Limit|
;/****************************************************/
; copy vector to RAM
LDR R0,=|Load$$RAM_VECT$$Base|
LDR R1,=|Image$$RAM_VECT$$Base|
LDR R2,=|Image$$RAM_VECT$$Limit|
1
CMP R1,R2
LDRLO R3,[R0],#4
STRLO R3,[R1],#4
BLO %B1
;/****************************************************/
; RW , ZI 初始化
LDR R0,=|Load$$RW_IRAM1$$Base|
LDR R1,=|Image$$RW_IRAM1$$Base|
LDR R2,=|Image$$RW_IRAM1$$ZI$$Base|
1
CMP R1,R2
LDRLO R3,[R0],#4
STRLO R3,[R1],#4
BLO %B1
MOV R3,#0
LDR R1,=|Image$$RW_IRAM1$$ZI$$Limit|
2
CMP R2,R1
STRLO R3,[R2],#4
BLO %B2
;/****************************************************************************************************************/
;/****************************************************************************************************************/
; 跳转到Main(!)
IMPORT Main
LDR R0,=Main
MOV LR,PC
BX R0
; if the code exit from Main, it will enter infinite loop below
loop_here
B .
;/****************************************************************************************************************/
; lib
__user_initial_stackheap
LDR R0, =|Image$$RW_IRAM1$$ZI$$Limit|
BX LR
;/****************************************************************************************************************/
PRESERVE8
AREA STACK, DATA, READWRITE, ALIGN=2
;^ (RAMBASE + RAMLEN - 512)
^ (RAMBASE )
AA # 256
SPACE 512
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -