📄 startup.s
字号:
;* COPYRIGHT (c) Notifier 1993-2004, All Rights Reserved
;*
;* 描述: LPC2xxx的启动模块,汇编代码
;*
;* 版本历史:
;*
;* 版本 作者 日期 修改内容
;* 1.0 王璀 2005-11-04 创建
;* 1.1 王璀 2006-01-17 标准化
;* 将UndefinedInst,PrefetchAbort
;* DataAbort,Fiq的处理函数移到启动模块的C代码中,
;* 这样可以在输出中察觉这些异常。
;* 1.2 王璀 2006-01-19 将外部总线寄存器的初始化移到启动模块的C代码中
;* 1.21 王璀 2006-03-15 简化了初始化的步骤以及堆和栈的配置方式
;==============================================================================
; 包含的头文件
;==============================================================================
INCLUDE startup_cfg.inc
;==============================================================================
; 本地宏及类型定义
;==============================================================================
; --- Standard definitions of mode bits and interrupt (I & F) flags in PSRs
Mode_USR EQU 0x10
Mode_FIQ EQU 0x11
Mode_IRQ EQU 0x12
Mode_SVC EQU 0x13
Mode_ABT EQU 0x17
Mode_UND EQU 0x1B
Mode_SYS EQU 0x1F ; available on ARM Arch 4 and later
I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled
F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled
;==============================================================================
; 外部符号声名
;==============================================================================
;IMPORT __use_two_region_memory
IMPORT __use_no_semihosting_swi
IMPORT ResetInitC
IMPORT __main
IMPORT Swi
IMPORT UndefinedInstHandler
IMPORT PrefetchAbortHandler
IMPORT DataAbortHandler
IMPORT FiqHandler
;==============================================================================
; 本地符号声名
;==============================================================================
EXPORT Reset
EXPORT bottom_of_heap
EXPORT top_of_stacks
;==============================================================================
; 代码
;==============================================================================
CODE32
AREA vectors,CODE,READONLY
ENTRY
; --- Exception vectors
Reset
LDR PC, ResetAddr
LDR PC, UndefinedInstAddr
LDR PC, SwiAddr
LDR PC, PrefetchAbortAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80 ; must be the checksum of other 7 vector instructions
LDR PC, [PC, #-0xff0]
LDR PC, FiqAddr
ResetAddr DCD ResetInitA
UndefinedInstAddr DCD UndefinedInstHandler
SwiAddr DCD Swi
PrefetchAbortAddr DCD PrefetchAbortHandler
DataAbortAddr DCD DataAbortHandler
Reserved DCD 0
IrqAddr DCD 0
FiqAddr DCD FiqHandler
;------------------------------------------------------------------------------
; 函数描述:RESET 复位入口
ResetInitA
; --- Initialize stack pointer registers
; Enter each mode in turn and set up the stack pointer
LDR r0, =top_of_stacks
MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit ; (0x11|0x80|0x40 = 0xD1)
LDR r1, =Offset_FIQ_Stack
SUB sp, r0, r1
MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit ; (0x12|0x80|0x40 = 0xD2)
LDR r1, =Offset_IRQ_Stack
SUB sp, r0, r1
MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit ; (0x17|0x80|0x40 = 0xD7)
LDR r1, =Offset_ABT_Stack
SUB sp, r0, r1
MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit ; (0x1B|0x80|0x40 = 0xDB)
LDR r1, =Offset_UND_Stack
SUB sp, r0, r1
MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit ; (0x13|0x80|0x40 = 0xD3)
LDR r1, =Offset_SVC_Stack
SUB sp, r0, r1
MSR CPSR_c, #Mode_SYS:OR:I_Bit:OR:F_Bit ; (0x1F|0x80|0x40 = 0xDF)
LDR r1, =Offset_SYS_Stack
SUB sp, r0, r1
; --- Initialize other things wrote in C language
BL ResetInitC
; --- Jump to the entry point of C program
B __main
;------------------------------------------------------------------------------
AREA Heap, DATA, NOINIT
; Create dummy variable used to locate bottom of heap
bottom_of_heap SPACE 1
;------------------------------------------------------------------------------
AREA Stacks, DATA, NOINIT
; Create dummy variable used to locate stacks in memory
top_of_stacks SPACE 1
;------------------------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -