;/*****************************************************************************/
;/* STARTUP.S: Startup file for Philips LPC2000 */
;/*****************************************************************************/
;/* <<< Use Configuration Wizard in Context Menu >>> */
;/*****************************************************************************/
;/* This file is part of the uVision/ARM development tools. */
;/* Copyright (c) 2005-2007 Keil Software. All rights reserved. */
;/* This software may only be used under the terms of a valid, current, */
;/* end user licence from KEIL for a compatible version of KEIL software */
;/* development tools. Nothing else gives you the right to use this software. */
;/*****************************************************************************/
;/*
; * The STARTUP.S code is executed after CPU Reset. This file may be
; * translated with the following SET symbols. In uVision these SET
; * symbols are entered under Options – ASM – Define.
; *
; * REMAP: when set the startup code initializes the register MEMMAP
; * which overwrites the settings of the CPU configuration pins. The
; * startup and interrupt vectors are remapped from:
; * 0x00000000 default setting (not remapped)
; * 0x80000000 when EXTMEM_MODE is used
; * 0x40000000 when RAM_MODE is used
; *
; * EXTMEM_MODE: when set the device is configured for code execution
; * from external memory starting at address 0x80000000.
; *
; * RAM_MODE: when set the device is configured for code execution
; * from on-chip RAM starting at address 0x40000000.
; *
; * EXTERNAL_MODE: when set the PIN2SEL values are written that enable
; * the external BUS at startup.
; */
;
; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs.
; 处理器需界说七种作业方式
; 如下 7种界说的常量参数由来:
; 这7个常量界说为处理器 7种运转形式的参数,为7种“当时程序状况寄存器” CPSR 形式设置位 M[4:0]的值。
; 比方这儿的用户形式,CPSR的M[4:0], 设置为10000便是0x10.
; 同理其他.详见<<嵌入式体系开发与应用>>P71. CPSR设置很要害!
;
; ARM 有7种作业形式:
; User: 非特权形式,大部分使命履行在这种形式 正常程序履行的形式
; FIQ: 当一个高优先级(fast)中止发生时将会进入这种形式 高速数据传输和通道处理
; IRQ: 当一个低优先级(normal)中止发生时将会进入这种形式 一般的中止处理
; SVC: 用于操作体系的保护形式
; Abort: 当存取反常时将会进入这种形式 虚拟存储及存储保护
; Undef: 当履行未界说指令时会进入这种形式 软件仿真硬件协处理器
; System: 运用和User形式相同寄存器集的特权形式
;
; 这个7个值,将依据运转状况需求写到CPSR寄存器的第0,1,2,3,4,5位。
;
; ARM有7种运转状况,每一种状况的仓库指针寄存器(SP)都是独立的。
; 所以,关于程序中需求用的每一种处理器形式,
; 都要给SP界说一个仓库地址。
; 流程为:修正状况寄存器内的状况位,使处理器切换到需求的形式,然后给SP赋值。
; 需求留意的是:不要切换到User形式, 进行该形式下的仓库设置,由于进入User形式后就不能
; 再操作CPSR 返回到其他形式了。
; 先界说各种形式对应的CPSR寄存器M[4:0]的值,该值决议了进入何种形式。
; asm 中的 EQU 便是 C 语言中的 #define
Mode_USR EQU 0x10;用户形式
Mode_FIQ EQU 0x11;FIQ形式
Mode_IRQ EQU 0x12;IRQ形式
Mode_SVC EQU 0x13;超级用户形式
Mode_ABT EQU 0x17;停止形式
Mode_UND EQU 0x1B;未界说形式
Mode_SYS EQU 0x1F;体系形式
;中止屏蔽位 :也和CPSR寄存器的设置有关,这儿两位是制止/敞开快速中止和一般中止的设置.
; 设置IRQ和FIQ中止制止位,这两个值将被写到CPSR寄存器的第6位(FIQ)和第7位(IRQ).1是制止,0是答应。
I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled .IRQ中止操控位,当被置位时,IRQ中止被制止
F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled.FIQ中止操控位,当被置位时,FIQ中止被制止
; 状况屏蔽位
; EQU T_bit, 0x20 ;T位,置位时在Thumb形式下运转,清零时在ARM下运转
;//
;//
;//
;//
;//
;//
;//
;//
UND_Stack_Size EQU 0x00000000;未界说形式栈
SVC_Stack_Size EQU 0x00000008;超级用户形式栈
ABT_Stack_Size EQU 0x00000000;停止形式栈
FIQ_Stack_Size EQU 0x00000000;快速中止栈
IRQ_Stack_Size EQU 0x00000080;一般中止仓库
USR_Stack_Size EQU 0x00000400;用户形式界说栈
;//设置仓库巨细,
ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \
FIQ_Stack_Size + IRQ_Stack_Size);//总仓库长度
; 初始化栈空间
;//拓荒仓库段,界说为可读可写,不初始化内存单元或将内存写0,字节对齐 ,arm 字为32位
; 界说一个数据段,名为STACK,NOINIT – 只是保存内存单元,还没有写入值,可读写,ALIGN=3 – 按字节对齐。
AREA STACK, NOINIT, READWRITE, ALIGN=3
;//仓库巨细的设置,各公司写的发动代码有所不同,可是不影响全局,能够学习一些你以为比较简单的发动代码
;//,然后写自己的仓库地址和巨细设置程序.
; 分配内存,用户形式栈名为Stack_Mem,巨细为1024字节;分配 ISR_Stack_Size的内存空间,在USR_Stack之上?。
Stack_Mem SPACE USR_Stack_Size ;分配 0x00000400 长度空间,并置初始化为 0
__initial_sp SPACE ISR_Stack_Size ;请求仓库内存空间. SPACE 为伪指令
Stack_Top;//仓库段内容完毕, 在这儿放个标号,用来取得仓库顶部地址
; 下面一段转来的对话
; Hello,
; could anybody tell me the information of this code line
; Stack_Mem SPACE USR_Stack_Size
; __initial_sp SPACE ISR_Stack_Size
; Stack_Top
; __initial_sp is the whole stack size – thats clear. But which information has the last code line Stack_Top?
; And why is the ; USR_Stack_Size in comparison to the other Stack_Sizes so big?
; The user-stack is for your application, with all calls and auto variables.
; The ISR stack is just for interrupt service routines, and they normally dont consume a l
; ot of stack space – especially if you dont allow them to nest.
; Have you spent some time reading up on the ARM architecture?