微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM启动文件2440init.s分析

ARM启动文件2440init.s分析

时间:11-23 来源:互联网 点击:
;=========================================

; NAME: 2440INIT.S

; DESC: C start up codes

; Configure memory, ISR ,stacks

;Initialize C-variables

;=========================================

;注意:axd调试时,可以看到指令pc地址从0x30000000开始,这是因为ram的起始地址是0x30000000.

;并且如果从nand启动,则处理器自动把nand首部的4k字节,复制到ram中,然后pc跳到0x30000000,开始执行。

;此源文件通常包含一些宏定义和常量定义

;通用的《启动流程图》:

;入口->屏蔽所有中断,禁止看门狗->根据工作频率设置PLL寄存器->初始化存储控制相关寄存器

;->初始化各模式下的栈指针->设置缺省中断处理函数->将数据拷贝到RAM中,数据段清零

;->跳转到c语言main入口函数中

;GET伪指令用于将一个源文件包含到当前源文件中,并将被包含文件在当前位置进行汇编处理

;类似于c的include指令

;GET INLCUDE伪指令不能用来包含目标文件,INCBIN伪指令可以包含目标文件,

;被INCBIN伪指令包含的文件,不进行汇编处理,该执行文件或数据直接放入当前文件,

;编译器从INCBIN后边开始继续处理

GET option.inc ;定义芯片相关配置

GET memcfg.inc ;定义存储器配置

GET 2440addr.inc ;定义寄存器符号

;REFRESH寄存器[22]bit :SDRAM刷新模式 0 - auto refresh

; 1 - self refresh

;用于节电模式中,SDRAM自动刷新

BIT_SELFREFRESH EQU (1<22)

;Pre-defined constants

;模式预定义常量,给cpsr赋值,改变运行模式

USERMODE EQU 0x10

FIQMODE EQU 0x11

IRQMODE EQU 0x12

SVCMODE EQU 0x13

ABORTMODE EQU 0x17

UNDEFMODE EQU 0x1b

MODEMASK EQU 0x1f ;模式屏蔽位

NOINT EQU 0xc0 ;1100 0000,中断屏蔽掩码

;The location of stacks

;0x30000000 = 768M

;定义各模式下的堆栈常量,是一个递减栈,后边标上了各个栈的大小

UserStack EQU (_STACK_BASEADDRESS-0x3800) ; ~ 0x33ff4800 大小不定,跟堆大小相对应

;毕竟是用户态栈

SVCStack EQU (_STACK_BASEADDRESS-0x2800) ; ~ 0x33ff5800 4M

UndefStack EQU (_STACK_BASEADDRESS-0x2400) ; ~ 0x33ff5c00 1M

AbortStack EQU (_STACK_BASEADDRESS-0x2000) ; ~ 0x33ff6000 1M

IRQStack EQU (_STACK_BASEADDRESS-0x1000) ; ~ 0x33ff7000 4M

FIQStack EQU (_STACK_BASEADDRESS-0x0) ; ~ 0x33ff8000 4M

;处理器分为16位 32位两种工作状态程序的编译器也是分16位和32两种编译方式

;下面程序根据处理器工作状态确定编译器编译方式

;code16伪指令指示汇编编译器后面的指令为16位的thumb指令

;code32伪指令指示汇编编译器后面的指令为32位的arm指令

;Arm上电时处于ARM状态,故无论指令为ARM集或Thumb集,都先强制成ARM集,待init.s初始化完成后,再根据用

;户的编译配置转换成相应的指令模式。为此,定义变量THUMBCODE作为指示,跳转到main之前根据其值切换指令

;模式

;Check if tasm.exe(armasm -16 ...@ADS 1.0)is used.

;检测工作模式,根据CONFIG的数值,确定工作模式

;{CONFIG}应该来自于ADS环境,在本环境中设置是进入时在ARM环境下,没有设置ARM/THUMB混合环境

;关于是否设置混合编程,在环境设置选项里的ARM Assembler 选项下,由ATPCS -> ARM/Thumb interworking选

;项负责

;IF ELSE ENDIF指令

;[ 为 IF ; | 为 ELSE ; ] 为 ENDIF

GBLL THUMBCODE

[{CONFIG} = 16

THUMBCODE SETL {TRUE} ;如果设置了config,则允许thumb指令,

;但THUMBCODE为真并不表明以下就是thumb指令,只是允许

CODE32 ;code32表示以下是arm指令,在处理器刚开始时,必须以arm模式运行

| ;此处容易产生错觉,丢掉CODE32这一行

THUMBCODE SETL {FALSE}

]

;-------------------------------------------------------------------------------------------------

;bx是带状态切换的跳转指令,跳转到Rm指定的地址执行程序,若Rm的位[0]为1,则跳转时自动将CPSR的标志T

;T置位,即把目标地址的代码解释为Thumb代码;若Rm的位[0]为0,则跳转时自动将CPSR中的标志T复位,即把

;目标地址的代码解释为ARM代码

;定义两个宏,宏的作用:子函数返回(无条件,有条件)。

MACRO

MOV_PC_LR

[ THUMBCODE ;如果允许thumb指令,则需要根据最低位设置状态。

bx lr ;跳转,附带状态切换

|

mov pc,lr

]

MEND

MACRO

MOVEQ_PC_LR ;相等则跳转,相等与否由寄存器某些位确定,在此处,有其上一句的指令执行结果决定

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top