📄 startup.s
字号:
;/*****************************************************************************/
;/* STARTUP.S: Philips LPC214x家族微控制器的初始化文件 */
;/* 作者:焦进星 */
;/* 时间:2008年月1月22日 */
;/* ARM初学 */
;/*****************************************************************************/
;/*****************************************************************************/
;/* 标准模式定义 */
;/*****************************************************************************/
Mode_USR EQU 0x10 ;//正常用户模式,程序正常执行模式
Mode_FIQ EQU 0x11 ;//快速中断模式,支持高速数据传送或通道处理
Mode_IRQ EQU 0x12 ;//普通中断模式,处理普通中断
Mode_SVC EQU 0x13 ;//系统保护模式,处理软件中断SWI
Mode_ABT EQU 0x17 ;//中止模式,处理存储器故障,实现虚拟存储器和存储器保护
Mode_UND EQU 0x1B ;//未定义模式,支持硬件协处理器和软件仿真
Mode_SYS EQU 0x1F ;//系统模式,运行特权操作系统任务
;/*****************************************************************************/
;/* 标志位定义 */
;/*****************************************************************************/
I_Bit EQU 0x80 ;//当 I bit 置位, IRQ是关闭的
F_Bit EQU 0x40 ;//当 F bit 置位, FIQ是关闭的
;/*****************************************************************************/
;/* 堆栈定义 */
;/*****************************************************************************/
;//各模式堆栈大小定义
USR_Stack_Size EQU 0x00000400 ;这部分的堆栈内存空间也用于系统模式
SVC_Stack_Size EQU 0x000000ff
FIQ_Stack_Size EQU 0x0000000f
IRQ_Stack_Size EQU 0x000000ff
UND_Stack_Size EQU 0x00000000
ABT_Stack_Size EQU 0x00000000
;//总堆栈大小定义
Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \
FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)
;//各模式堆栈使用的内存空间定义
;//段名 初始化为0 可读写 8字对齐
AREA STACK, NOINIT, READWRITE, ALIGN=3
USR_Stack_Mem SPACE USR_Stack_Size
SVC_Stack_Mem SPACE SVC_Stack_Size
FIQ_Stack_Mem SPACE FIQ_Stack_Size
IRQ_Stack_Mem SPACE IRQ_Stack_Size
UND_Stack_Mem SPACE UND_Stack_Size
ABT_Stack_Mem SPACE ABT_Stack_Size
Stack_Mem EQU USR_Stack_Mem
;//各模式堆栈栈顶定义
USR_Stack_Top EQU USR_Stack_Mem+USR_Stack_Size
SVC_Stack_Top EQU SVC_Stack_Mem+SVC_Stack_Size
FIQ_Stack_Top EQU FIQ_Stack_Mem+FIQ_Stack_Size
IRQ_Stack_Top EQU IRQ_Stack_Mem+IRQ_Stack_Size
UND_Stack_Top EQU UND_Stack_Mem+UND_Stack_Size
ABT_Stack_Top EQU ABT_Stack_Mem+ABT_Stack_Size
Stack_Top EQU ABT_Stack_Top
;/*****************************************************************************/
;/* 堆定义 */
;/*****************************************************************************/
;//堆大小定义
Heap_Size EQU 0x00000000
;//堆使用的内存空间定义
;//段名 初始化为0 可读写 8字对齐
AREA HEAP, NOINIT, READWRITE, ALIGN=3
Heap_Mem SPACE Heap_Size
;/*****************************************************************************/
;/* 入口 */
;/*****************************************************************************/
PRESERVE8
CODE32
;//段名 代码 只读
AREA RESET, CODE, READONLY
;ENTRY ;入口
Vectors LDR PC, Reset_Addr ;// 跳转
LDR PC, Undef_Addr
LDR PC, SWI_Addr
LDR PC, PAbt_Addr
LDR PC, DAbt_Addr
NOP ;// 缺省中断
LDR PC, [PC, #-0x0FF0] ;// 普通中断入口
LDR PC, FIQ_Addr
Reset_Addr DCD Reset_Handler
Undef_Addr DCD Undef_Handler
SWI_Addr DCD SWI_Handler
PAbt_Addr DCD PAbt_Handler
DAbt_Addr DCD DAbt_Handler
DCD 0 ;// 缺省地址
FIQ_Addr DCD FIQ_Handler
;//由用户定义
IMPORT FIQHandler
Undef_Handler B Undef_Handler ;// 跳转
SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
FIQ_Handler B FIQHandler
EXPORT Reset_Handler ;// 输出 Reset_Handler
Reset_Handler
;/*****************************************************************************/
;/* 初始化各模式堆栈 */
;/*****************************************************************************/
; Enter Abort Mode and set its Stack Pointer
LDR R0, =ABT_Stack_Top
MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
MOV SP, R0
; Enter Undefined Instruction Mode and set its Stack Pointer
LDR R0, =UND_Stack_Top
MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
MOV SP, R0
; Enter IRQ Mode and set its Stack Pointer
LDR R0, =IRQ_Stack_Top
MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
MOV SP, R0
; Enter FIQ Mode and set its Stack Pointer
LDR R0, =FIQ_Stack_Top
MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
MOV SP, R0
; Enter Supervisor Mode and set its Stack Pointer
LDR R0, =SVC_Stack_Top
MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
MOV SP, R0
;/*****************************************************************************/
;/* 进入C代码 */
;/*****************************************************************************/
IMPORT __main
LDR R0, =__main
BX R0
;/*****************************************************************************/
;/* 初始化堆和栈 */
;/*****************************************************************************/
AREA |.text|, CODE, READONLY
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, = (Stack_Mem + USR_Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
END
;/*****************************************************************************/
;/* END OF FILE */
;/*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -