📄 startup.s
字号:
BEQ RESULTFALSE
ADDNE R4,R4,#4
CMP R4,#64
BCC FINDLOOP ;/* 查询优先级结束,可设置中断 */
LDR R0,=VICVectAddr0 ;/* 进行参数设置工作 */
STR R3,[R0,R2, LSL #2] ;/* 存储服务地址 */
LDR R0,=VICIntEnable
MOV R4,#1
MOV R3,R4,LSL R1
STR R3,[R0] ;/* 使能中断 */
LDR R0,=VICIntSelect
LDR R5,[R0]
BIC R4,R5,R3
STR R4,[R0] ;/* 选择IRQ中断 */
ORR R1, R1, #0x20
LDR R0,=VICVectCntl0
STR R1, [R0,R2,LSL #2] ;/* 打开中断通道 */
B RESULTTRUE
SYSIRQVicGet ;/* IRQ中断状态获取 */
CMP R1, #32 ;/* if(通道号 >=32) return FALSE */
BCS RESULTFALSE
MOV R4,#0 ;/* 开始循环查找 */
LDR R0,=VICVectCntl0
ORR R5,R1,#0X20
SETLOOP
CMP R4,#64
BCS RESULTFALSE
LDR R3,[R0,R4]
CMP R3,R5
ADDNE R4,R4,#4
BNE SETLOOP
MOV R4,R4,LSR #2
STR R4,[R2]
STR R1,[R2,#4]
LDR R0,=VICVectAddr0
LDR R3,[R0,R4,LSL #2]
STR R3,[R2,#8]
B RESULTTRUE
SYSIRQVicClr ;/* IRQ中断清除函数 */
CMP R1, #32 ;/* if(通道号 >=32) return FALSE */
BCS RESULTFALSE
MOV R4,#0
LDR R0,=VICVectCntl0
ORR R2,R1,#0x20
CLRLOOP
CMP R4,#64
BCS RESULTFALSE
LDR R3,[R0,R4]
CMP R3,R2
ADDNE R4,R4,#4
BNE CLRLOOP
LDR R0,=VICIntEnClr
MOV R3,#1
MOV R3,R3,LSL R1
STR R3,[R0]
LDR R0,=VICVectCntl0
MOV R1,#0
STR R1,[R0,R4]
LDR R0,=VICVectAddr0
STR R1,[R0,R4]
B RESULTTRUE
;/*
; * 非向量中断管理,调用该函数原形见IRQManage.h
; */
SYSIRQVicDefSet ;/* 非向量IRQ中断设置 */
CMP R1, #32 ;/* if(通道号 >=32) return FALSE */
BCS RESULTFALSE
LDR R0,=VICDefVectAddr
LDR R4,[R0]
CMP R4,#0
BNE RESULTFALSE
STR R2,[R0] ;/* 设置非向量中断服务程序地址 */
MOV R4,#1
MOV R1,R4,LSL R1
LDR R0,=VICIntEnable
STR R1,[R0] ;/* 设置中断允许 */
LDR R0,=VICIntSelect
LDR R3,[R0]
BIC R3,R3,R1
STR R3,[R0] ;/* 设置为IRQ */
B RESULTTRUE
SYSIRQVicDefClr ;/* 非向量IRQ中断清除 */
CMP R1, #32 ;/* if(通道号 >=32) return FALSE */
BCS RESULTFALSE
LDR R0,=VICDefVectAddr
LDR R4,[R0]
CMP R4,#0
BEQ RESULTFALSE
MOV R4,#0
STR R4,[R0] ;/* 设置非向量中断服务程序地址 */
MOV R4,#1
MOV R1,R4,LSL R1
LDR R0,=VICIntEnClr
STR R1,[R0] ;/* 设置中断允许 */
B RESULTTRUE
;/*
; * 设置系统FIQ中断开关,具体使用看FIQ.H头文件描述
; */
SYSFIQSet ;/* FIQ中断设置 */
MOV R3,#0
LDR R0,=VICIntSelect
LDR R2,[R0]
MOV R0,#1
MOV R1,R0,LSL R1
CMP R2,#0 ;/* 判断是否已经设置了FIQ */
BNE RESULTFALSE
LDR R0,=VICIntSelect
STR R1,[R0]
LDR R0,=VICIntEnable
STR R1,[R0]
B RESULTTRUE
SYSFIQClr ;/* FIQ中断清除 */
MOV R3,#0
LDR R2,[R3,#-0xff4]
MOV R0,#1
MOV R1,R0,LSL R1
CMP R2,#0
BEQ RESULTFALSE
BICNE R2,R2,R1
STRNE R2,[R3,#-0xff4]
STRNE R1,[R3,#-0xfec]
CMP R2,#0
BEQ RESULTTRUE
RESULTFALSE ;/* 失败返回 */
MSR CPSR_c,#(SYS32Mode | NoInt | NoFIQ )
LDMFD SP!,{R4-R6}
MSR CPSR_c,#(SVC32Mode | NoInt | NoFIQ )
MOV R0,#-1
MOVS PC, LR
RESULTTRUE ;/* 成功返回 */
MSR CPSR_c,#(SYS32Mode | NoInt | NoFIQ )
LDMFD SP!,{R4-R6}
MSR CPSR_c,#(SVC32Mode | NoInt | NoFIQ )
MOV R0,#1
MOVS PC, LR
;/********************************************************************************************************
;** Function name: InitStack
;** Descriptions: 初始化堆栈
;** Input parameters: NONE
;** Output parameters: NONE
;** Returned value: NONE
;********************************************************************************************************/
InitStack
MOV R0, LR
;Build the SVC stack
;设置管理模式堆栈
MSR CPSR_c, #0xd3
LDR SP, StackSvc
;Build the IRQ stack
;设置中断模式堆栈
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;Build the FIQ stack
;设置快速中断模式堆栈
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;Build the DATAABORT stack
;设置中止模式堆栈
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;Build the UDF stack
;设置未定义模式堆栈
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;Build the User stack
;设置用户模式堆栈
MSR CPSR_c, #0xd0
LDR SP, =StackUsr
MOV PC, R0
;/********************************************************************************************************
;** Function name: ClrVic
;** Descriptions: 清楚中断向量表残留设置,主要方便仿真调试
;** Input parameters: NONE
;** Output parameters: NONE
;** Returned value: NONE
;********************************************************************************************************/
ClrVic
MVN R0,#0
LDR R1,=VICIntEnClr
STR R0,[R1]
MOV R0,#0
LDR R1,=VICIntSelect
STR R0,[R1]
MOV R2,#0
LDR R1,=VICVectAddr0
ClrADDRLoop
STR R0,[R1,R2]
ADD R2,R2,#4
CMP R2,#64
BCC ClrADDRLoop
MOV R2,#0
LDR R1,=VICVectCntl0
ClrCntlLoop
STR R0,[R1,R2]
ADD R2,R2,#4
CMP R2,#64
BCC ClrCntlLoop
LDR R1,=VICDefVectAddr
STR R0,[R1]
LDR R1,=VICVectAddr
STR R0,[R1]
MOV PC,LR
;/********************************************************************************************************
;** Function name: ResetInit
;** Descriptions: 复位入口
;** Input parameters: NONE
;** Output parameters: NONE
;** Returned value: NONE
;********************************************************************************************************/
ResetInit
;/*
; * 初始化中断进入次数
; */
LDR R0,=IRQ_EnterSum
MOV R1,#1
STR R1,[R0]
BL ClrVic
BL InitStack ;初始化堆栈 Initialize the stack
BL TargetResetInit ;目标板基本初始化 Initialize the target board
B __main ;跳转到c语言入口 Jump to the entry point of C program
;/********************************************************************************************************
;** Function name: __user_initial_stackheap
;** Descriptions: 库函数初始化堆和栈
;** Input parameters: NONE
;** Output parameters: NONE
;** Returned value: NONE
;********************************************************************************************************/
__user_initial_stackheap
LDR r0,=bottom_of_heap
; LDR r1,=StackUsr
MOV pc,lr
StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4
;/********************************************************************************************************
; 定义堆栈空间
;********************************************************************************************************/
AREA MyStacks, DATA, NOINIT, ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;Stack spaces for Administration Mode 管理模式堆栈空间
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;Stack spaces for Interrupt ReQuest Mode 中断模式堆栈空间
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;Stack spaces for Fast Interrupt reQuest Mode 快速中断模式堆栈空间
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend Mode 中止义模式堆栈空间
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 未定义模式堆栈
AREA Heap, DATA, NOINIT
bottom_of_heap SPACE 1
AREA Stacks, DATA, NOINIT
StackUsr
END
;/********************************************************************************************************
; END FILE
;********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -