ARM 启动流程一般出现的理解障碍都是在“启动方式”和“启动流程”这两个字眼上。下面我们将一步步解释这两个问题。我们的程序一般分为两部分:启动代码和功能代码, “启动代码”的主要工作是初始化芯片的各种工作模式下的堆栈( 如果需要使用中断,还要定义中断向量表) ,一般由芯片设计工程师用汇编语言编写, 当然不同的芯片这个程序也会有所不同, 以后基本上也不会再有变动,所以要求非常精炼,嵌入式工程师直接拿来用就可以了,然后 CPU 程序指针默认跳转到__main() 函数执行, 此处主要初始化一些数据区域之类的,下面才是跳转到我们平时编写的 main() 函数,也就是所谓的功能代码。那这些代码在芯片上电前保存在哪里呢? ARM 芯片上电后也是从默认地址开始执行程序,但一般此地址为 ESRAM 或者 SDRAM ,这两个存储器都是易失性存储器,没有断电存储代码的功能, 也就是说当我们的芯片上电时这里面全为不确定值(对 ESRA M 来说全为0,对 DDR 来说为随机值), 那要执行的代码在哪里呢? 那么就引出启动方式的概念了! ARM 一般有芯片内部 Flash 启动、外部存储器启动( NAND 、 NOR 、 SD )两种启动方式: 1、内部 Flash 启动是指芯片上电后 PC 立即开始执行这个存储器里的代码,注意这里不是零地址。但一般这个存储器的容量非常的小,因为芯片的成本与体积成指数关系, 那么不可能将我们编写的功能代码全部放进去, 所以仅仅将启动代码保存至这个 Flash 芯片中, 功能代码保存在大容价廉的外部存储器中,因此启动代码也又多了一项工作:从外部存储器搬运功能代码到某个可以执行代码的存储器( 如 NOR 、 SDRAM 、 ESRAM 等) ,然后跳转到这个地址去执行功能代码。 2 、外部存储器启动一般有 NAND 、 NOR 、 SD 启动三种,这几种启动方式流程大致相似,这里我仅拿 NAND 启动来讲:在这种启动方式里, 断电时将启动代码和功能代码全部保存至外部存储器中, 芯片上电后内部的 DMA 器件自动搬运 NAN D的前8K 代码到 ESRA M或者 SDRAM , 具体搬运到哪个地址也是在芯片设计时确定的,有的芯片就没有 ESRAM 这个存储器;而且搬运的代码大小也是在芯片设计时确定的, 目前我参与的一个芯片项目是搬运 NAND 的前 8K 代码, SD 的前 4K代码。也就是说芯片上电后不再立即执行代码了, 而是先启动总线到指定地址搬运代码,然后再从 ESRAM 或者 SDRAM 开始执行代码,但 8K 或者 4K 代码也并不一定满足我们的要求,特别是使用操作系统时, 仅 LINUX 内核就要 2M 大小左右,所以习惯上这前几 K 的代码我们放的依然是启动代码,功能代码还是放在外部存储器的另一个地方,启动代码中依然有搬运功能代码的部分, 下面的执行部分就和第一种启动类似了。当然如果你的功能代码非常少, 仅有几 K 大小, 那么可以省略启动代码中的搬运部分,将两种代码直接放在 NAND 的前 8K 空间里即可。这里还要特别说一下 NOR 启动,它和一般 FLASH 存储器不同,它支持 byte 操作,也就是说在 NOR 里可以直接执行代码,它不需要功能代码搬运这一步, 这就比其它两个外部启动方式更高效。但这种存储器还是比较昂贵的
ARM启动流程 来自淘豆网m.daumloan.com转载请标明出处.