嵌入式软件开发之: 映像文件存储器映射调整
件指定上面的代码在内存中的放置位置。如果代码和数据段的名称相同,则首先放置代码段。
FLASH 0x10000000 0x2000000
{
FLASH 0x10000000 0x2000000
{
init.o (Init, +First) ; 放置初始化代码
* (+RO) ;
}
RAM 0x0000
{
vectors.o (Vect, +First) ; 放置向量表
* (+RW,+ZI) ;
}
DUMP 0x08000000
{
dump.o (foo) ;
}
}
通过上面的Scatter文件,将init中的初始化段放在0x10000000地址,并将除foo外的只读数据func1和c[]放在该初始段的后面;接下来的执行域RAM放置向量表;最后的DUMP域放置由#pragma指定的段dump。
3.在代码映像中保留空白域
可以在Scatter中使用 EMPTY 属性为栈保留一个空白存储器块。该存储块不构成载入区的一部分,但指定在执行时使用。由于它创建为虚 ZI区,所以 armlink 使用以下符号访问它:
· Image$$region_name$$ZI$$Base;
· Image$$region_name$$ZI$$Limit;
· Image$$region_name$$ZI$$Length。
如果指定的长度为负值,则Image$$region_name$$ZI$$Limit被视为域的结束地址。它是绝对地址,不是相对地址。下面例子显示了如何在Scatter文件中预留一个空白区域。
LOADREGION 0x700000 ; 加载域的起始地址在0x700000
{ ;
STACK 0x7000000 EMPTY –0x10000 ; 该域的结束地址为0x700000,因为其长度为负
;
region
;
{
; 预留空白区放置栈
}
HEAP +0 EMPTY 0x10000 ; 栈的起始地址在上个预留区域介绍地址
;
;
{
; 预留空白区域放置堆
}
; rest of scatter description...
}
在上面的例子中定义了一个执行域STACK 0x7000000 EMPTY -0x10000,它从地址 (0x7000000-0x1000)开始,在地址0x7000000结束。
在此示例中,链接程序生成符号:
Image$$STACK$$ZI$$Base = 0x6ff0000
Image$$STACK$$ZI$$Limit = 0x7000000
Image$$STACK$$ZI$$Length = 0x1000
Image$$HEAP$$ZI$$Base = 0x7000000
Image$$HEAP$$ZI$$Limit = 0x7010000
Image$$HEAP$$ZI$$Length = 0x1000
EMPTY属性仅适用于执行区。如果在载入区定义中使用EMPTY属性,则链接程序生成警告信息并忽略该属性。链接程序检查用于EMPTY区的地址空间不与任何其他执行区重叠。
4.使用OVERLAY关键字
在ARM以前的编译器中,没有提供地址空间的重叠管理。如果有运行时域地址空间重叠,需要用户自己提供地址空间重叠的管理机制。但在RVDS的编译器中,提供了运行时域属性关键字OVERLAY,用户可以使用该关键字生成自己的重叠空间。
下面例子显示了如何使用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命令行链接产生的内存映像由一个加载域和三
- 基于DSP的导弹仿真器嵌入式组件设计(04-30)
- 为嵌入式软件建立统一软件系统框架的方法详介(05-23)
- 在VIM中实现对嵌入式软件的调试(08-06)
- 基于仿真的嵌入式软件白盒覆盖测试系统设计(08-26)
- 嵌入式软件运行剖面建模及测试用例生成(11-06)
- 嵌入式软件与硬件的集成测试过程研究(11-16)