arm启动代码详细分析

发布者:星光闪耀最新更新时间:2016-04-20 来源: eefocus关键字:ARM  启动代码 手机看文章 扫描二维码
随时随地手机看文章
arm启动代码详细分析
 
所谓启动代码,就是处理器在启动的时候执行的一段代码,主要任务是初始化处理器模式,设置堆栈,初始化变量等等.由于以上的操作均与处理器体系结构和系统配置密切相关,所以一般由汇编来编写.
  具体到S64,启动代码分成两部分,一是与ARM7TDMI内核相关的部分,包括处理器各异常向量的配置,各处理器模式的堆栈设置,如有必要,复制向量到RAM,以便remap之后处理器正确处理异常,初始化数据(包括RW与ZI),最后跳转到Main.二是与处理器外部设备相关的部分,这和厂商的联系比较大.虽然都采用了ARM7TDMI的内核,但是不同的厂家整合了不同的片上外设,需要不同的初始化,其中比较重要的是初始化WDT,初始化各子系统时钟,有必要的话,进行remap.这一部分与一般控制器的初始化类似,因此,本文不作重点描述.
  在进行分析之前,请确认如下相关概念:
S64片上FLASH起始于0x100000,共64kB,片上RAM起始于0x200000,共16kB.
S64复位之后,程序会从0开始执行,此时FLASH被映射到0地址,因此,S64可以取得指令并执行.显然,此时还是驻留在0x100000地址.如果使用remap命令,将会把RAM映射到0地址,同样的这时0地址的内容也只是RAM的镜像.
S64的FLASH可以保证在最差情况时以30MHz进行单周期访问,而RAM可以保证在最大速度时的单周期访问.
OK,以下开始分析启动代码.

一,处理器异常
S64将异常向量至于0地址开始的几个直接,这些是必需要处理的.由于复位向量位于0,也需要一条跳转指令.具体代码如下:
RESET
B SYSINIT ; Reset
B UDFHANDLER ; UNDEFINED
B SWIHANDLER ; SWI
B PABTHANDLER ; PREFETCH ABORT
B DABTHANDLER ; DATA ABORT
B . ; RESERVED
B VECTORED_IRQ_HANDLER
B . ; ADD FIQ CODE HERE

UDFHANDLER
B .

SWIHANDLER
B .

PABTHANDLER
B .

DABTHANDLER
B .

请注意,B指令经汇编后会替换为当前PC值加上一个修正值(+/-),所以这条指令是代码位置无关的,也就是不管这条指令是在0地址还是在 0x100000执行,都能跳转到指定的位置,而LDR PC,=???将向PC直接装载一个标号的值,请注意,标号在编译过后将被替换为一个与RO相对应的值,也就是说,这样的指令无论在哪里执行,都只会跳转到一个指定的位置.下面举一个具体的例子来说明两者的区别:
假定有如下程序:
RESET
B INIT 或者 LDR PC,=INIT


INIT

其中RESET为起始时的代码,也就是这条代码的偏移为0,设INIT的偏移量为offset.如果将这段程序按照RO=0x1000000编译, 那么B INIT可理解为ADD PC, PC, #offset,而LDR PC,=INIT可被理解为 MOV PC,#(RO+offset) .显然当系统复位时,程序从0开始运行,而0地址有FLASH的副本,执行B INIT将把PC指向位于0地址处的镜像代码位置,也即INIT;如果执行LDR PC,=INIT将会将PC直接指向位于FLASH中的原始代码.因此以上两者都能正确运行.下面将RO设置为0x200000,编译后生成代码,还是得烧写到FLASH中,也就是还是0x100000,系统复位后从0地址执行,还是FLASH的副本,此时执行B INIT,将跳到副本中的INIT位置执行,此处有对应的代码;但是如果执行LDR PC,=INIT,将向PC加载0x200000+offset,这将使得PC跳到RAM中,而此时由于代码没有复制,RAM中的指定位置并没有代码,程序无法运行.

二,处理器模式
ARM的处理器可工作于多种模式,不同模式有不同的堆栈 ,以下设置各模式及其堆栈.
预定义一些参数:
MODUSR EQU 0x10
MODSYS EQU 0x1F
MODSVC EQU 0x13
MODABT EQU 0x17
MODUDF EQU 0x1B
MODIRQ EQU 0x12
MODFIQ EQU 0x11

IRQBIT EQU 0x80
FIQBIT EQU 0x40

RAMEND EQU 0x00204000 ; S64 : 16KB RAM

VECTSIZE EQU 0x100 ;

UsrStkSz EQU 8 ; size of USR stack
SysStkSz EQU 128 ; size of SYS stack
SvcStkSz EQU 8 ; size of SVC stack
UdfStkSz EQU 8 ; size of UDF stack
AbtStkSz EQU 8 ; size of ABT stack
IrqStkSz EQU 128 ; size of IRQ stack
FiqStkSz EQU 16 ; size of FIQ stack

修改这些值即可修改相应模式堆栈的尺寸.
以下为各模式代码:
SYSINIT
;
MRS R0,CPSR
BIC R0,R0,#0x1F

MOV R2,#RAMEND
ORR R1,R0,#(MODSVC :OR: IRQBIT :OR: FIQBIT)
MSR cpsr_cxsf,R1 ; ENTER SVC MODE
MOV sp,R2
SUB R2,R2,#SvcStkSz

ORR R1,R0,#(MODFIQ :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER FIQ MODE
MOV sp,R2
SUB R2,R2,#FiqStkSz

ORR R1,R0,#(MODIRQ :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER IRQ MODE
MOV sp,R2
SUB R2,R2,#IrqStkSz

ORR R1,R0,#(MODUDF :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER UDF MODE
MOV sp,R2
SUB R2,R2,#UdfStkSz

ORR R1,R0,#(MODABT :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER ABT MODE
MOV sp,R2
SUB R2,R2,#AbtStkSz

;ORR R1,R0,#(MODUSR :OR: IRQBIT :OR: FIQBIT)
;MSR CPSR_cxsf,R1 ; ENTER USR MODE
;MOV sp,R2
;SUB R2,R2,#UsrStkSz

ORR R1,R0,#(MODSYS :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER SYS MODE
MOV sp,R2 ;

三,初始化变量
编译完成之后,连接器会生成三个基本的段,分别是RO,RW,ZI,并会在image中顺序摆放.显然,RW,ZI在运行开始时并不位于指定的RW位置,因此必须初始化
LDR R0,=|Image$$RO$$Limit|
LDR R1,=|Image$$RW$$Base|
LDR R2,=|Image$$ZI$$Base|
1
CMP R1,R2
LDRLO R3,[R0],#4
STRLO R3,[R1],#4
BLO �

MOV R3,#0
LDR R1,=|Image$$ZI$$Limit|
2
CMP R2,R1
STRLO R3,[R2],#4
BLO �

四,复制异常向量
由于代码于RAM运行时,有明显的速度优势,而且变量可以动态配置,因此可以通过remap将RAM映射到0,使得出现异常时ARM从RAM中取得向量.
IMPORT |Image$$RO$$Base|
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$RW$$Limit|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|


COPY_VECT_TO_RAM
LDR R0,=|Image$$RO$$Base|
LDR R1,=SYSINIT
LDR R2,=0x200000 ; RAM START
0
CMP R0,R1
LDRLO R3,[R0],#4
STRLO R3,[R2],#4
BLO �

这段程序将SYSINIT之前的代码,也就是异常处理函数,全部复制到RAM中, 这就意味着不能将RW设置为0x200000,这样会使得向量被冲掉.

四,在RAM中运行
如果有必要,且代码足够小,可以将代码置于RAM中运行,由于RAM中本身没有代码,就需要将代码复制到RAM中:
COPY_BEGIN
LDR R0,=0x200000
LDR R1,=RESET ; =|Image$$RO$$Base|
CMP R1,R0 ;
BLO COPY_END ;

ADR R0,RESET
ADR R2,COPY_END
SUB R0,R2,R0
ADD R1,R1,R0

LDR R3,=|Image$$RO$$Limit|
3
CMP R1,R3
LDRLO R4,[R2],#4
STRLO R4,[R1],#4
BLO �

LDR PC,=COPY_END

COPY_END
程序首先取得RESET的连接地址,判断程序是否时是在RAM中运行,方法是与RAM起始地址比较,如果小于,那么就跳过代码复制.
在复制代码的时候需要注意,在这段程序结束之前的代码没有必要复制,因为这些代码都已经执行过了,所以,先取得COPY_END,作为复制起始地址,然后计算其相对RESET的偏移,然后以RO的值加上这个偏移,就是复制目的地的起始地址,然后开始复制.

五,开始主程序
以上步骤完成,就可以跳转到main运行
IMPORT Main

LDR PC,=Main
B .
六,器件初始化
主程序首先要进行器件的初始化,对S64而言,应该先初始化WDT,因为默认情况下,WDT是打开的,然后是各设备的时钟分配,最后应该remap

关键字:ARM  启动代码 引用地址:arm启动代码详细分析

上一篇:STM32之NVIC
下一篇:关于LPC1758平台上I2C EEPROM 调试总结

推荐阅读最新更新时间:2024-03-16 14:51

ARM芯片选择的一般原则
1.1 ARM芯核 如果希望使用WinCE或Linux等操作系统以减少软件开发时间,就需要选择ARM720T以上带有MMU(memory management unit)功能的ARM芯片,ARM720T、StrongARM、ARM920T、ARM922T、ARM946T都带有MMU功能。而 ARM7TDMI没有MMU,不支持Windows CE和大部分的Linux, 但目前有uCLinux等少数几种Linux不需要MMU的支持。 1.2 系统时钟控制器 系统时钟决定了ARM芯片的处理速度。ARM7的处理速度为0.9MIPS/MHz,常见的ARM7芯片系统主时钟为20MHz- 133MHz,ARM9的处理速度为1.1MI
[单片机]
对正确的任务设计正确的处理器——解析ARM的处理器架构
日前,ARM处理器部门技术总监Peter Greenhalgh介绍了ARM处理器架构,详细介绍了为何Cortex-A、R与M可以胜任不同市场。以下是文章详情 在ARM,我们认为应该使用适合的处理器来执行对应的任务(the right processing for the right tasks),我们也是一直致力于研发最适合的处理器,来面对更多日常的应用。如果将ARM处理器与其他公司的处理器作比较,就会看到ARM是最合适的处理器。我们也一直在针对不同的任务,设计合适的处理器。接下来我会跟大家介绍一下每个不同的处理器如何体现 使用适合的处理器来执行对应的任务 这一理念。 ARM处理器现在分成了三个系列,从家族来讲是A系列、R系列和
[手机便携]
基于ARM的Linux系统移植的方法
Linux具有源代码开放、效率高、可裁剪等优点,在嵌入式系统的开发中具有广泛的应用。文章介绍了嵌入式Linux操作系统、移植目标平台SBC2410及Linux内核源代码的目录结构,分析了Linux移植到SBC2410平台的实现过程,阐述了Linux内核、u-boot的裁剪和编译以及根文件系统的制作过程,最后在SBC2410平台上成功移植了嵌入式Linux系统。 嵌入式系统是一个专用的计算机系统。该系统以计算机技术为基础,软硬件可裁减,但对功能、可靠性、成本等都有严格的要求。今天,一些专用系统需要处理大量的信息,由于传统的计算机系统很难实现硬件可裁减,因而已经不能满足专用系统的需要。伴随着我国汽车、家电等产业的快速发展,
[单片机]
基于<font color='red'>ARM</font>的Linux系统移植的方法
智能机专利授权收入增加ARM 4Q获利胜预期
     英国处理器架构研发公司安谋(ARM Holdings)最新发布优于预期的2014年第4季获利表现,并预期包括苹果(Apple)iPhone 6等智慧型手机销售增加,将推升该公司的专利授权费用收入。   根据资料显示,基于该公司架构的微处理器晶片在2014年第4季产量超过35亿颗,使得安谋税前利润超过1.19亿英镑(约合1.82亿美元)、年增25%,优于分析师们此前平均预估的1.13亿英镑。当季收入则年增19%、至2.26亿英镑,授权金(licensing)及权利金(royalties)分占各半。   安谋财务长Tim Score表示,获利成长主要受惠于新技术的专利授权强劲推动,该技术目前主要用于部分高阶智慧
[手机便携]
关于arm汇编中的align
经常会看到arm-linux汇编中有如下的指令: .align n 它的含义就是使得下面的代码按一定规则对齐,.align n 指令的对齐值有两种方案,n 或 2^n ,各种平台最初的汇编器一般都不是gas,采取方案1或2的都很多,gas的目标是取代原来的汇编器,必然要保持和原来汇编器的兼容,因此在gas中如何解释 .align指令会显得有些混乱,原因在于保持兼容。 arm-linu是按照2^n的方案对齐的,需要说明的是这个对齐和ld-script里的对齐不同,不是一会事。下面的英文就不同平台的对齐进行了说明: 版本2.11.92.0.12的gas的info(Mandrake 8.2上的)这样说: The way the re
[单片机]
ARM2210的智能移动机器人人机界面设计
引言   嵌入式系统以其高性能、低功耗、低成本的优点,已经在很大程度上改变了人们的生活。如,MP3播放器、智能手机、数码相机产品等已经渗入人们生活的各个方面。随着液晶显示技术的不断进步,以及图形用户界面GUI (Graphical User Interface)技术的广泛应用,人机界面也越来越友好。它能为移动机器人的运动控制提供直观的路径图形、数据参数等。本文介绍了一种以嵌入式微处理器LPC2210为基础,应用ZLG/GUI软件包设计移动机器人人机界面的方法。   我们设计开发的智能移动机器人是一个以PC104嵌入式微机为中心处理器, TMS320F2812为运动控制器,超声波传感器作为避障的集合环境感知、动态决策与规划、行为控
[嵌入式]
ARM裸机】 - 重定位
1、 重定位的目的 对于2440上电后,分两种情况,从nor启动,直接从nor作为0地址,开始在nor中运行。从nand启动,拷贝前4K到片内SRAM中。当代码大于4K的时候,我们需要重定位代码到更大的SDRAM中去运行。从nor运行时,由于nor只可读而不可以修改nor中的内容,就会导致一些全局变量,在代码中无法修改,此时我们可以将全局变量重定位(指定链接地址)到SDRAM中,这样我就可以nor中运行,然后对全局变量进行修改。 总结来说:重定位就是代码的存储地址和运行地址不一致,我们需要把代码拷贝到运行地址处。可以重定位所有代码,也可以重定位数据段等。由于代码存在flash中,一般可在链接脚本中加入AT()来指
[单片机]
【<font color='red'>ARM</font>裸机】 - 重定位
基于ARM的PWM模块的超声波检测系统的设计
  近年来以微电子学和计算机技术为基础的信息技术飞速发展,超声无损检测仪器也得到了前所未有的发展动力,为了提高检测的可靠性和提高检测效率,研制数字化、智能化、自动化、图像化的超声仪是当今无损检测领域发展的一个重要趋势。而传统的超声波检测仪存在准确性差、精度低、体积大、功耗大、人机界面不友好等问题。而超声波发射与控制电路正是在一种基于ARM的超声波检测系统的基础上,以ARM微控制器为核心,使用C语言编程,方便地实现了发射频率与激励电压脉冲幅度的调节。    1 超声波检测系统的总体设计结构   基于ARM超声波检测系统的总体结构框图,如图1所示。该系统主要由3部分组成:超声波前端发射接收电路、DSP和ARM处理器。   
[单片机]
基于<font color='red'>ARM</font>的PWM模块的超声波检测系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved