先说一下启动代码的位置,启动代码是在板子加电后首先执行的。所以非要用汇编来写才行。要完成处理器模式的初始化、设置中断向量表、设置各个模式下的堆栈、初始某些变量从而把系统带到一个合适的运行环境中开始用户程序的运行。
;-------------------------------------------------------------------------------
;
; 本段设置处理器的模式相关常量
;
;-------------------------------------------------------------------------------
; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
; 定义常量,处理器的几种工作模式。
; ARM 有7种工作模式:
;
; User: 非特权模式,大部分任务执行在这种模式
; FIQ: 当一个高优先级(fast)中断产生时将会进入这种模式 高速数据传输和通道处理
; IRQ: 当一个低优先级(normal)中断产生时将会进入这种模式 通常的中断处理
; SVC: 用于操作系统的保护模式
; Abort: 当存取异常时将会进入这种模式
; Undef: 当执行未定义指令时会进入这种模式 软件仿真硬件协处理器
; System: 使用和User模式相同寄存器集的特权模式
;
; 这个值将被写到CPSR寄存器的第0,1,2,3,4,5位,以表示当前的状态。
Mode_USR
Mode_FIQ
Mode_IRQ
Mode_SVC
Mode_ABT
Mode_UND
Mode_SYS
; 设置IRQ和FIQ中断禁止位,这两个值将被写到CPSR寄存器的第6位(FIQ)和第7位(IRQ)。1是禁止,0是允许。
I_Bit
F_Bit
;---------------------------------------------------------------------------------------------------
; 本段将完成堆栈相关的常量,
;
;---------------------------------------------------------------------------------------------------
;
; 设置各个模式下的栈大小
;
UND_Stack_Size EQU
SVC_Stack_Size EQU
ABT_Stack_Size EQU
FIQ_Stack_Size EQU
IRQ_Stack_Size EQU
USR_Stack_Size EQU
ISR_Stack_Size EQU
; 初始化栈空间
; 定义一个数据段,名为STACK,NOINIT - 仅仅保留内存单元,还没有写入值,可读写,ALIGN=3 - 按字节对齐。
; 分配内存,用户模式栈名为Stack_Mem,大小为1024字节;异常模式堆栈__initial_sp 大小为128+8字节。
Stack_Mem
__initial_sp
Stack_Top
;
Heap_Size
;堆空间,其中__heap_base 与__heap_limit 这两个符号是给采用了MICROLIB的程序准备的。
__heap_base
Heap_Mem
__heap_limit
;-------------------------------------------------------------------------------------------
;
; 初始化 VPB总线的频率,Start的时候将分频因子设置为1,表示与CPU CLOCK相同
;-------------------------------------------------------------------------------------------
; VPBDIV 是VPB总线的分频因子
;
; VPBDIV definitions
VPBDIV
VPBDIV_SETUP
VPBDIV_Val
;-------------------------------------------------------------------------------------------
; 定义与锁相环相关的寄存器
; Phase Locked Loop (PLL) definitions
;-------------------------------------------------------------------------------------------
; 定义 PLL相关寄存器的基地址
PLL_BASE
; 用偏移量的方法定义其他寄存器
PLLCON_OFS
PLLCFG_OFS
PLLSTAT_OFS
PLLFEED_OFS
PLLCON_PLLE
PLLCON_PLLC
PLLCFG_MSEL
PLLCFG_PSEL
PLLSTAT_PLOCK
PLL_SETUP
PLLCFG_Val
;-------------------------------------------------------------------------------------
; 存储器加速模块
;
;-------------------------------------------------------------------------------------
; Memory Accelerator Module (MAM) definitions
MAM_BASE
MAMCR_OFS
MAMTIM_OFS
MAM_SETUP
MAMCR_Val
MAMTIM_Val
;---------------------------------------------------------------------------
; 外部存储器扩展
;
;---------------------------------------------------------------------------
; External Memory Controller (EMC) definitions
EMC_BASE
BCFG0_OFS
BCFG1_OFS
BCFG2_OFS
BCFG3_OFS
;// <e> External Memory Controller (EMC)
EMC_SETUP
BCFG0_SETUP EQU
BCFG0_Val
BCFG1_SETUP EQU
BCFG1_Val
BCFG2_SETUP EQU
BCFG2_Val
BCFG3_SETUP EQU
BCFG3_Val
;// </e> End of EMC
; External Memory Pins definitions
PINSEL2
PINSEL2_Val
;-------------------------------------------------------------------------------
; 前面都是对寄存器位置的声明,以下是具体代码。定义了一个代码段
;
;-------------------------------------------------------------------------------
;
; Area Definition and Entry Point
; Startup Code must be linked first at Address at which it expects to run.
;定义个名为RESET的代码段
; 中断向量表的异常入口共8条语句32字节,在链接的时候保证在0地址处
Vectors
;
Reset_Addr
Undef_Addr
SWI_Addr
PAbt_Addr
DAbt_Addr
IRQ_Addr
FIQ_Addr
;
Undef_Handler
SWI_Handler
PAbt_Handler
DAbt_Handler
IRQ_Handler
FIQ_Handler
;-----------------------------------------------------------------------------------
;
;
;-----------------------------------------------------------------------------------
; Reset Handler
Reset_Handler
;设置扩展存储的引脚
; Setup External Memory Pins
;设置扩展存储器的控制寄存器,分别检测几个bank是否存在,分别进行设置
; Setup External Memory Controller
;设置VPB总线的分频因子,这里分频因子被设置为0
; Setup VPBDIV
;设置锁相环
; Setup PLL
; Configure and Enable PLL
;等待PLL稳定
; Wait until PLL Locked
PLL_Loop
; Switch to PLL Clock
;-----------------------------------------------------------------------------
; 存储器加速模块
; Setup MAM
;--------------------------------------------------------------------------
;内存映射,结构有点复杂额,总之就是根据不同的情况去设置存储器映射控制寄存器,
; 00 Boot装载,中断向量从BootBlock重新映射
; 01 用户FLASH模式,中断向量不重新映射,就在FLASH里面
; 10 用户RAM模式,中断向量从静态RAM重新映射
; 11 用户外部存储器模式,中断向量从外部存储器重新映射。
; Memory Mapping (when Interrupt Vectors are in RAM)
;----------------------------------------------------------------------------
MEMMAP
; Initialise Interrupt System
; ...
;为处理器的每种处理模式初始化栈空间
; Setup Stack for each mode
; Enter Undefined Instruction Mode and set its Stack Pointer
器进入了未定义模式
; Enter Abort Mode and set its Stack Pointer
; Enter FIQ Mode and set its Stack Pointer
; Enter IRQ Mode and set its Stack Pointer
; Enter Supervisor Mode and set its Stack Pointer
; 进入用户模式,并且设置栈空间指针
; Enter User Mode and set its Stack Pointer
;进入C代码的执行,为C代码的执行创造一个运行环境
; Enter the C code
; User Initial Stack & Heap
__user_initial_stackheap