📄 startup.s
字号:
;*********************************************************************
;* Copyright (c) 2011-2012,李士伟
;* All rights reserved.
;*文 件 名:startup.s
;*描 述:LPC2103 ARM开发板启动代码
;*当前版本:V1.00
;*作 者:李士伟
;*创建日期:2011.09.24
;*********************************************************************
; 汇编代码使用到的与处理器相关的宏定义
GET arch\lpc2103\asm_cpu.inc
; 引出内部函数标号
EXPORT __Reset_Handler
; 引入外部函数标号
IMPORT kernelmain
IMPORT __SWI_Handler
IMPORT memcpy
IMPORT memset
; 引入各时域地址符号
IMPORT |Image$$ER_RW$$Base|
IMPORT |Load$$ER_RW$$Base|
IMPORT |Image$$ER_RW$$Limit|
IMPORT |Image$$ER_ZI$$Base|
IMPORT |Image$$ER_ZI$$Limit|
; 引出内部各模式栈基址、栈底标号
EXPORT __FIQ_Stack_Base
EXPORT __FIQ_Stack_Bottom
EXPORT __ABT_Stack_Base
EXPORT __ABT_Stack_Bottom
EXPORT __UND_Stack_Base
EXPORT __UND_Stack_Bottom
EXPORT __SVC_Stack_Base
EXPORT __SVC_Stack_Bottom
EXPORT __IRQ_Stack_Base
EXPORT __IRQ_Stack_Bottom
EXPORT __SYS_Stack_Base
EXPORT __SYS_Stack_Bottom
; 定义栈大小
AREA STACK, NOINIT, READWRITE, ALIGN = 3
; Fiq stack
__FIQ_Stack_Base
SPACE FIQ_Stack_Size
__FIQ_Stack_Bottom
; Abort stack
__ABT_Stack_Base
SPACE ABT_Stack_Size
__ABT_Stack_Bottom
; Undefine stack
__UND_Stack_Base
SPACE UND_Stack_Size
__UND_Stack_Bottom
; Supervisor stack
__SVC_Stack_Base
SPACE SVC_Stack_Size
__SVC_Stack_Bottom
; Irq stack
__IRQ_Stack_Base
SPACE IRQ_Stack_Size
__IRQ_Stack_Bottom
; System stack
__SYS_Stack_Base
SPACE SYS_Stack_Size
__SYS_Stack_Bottom
; 定义堆大小
AREA HEAP, NOINIT, READWRITE, ALIGN = 3
__Heap_Base
SPACE Heap_Size
__Heap_Limit
; 0x00000000 起始代码段
CODE32
PRESERVE8
AREA RESET, CODE, READONLY
ENTRY
; 向量表
Vectors
B __Reset_Handler
B __Und_Handler
B __SWI_Handler
B __PAbt_Handler
B __DAbt_Handler
NOP ; 保留向量
LDR PC, [PC, #-0x0FF0] ; 中断控制器的向量寄存器保存了ISR地址
; 快速中断 ,直接从向量处执行处理过程,加快响应过程
__FIQ_Handler
LDR SP, =__FIQ_Stack_Bottom
SUB LR, LR, #4
STMFD SP!, {R0-R7, LR}
; 这里添加FIQ处理代码
LDMFD SP!, {R0-R7, PC}^
; 未定义指令中断处理,返回下一条指令处执行
__Und_Handler
; LDR PC, =__Reset_Handler ; 复位重启
LDR SP, =__UND_Stack_Bottom
STMFD SP!, {R0-R12, LR}
; 这里添加处理代码
LDMFD SP!, {R0-R12, PC}^
; 预取指中止处理,返回中止指令处执行
__PAbt_Handler
; LDR PC, =__Reset_Handler
LDR SP, =__ABT_Stack_Bottom
; 返回中止指令处执行,注释该指令则从下一条指令执行
; SUB LR, LR, #4
STMFD SP!, {R0-R12, LR}
; 这里添加处理代码
LDMFD SP!, {R0-R12, PC}^
; 数据访问中止处理,返回中止处指令
__DAbt_Handler
; LDR PC, =__Reset_Handler
LDR SP, =__ABT_Stack_Bottom
SUB LR, LR, #8 ; LR -8 为数据访问中止处指令地址
STMFD SP!, {R0-R12, LR}
; 这里添加处理代码
LDMFD SP!, {R0-R12, PC}^
; 复位初始化各模式栈
__Reset_Handler
; 进入未定义指令异常模式,设置其栈指针
MSR CPSR_c, #UND32_MODE:OR:I_Bit:OR:F_Bit
LDR SP, =__UND_Stack_Bottom
; 进入中止异常模式,设置其栈指针
MSR CPSR_c, #ABT32_MODE:OR:I_Bit:OR:F_Bit
LDR SP, =__ABT_Stack_Bottom
; 进入快速中断模式,设置其栈指针
MSR CPSR_c, #FIQ32_MODE:OR:I_Bit:OR:F_Bit
LDR SP, =__FIQ_Stack_Bottom
; 进入中断模式,设置其栈指针
MSR CPSR_c, #IRQ32_MODE:OR:I_Bit:OR:F_Bit
LDR SP, =__IRQ_Stack_Bottom
; 进入管理模式,设置其栈指针
MSR CPSR_c, #SVC32_MODE:OR:I_Bit:OR:F_Bit
LDR SP, =__SVC_Stack_Bottom
; 进入系统模式,初始化目标板各外围部件
MSR CPSR_c, #SYS32_MODE:OR:I_Bit:OR:F_Bit
; 复制RW数据到内存
LDR SP, =__SYS_Stack_Bottom
LDR R0, =|Image$$ER_RW$$Base|
LDR R1, =|Load$$ER_RW$$Base|
LDR R2, =|Image$$ER_RW$$Limit|
SUB R2, R2, R0
BL memcpy
; 清零ER_ZI域
LDR R0, =|Image$$ER_ZI$$Base|
MOV R1, #0x00
LDR R2, =|Image$$ER_ZI$$Limit|
SUB R2, R2, R0
BL memset
; 启动C程序代码
LDR R0, =kernelmain
BX R0
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -