分散加载文件的描述

发布 2019-07-03 03:19:15 阅读 8995

关于lpc2200启动程序分散加载描述文件的叙述

在ads lpc2200的启动模板中有一个scf文件夹,其中有mem_这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 0x800000001rom_exec (vectors, +first3)

(+ro4iram (mystacks6stacks_bottom +0 (stackbottom8stacks 0x40004000 (stacks10eram 0x8004000011rw,+zi12heap +0 (heap14heap_bottom 0x80080000 (heaptop16flash_load 0x81000000 0x100017flash_exec (+ro191)加载时域描述,名称位rom_loda 它的地址为0x80000000;0x80000000为lpc片外ram地址,即将以下的加载的段和域都在ram中。

2)第一个运行时域描述。rom_exec描述了执行区的地址,放在第一块定义,其起始地址、空间大小域加载区起始地址、空间大小要一样。

2)-(4)从起始地址开始放置向量表。是的目标文件。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段放入外部存储器中以0x80040

40000为开头的地址中。并且全部清零(+zi)外部ram中指定的区域。

13)-(14)在rw zi段后放入堆底(并且不进行初始化。

15)-(16)将堆定放入外部ram中(0x80080000)。

17)-(19)自己添加的加载**,把的目标文件加载到片外flash中并且占用了0x1000的大小。