分散加载文件的编写
0赞假设一个采用ARM处理器的嵌入式系统目标硬件的存储器由ROM存储器和RAM存储器组成。当一个嵌入式系统在仿真环境下调试完毕,需要脱机运行的时候,就需要将源程序编译连接成可执行目标代码并烧写到ROM存储器中。由于ROM存储器存取数据的速率比RAM存储器慢,因此,让程序在ROM存储器中运行。CPU每次取指令和取数据操作都要访问ROM存储器,这样需要在CPU的总线周期中插入等待周期,通过降低总线的速率来满足访问慢速的ROM存储器,这样势必会降低CPU的运行速率和效率,因此,分散加载就显得非常必要。
ARM的连接器提供了一种分散加载机制,在连接时可以根据分散加载文件(.scf文件)中指定的存储器分配方案,将可执行镜像文件分成指定的分区并定位于指定的存储器物理地址。这样,当嵌入式系统在复位或重新上电时,在对CPU相应寄存器进行初始化后,首先执行ROM存储器的Bootloader(自举)代码,根据连接时的存储器分配方案,将相应代码和数据由加载地址拷贝到运行地址,这样,定位在RAM存储器的代码和数据就在RAM存储器中运行,而不再从ROM存储器中取数据或取指令,从而大大提高了CPU的运行速率和效率。
上面提到,LPC2292在上电后,从地址0x0000 0000处开始运行,并且地址0x0000 0000处放的是中断向量表,所以必须将中断向量表写在汇编代码的最前面。以便将中断向量表的代码加载到地址0x0000 0000处。
要实现正确加载,必须通过加载文件来实现。下面通过分散加载文件定义了加载区的地址为0x0000 0000。加载区是用来保存永久性数据(程序和只读变量)的区域;执行区时是程序执行时所表现出来的区域;程序执行时,从加载区域将数据复制到执行区。
ROM_EXEC 0x00000000
{
Startup.o (RESET, +First)
*.o (+RO)
}
设置执行区ROM_EXEC的地址为0x0000 0000,即将大括号里指定的代码加载到以0x0000 0000为起始地址的区域。将Startup.o文件(Startup.s的目标文件)中的RESET段放在最前面。这就保证了在RESET段中的中断向量表放在了0x0000 0000处,使系统能够正常运行。接着加载其他代码。
ERAM 0x40000000
{
*.o (+RW,+ZI)
}
这段代码设置了执行区ERAM的地址为0x4000 0000,这个地址是LPC2292中片内RAM的起始地址,将所有目标文件和库文件的RW和ZI段存放在该区域执行。
