嵌入式软件开发之: 映像文件存储器映射调整
使用该关键字生成自己的重叠空间。
下面例子显示了如何使用OVERLAY关键字,生成运行时域的重叠空间。
LOADREG 0x8000
{
;
STATIC_RAM 0x0 ; 静态RAM区,包含大部分的RW和ZI
{
* (+RW,+ZI)
}
OVERLAY_A_RAM 0x1000 OVERLAY ; 重叠区...
{
module1.o (+RW,+ZI)
}
OVERLAY_B_RAM 0x1000 OVERLAY
{
module2.o (+RW,+ZI)
}
;
}
5.在Scatter文件中使用预处理伪操作
可用在Scatter文件的第一行加上需要编译器进行预处理的操作。语法格式如下所示。
#! preprocessor> [pre_processor_flags]
LOAD_FLASH ( 0x8000 + ( 0x2 * 0x400 )) ;
例如:
#! armcc -E
联接器可以对预处理的表达式进行简单的计算,可以识别简单的运算符如+、-、×、/、AND和OR,如:
#define AN_ADDRESS (BASE_ADDRESS+(ALIAS_NUMBER*ALIAS_SIZE))
同时,也可以在Scatter文件头加一些预处理的伪操作,如:
#define ADDRESS 0x20000000
#include include_file_1.h
#define BASE_ADDRESS 0x8000
#define ALIAS_NUMBER 0x2
#define ALIAS_SIZE 0x400
在Scatter文件中,使用预处理的更详细的信息,请参见ARM相关文件。
13.4.4 等效的简单映像分散载入描述
前面介绍了分散加载的命令行选项,如-ro-base、-rw-base、-reloc、-split、-ropi和-rwpi。但在实际编程时,因为使用Scatter文件可以产生更清晰的内存映像视图,所以最好使用Scatter文件对映像进行加载。
本节详细介绍如何将各分散加载的命令行选项,替换为Scatter文件。
1.-ro-base address选项的替换
使用-ro-base address命令行链接产生的内存映像由一个加载域和三个执行域组成。执行域放在存储器映像中的相邻位置。
选项中的address指定了加载域和第一个执行域的起始地址(加载域和第一个执行域的起始地址相同)。
下面的例子显示了与“-ro-base 0x8000”命令行选项等价的Scatter文件。
LOADREG 0x8000 ;定义加载域的起始地址0x8000
{ ;
ROM +0 ;定义第一个执行域的起始地址,该地址与加载域的起始地址相同,为0x8000
;
{
*(+RO) ;该域放置所有的RO段
}
RAM_RW +0 ;定义第二个执行域,起始地址为0x8000+ROM段大小
;
{
*(+RW) ;将所有的RW代码放置在该段
}
RAM_ZI +0 ;定义ZI段
;ZI段的起始地址为0x8000+ROM段的大小+RAM_RW段的大小
;
{
*(+ZI) ;放置所有的ZI段
}
}
上例中的Scatter文件创建的映像由一个加载域和三个执行域组成。加载域的起始地址为0x8000。三个执行域分别为ROM、RAM_RW和RAM_ZI,它们分别包含RO、RW和ZI输出段。RO和RAM_RW为启动域,RAM_ZI在执行时动态创建。ROM的执行地址是0x8000,通过对执行区描述使用+offset格式的基址指定程序,所有三个执行域在存储器映射中相邻放置,即前一个执行域的末尾放置后一个执行域。
如果链接程序时,将-ro-base选项和-ropi混合使用,则可以生成位置无关代码。
下面的例子显示了与-ro-base 0x8000 -ropi等效的Scatter文件。
LOADREG 0x8000 PI ;加载域的地址为0x8000,并指定该加载域的属性为PI
{
ROM +0 ;第一执行域的地址为0x8000,而且该执行域继承了加载域的PI属性
;所有该域的执行地址是可变的
{
*(+RO) ;放置所有的RO段
}
RAM_RW +0 ABSOLUTE ;使用ABSOLUTE属性代替PI属性
{
*(+RW) ;放置RW段
}
RAM_ZI +0
{
*(+ZI)
}
}
执行域ROM从LOADREG加载域继承 PI 属性。下一个执行域 RAM_RW 被标记为 ABSOLUTE 所以其不再具有PI属性。另外,因为RAM_ZI 域使用了+0的偏移量,所以它从 RAM_RW域继承 ABSOLUTE 属性。
2.-ro-base和-rw-base选项的替换
使用-ro-base和-rw-base选项链接的映像也由一个加载域和三个执行域组成,它与类型1生成的映像十分相似,只是此类映像的RW执行区与RO执行区不相邻。
在-ro-base选项中指定加载域的起始地址,在-rw-base选项中指定执行域的地址。
下面的例子显示与使用-ro-base 0x8000 -rw-base 0x040000等效的分散载入描述。
LOADREG 0x8000 ;定义加载域的起始地址为0x8000
{
ROM_RO +0 ;定义第一个执行域的起始地址为0x8000
{
* (+RO) ;在该域中放置所有的RO段
}
RAM_RW 0x040000 ;第二个执行域名为RAM_RW,起始地址为0x40000
{
* (+RW) ;放置所有的RW段
}
RAM_ZI +0
{
* (+ZI) ;放置所有的ZI段
}
}
该Scatter文件创建的映像有一个名为LOADREG的加载域,载入地址是0x8000。该映像有3个执行区,分别为ROM、RAM_RW和RAM_ZI,它们分别包含RO、RW和ZI输出段。其中,RO域是启动域,执行地址是0x8000,RAM_RW执行域与第一个执行域RAM_RW不相邻。其执行地址是0x040000。紧随其后的执行区RAM_ZI放置所有的ZI
- 基于DSP的导弹仿真器嵌入式组件设计(04-30)
- 为嵌入式软件建立统一软件系统框架的方法详介(05-23)
- 在VIM中实现对嵌入式软件的调试(08-06)
- 基于仿真的嵌入式软件白盒覆盖测试系统设计(08-26)
- 嵌入式软件运行剖面建模及测试用例生成(11-06)
- 嵌入式软件与硬件的集成测试过程研究(11-16)