在ADS LPC2200的发动模板中有一个scf文件夹,其中有mem_a.scf、mem_b.scf、mem_c.scf这3个文件,这3个文件是ADS的涣散加载机制,其意图是将代码段和数据段别离定位到拟定地址上。能够在Arm Linker中挑选加载途径。
涣散装在技能概述:
涣散装在技能能够把用户的应用程序分割成多个RO(只读)运转域和RW(可读写)运转域(关于域的概念我们能够在网上查查),而且给它们拟定不同的地址。一个嵌入式体系中,Flash、16位RAM、32位RAM都能够存在于体系中,所以,将不同功用的代码定位在特定的方位会大大地进步体系的运转功率。下面是最为常用的2种状况:
一、32位的RAM运转速度很快,因而就把中止服务程序作为一个独自的运转域,放在32位的RAM,使它的呼应时刻到达最快。
二、程序在RAM中运转,其功率要远远高于在ROM中运转,所以将发动代码(Boot loader)以外的一切代码都在RAM中运转,能够进步运转功率。
涣散装在技能首要完结了2个根本的功用:
怎么涣散。便是怎么将输入段组成输出段和域。
怎么装载。便是确认装载域和灭个运转域在存储空间里的地址是多少。
域能够分为装载域和运转域
装载域描绘运转前输出段和域在ROM/RAM里的散布状况,运转域描绘了运转时输出段和域在ROM/RAM里的散布状况。大多数状况下,映像文件哎履行前把它装载到ROM里,而当运转时,域里的有些输出段(比方RW类型的输出段)有必要到RAM里,程序才干正常运转,所以,在装载和运转时,RW类的输出段处在不同的方位(地址空间)。
Scatterfile涣散加载文件:
在scatterfile中能够为每一个代码或数据区在装载和履行时指定不同的存储区域地址,Scatlertoading的存储区块能够分红二种类型:
装载区:当体系发动或加载时应用程序的寄存区。
履行区:体系发动后,应用程序进行履行和数据拜访的存储器区域,体系在实时运转时能够有一个或多个履行块。
映像中一切的代码和数据都有一个装载地址和运转地址(二者或许相同也或许不同,视详细状况而定)。
scatter文件语法
scatter文件是一个简略的文本文件,包括一些简略的语法。
My Region 0x0000 0x1000
{
;the context of region
}
标题
每个块由一个头标题开端界说,头中至少包括块的姓名和开端地址,如(0x0000),别的还有最大长度等其他一些特点选项(注:这些特点是可选的,如0x1000)。
内容
块界说的内容包括在紧接的一对花括号内,依赖于详细的体系状况。
一个加载块有必要至少含有一个履行块;实践中一般有多个履行块。
一个履行块有必要至少含有一个代码或数据段;这些一般来自源文件或库函数等的方针文件;通配符号*能够匹配指定特点项中一切没有在文件中界说的余下部分。
有以下几种特点:
RO:只读的代码段和常量
RW:能够读写的全局变量和静态变量
ZI:RW段中要被初始化为零的变量。
Scatterfile中的界说要依照体系冲定向后的存储器散布状况进行,在引导程序完结初始化使命后,应该把主程序转移到RAM中运转以加速体系的运转速度。
LPC2200涣散加载文件剖析:
ROM_LOAD 0x80000000 (1)
{
ROM_EXEC 0x80000000 (2)
{
Startup.o (vectors, +First) (3)
* (+RO) (4)
}
IRAM 0x40000000 (5)
{
Startup.o (MyStacks) (6)
}
STACKS_BOTTOM +0 UNINIT (7)
{
Startup.o (StackBottom) (8)
}
STACKS 0x40004000 UNINIT (9)
{
Startup.o (Stacks) (10)
}
ERAM 0x80040000 (11)
{
* (+RW,+ZI) (12)
}
HEAP +0 UNINIT (13)
{
Startup.o (Heap) (14)
}
HEAP_BOTTOM 0x80080000 UNINIT (15)
{
Startup.o (HeapTop) (16)
}
}
FLASH_LOAD 0x81000000 0x1000 (17)
{
FLASH_EXEC 0x81000000 (18)
{
main.o (+RO) (19)
}
}
(1)加载时域描绘,称号位ROM_LODA 它的地址为0x80000000;0x80000000为LPC片外RAM地址,行将以下的加载的段和域都在RAM中。
(2)榜首个运转时域描绘。ROM_EXEC描绘了履行区的地址,放在榜首块界说,其开端地址、空间巨细域加载区开端地址、空间巨细要相同。
(2)-(4)从开端地址开端放置向量表。Startup.o是Startup.s的方针文件。Vectors为中止向量表。模块Startup坐落该加载域的最初(+First),vectors作为进口点,包括悉数的RO代码。ARM在芯片复位之后,体系进入管理模式、ARM状况,PC(R15)寄存器的值为0x00000000,所以有必要确保用户的向量表代码定位在0x00000000处,或许映射到0x00000000处(例如向量表代码在0x80000000处,经过存储器映射,拜访0x0000000便是拜访0x80000000)。
(5)-(6)第二运转时域描绘。将MyStacks仓库段装载到片内静态RAM中。
(7)-(8)将栈底放入仓库的后边(+0)不进行初始化(UNINIT), 栈底为Startup中的StackBottom。
(9)-(10) 将栈放入地址为0x40004000 而且不进行初始化(UNINIT)。
(11)-(12将一切的RW和ZI段放入外部存储器中以0x80040000为最初的地址中。而且悉数清零(+ZI)外部RAM中指定的区域。
(13)-(14)在RW ZI段后放入堆底(Startup.o(Heap))而且不进行初始化。
(15)-(16)将堆定放入外部RAM中(0x80080000)。
(17)-(19)自己增加的加载代码,把main.c的方针文件加载到片外Flash中而且占用了0x1000的巨细。