本篇是参照了某rk芯片说明写的心得,因为是保密文件,就不引用原文了。
目标:我希望把启动流程的设计思想写清楚。
注意事项(本文要写的是系统启动流程):ARM开发分为裸板开发和基于系统的开发,我看了《Cortext M3微控制器快速入门和应用》,这本书是没有系统的,这书只是写了很多接口驱动。而我下面要介绍的是一个系统的启动流程,所有的接口驱动是基于一个文件系统来调用和设计的。如果要加驱动,就要懂得整个系统的架构,不然无从入手。所以,我得先把系统的启动流程搞明白。这个系统是可以由芯片商自己写的,也可以使用开源系统,如linux。
要明白系统启动流程,得明白很多概念(仅供参考,其它芯片商的设计可能不一样,不要以为这是唯一的芯片知识),如下:
1. Firmware。这是最终的打包文件,通过PC的烧录工具,烧录到Flash中。它包含了ID Block(存放序列号、保密数据、MAC等信息),System代码和数据、Loader。
2. IRAM。Cortex M3提供了Overlay技术,可以把指令和数据分开存放,而且不同的模块,可以被设定在一个指定的RAM地址空间运行(需要芯片商和工程师在“地址链接说明文件”scatter file中声明,比较复杂,有兴趣要查官网介绍)。而IRAM就是指令存放的空间的统称,起始地址是0x10000000(芯片商自定义,size也是自定义)。
3.DRAM。指数据存放的空间,起始地址是0x30000000(芯片商自定义,size也是自定义)。
4. ROM。分为Boot ROM和 TABLE ROM。与其它芯片相同,Boot Room是从0x0000 0000开始,主要作用是下载Loader到IRAM中运行。而TABLE ROM存放了功能性的算法代码,如WMA/AAC等audio decode的代码。
5. Loader:分为Flash loader和USB loader。注意:存放在Flash中,最初通过Boot ROM已经烧录好的固定代码:USB Boot下载USB Loader,然后通过USB loader 下载Flash Loader。它的作用就是把下面提到的System Code和Date下载到IRAM中运行。
Flash Loader是用来下载System Code和System data到IRAM中运行的。如果还没烧录“Flash Loader和FIrmware”或者“Flash loader和Firmware之一”损坏,USB loader就发挥作用了,它会建立和PC机的通讯,然后通过烧录工具把Flash Loader和Firmware都下载到Flash中。再提醒下,如第一点所述,Loader其实也是Firmware的一部分,不是独立的。
6. System Code和System Data。如上面说的,SysCode放在IRAM中运行,而SysData放在DRAM中运行。分别通过instruction BUS和data BUS访问这两个区域。
7.最后补充,RAM:RAM是个软件概念,对应的硬件就是DDR。那么DDR由什么组成?仅仅是IRAM和DRAM吗?他们两者什么关系?其实
RAM=IRAM+DRAM+Reserved RAM+Register RAM
其中ReserverRAM是DDR中预留的地址空间,而Register RAM是DDR中被用来作为功能寄存器的地址空间,如端口寄存器,功能寄存器(RTC、PWM、SPI、I2C等),这些寄存器都是指定RAM地址的。我们访问这些寄存器时,就是在访问其指定的RAM地址。这是内存映射的知识范畴,我不熟,就不多说了。
好了,有了基本概念,就开始讲下思想:
存储关系
整个芯片的启动流程和运行,得解决内存组织的问题,有兴趣可以搜下memory organization,看别人怎么定义的。那么通过什么思想去组织内存??所以,我觉得在看内存组织结构图的时候,得先明白怎么运用内存。要点:
a.每个方案都有ROM和RAM。他们都是“内存”。只不过,ROM的写速度很慢,不能用来运行代码,只适合烧写不需要修改的代码,然后,那些需要在运行中变化的数据,就放到RAM中运行。
b.有了a的基本思想,接着就是判断什么代码是固定的,如driver、boot、decode算法。这些代码都不会在运行中改变,可以放到ROM中。由于ROM一般都是几十K,容量有限,系统级SysCode和SysData就得放到便宜的大容量存储器Flash。Loader也是放到FLASH里。既然这样,在PC机烧录Firmware的时候,可以把Loader和SysCode、SysData都放在里面,还可以加入一些需要的数据。但Flash同样是写速度很慢的,不能用来运行。得用RAM来运行。
c.RAM的作用很大,上面提到的Loader、SysCode和SysData都在RAM中运行,因为使用了Overlay(内存迭代技术),所以SysCode和Loader被指定在IRAM中运行,即被加载在0x1000 0000中,PC指针跳到这里运行。所以可以看到启动流程中,PC指针反复跳到0x1000 0000。SysCode会在DRAM中运行,包括一些APP、UI的应用数据。
d.最后,总结出启动流程:先把ROM数据烧录好,这样就有了NandFlash Boot和USB Boot代码->于是利用Boot加载Flash Loader(最终目的是加载SysCode)->如果Flash中没烧录Firmware,找不到Loader->通过USB Boot 加载USB Loader。。。。我画图好了,如下图
图1CortexM3的文件系统启动流程