当前位置:首页 >> 桔梗

新手必看 ARM的启动流程介绍温度控制

2022-12-06 17:34:07  中康农业网

新手必看 ARM的启动流程介绍

ARM是在嵌入式学习过程中必不可少的一个环节。但是对于很多新手来说ARM启动过程是一个非常复杂的过程。本文就将为大家介绍ARM启动过程,感兴趣的朋友快来看一看吧。

对于一般的嵌入式系统来讲,考虑到系统成本,运行速度等因素,往往联合使用好几种存储器件。在下面讲到的例子中,是我在开发中用到的一个ARM9EJ的处理器,系统中采用了SDRAM,ROM,NandFLASH,ITCM,DTCM等。

SDRAM:程序正常运行时所在的存储器,物理地址0x24000000-0x24800000(以8M为例);

ROM:复位后,ARM从ROM启动,ROM是只读的,出厂时就烧好了,不可更改,正常运行时,物理地址:

0x2C000000-0x2C006000(24KB);

NandFLASH:外接存储器件,正常运行的程序会福安通过烧录工具先放在这里。也可以做为用户的数据存储区,通过文件系统来访问。

ITCM,DTCM:类似与SDRAM,但是速度比SDRAM快很多,当进行大量,繁琐,且实时性要求较高的运算时,使用该存储。

从开机,即对处理器发送一个RESET信号后,ARM处理器就进入中断模式,从中断向量RESET处理,即地址0x00000000处开始执行。但是,我们看到,整个系统在物理地址0处是没有存储器件的。实际上是,对与大多数的ARM处理器来讲,有一个硬件映射的机制。对与这个处理器来说,开始时,默认将ROM(0x2C000000-0x2C006000)映射到地址零处,注意,此动作是由硬件达成的,软件不用考虑。此时,送到地址总线的地址是0x00000000,但是对应的却是ROM中offset螺纹磨床为0处的代码。看看ROM中代码是怎么考虑的:

.section.boot#1

__RESET_ADDR:

/*MovePCtoROMaddress*/

LDRPC,=0x2C000024#2

/*Hardwardinit*/

BL__HARDWARD_INIT

/*DetectSDRAMsize*/

BL__SDRAM_DETECT

/*SDRAMinit*/

BL__SDRAM_INIT

/*Datasectioninit*/

BL__DATA_INIT#3

/*BSSsectioninit*/

BL__BSS_INIT#4

/*ARMmodestacksinit*/

BL__STACK_INIT#5

/*EnterCcode*/

B__MMU_START_MAIN#6

需要注意的是上面标出来的6个地方,下面分别解释:

#1

GCC会把以下的代码放到.boot段中,通过ld中对.boot的安排,可将该段放在指定的地址空间,参见后面的ld描述;

#2

此处将PC指针赋值为0x2C000024,通过对这个.boot段进行反汇编,可以看到该地址对应

BL__HARDWARD_INIT,就是该条指令的下一条。此时,物理地址0x00000024和0x2C000024都对应这条指令,这是由于重映射机制造成的。通过,执行

LDRPC,=0x2C000024,使得处理器的地址空间从原来的0x0000000变到0x2C000000,这是必要的。其一:ROM本身就对应在0x2C000000这个地址空间,恢复到此空间是很自然的。其二:为后面的重映射做准备。因为ROM的运行速度没有SDRAM快,所以通常把程序加载到SDRAM中运行,由于中断向量的在0x00000000处,所以需要把SDRAM映射到0地址去,这也是硬件映射的。如果不做这种转换的话,当进行了硬件映射后,两条指令就接不上了,上一条指令是0x0000xxxx,位于ROM中,下一条指令0x0000xxxy为与SDRAM,会接着从SDRAM中执行,很容易出问题。

#3

此处做数据段的初始化的,数据段是塑胶成型可读可写的。所以必须把数据段搬到SDRAM中去,方可使用。该数据段的LMA和VMA是不同的,通过在ld中加上标签,可以得知从哪儿搬数据,要搬到那儿去。

#4

做BSS段初始话,一般清0。值得注意的是,对于初始化为0的全局变量,可能会放在这里。

#5

初始化,各个模式烟囱下的堆栈。

#6

启动MMU,进入main函数。

膀胱炎一般分为哪些类型呢
静脉曲张的日常护理
早老性脱发的中医疗法
柯莱斯骨折的治疗方法
相关资讯
友情链接