嵌入式软件开发之: 映像文件存储器映射调整
13.4 映像文件存储器映射调整
13.4.1 关于分散加载
映像由域(Regions)和输出段(Output Sections)组成。每个域可以有不同的加载地址和执行地址。
分散加载可以更加方便准确的指定映像存储器映射,为映像组件分组和布局提供了全面控制。它能够描述由载入时和执行时分散在存储器映射中的多个区组成的复杂映像映射。虽然,分散加载可以用于简单映像,但它通常仅用于具有复杂存储器映射的映像。
要构建映像的存储器映射,必须向armlink提供以下信息:
· 分组信息:决定如何将各输入段组织成相应的输出段和域;
· 定位信息:决定各域在存储空间的起始地址。
有两种方法可以配置指定映像文件的分组和定位信息:如果映像文件中地址映射关系比较简单,可以使用命令行选项;如果映像文件中地址映射关系比较复杂的情况,可以使用一个配置文件。使用该配置文件可以告诉链接器相关的地址映射关系。配置文件又叫Scatter文件,是一个文本文件,通过下面的链接选项来实现。
-scatter filename
1.为分散加载定义的符号
当armlink使用Scatter文件创建映像时,它创建一些区相关符号。表13.2概括了这些符号的意义。
表13.2 域相关符号
符 号 | 意 义 |
Load$$region_name$$Base | 域的载入地址 |
Image$$region_name$$Base | 域的执行地址 |
Image$$region_name$$Length | 执行域字节长度(4的倍数) |
Image$$region_name$$Limit | 执行区末尾地址 |
Image$$region_name$$ZI$$Base | 执行域中ZI段的执行地址 |
Image$$region_name$$ZI$$Length | ZI输出段的长度(4的倍数) |
Image$$region_name$$ZI$$Limit | 执行域中ZI段的末尾地址 |
2.使用Scatter文件的优势
链接程序的命令行选项提供了一些对数据和代码布局的控制,但要实现对布局的全面控制命令行输入的指令是远远不够的。在下面一些情况下,就需要使用Scatter文件对映像布局进行控制。
① 需要实现复杂存储器映射
系统中的代码和数据必须放在多个不同存储器区域中,这样连接器必须知道哪个段放在哪个储存器空间的详细信息。这种情况下,最好用Scatter文件实现代码映像的分散加载。
② 系统中存在多种不同类型存储器
许多系统包含多种不同类型存储器,如flash存储器、ROM、SDRAM和快速SRAM。分散载入描述可以将代码和数据放置在最适合的存储器类型中。例如,中断代码可能放在快速SRAM中,以加快中断响应时间,而不频繁使用的配置信息可能放在较慢的flash存储器中。
③ 存储器映射I/O
分散载入描述可以将数据精确定位在内存地址中,而避免数据和内存映射外围地址相冲突。
④ 位于固定位置函数
可以将特定函数放在存储器中的同一个位置,这样即使周围的应用程序已经被修改并重新编译,也可以使具有特定功能的函数地址保持不变。
⑤ 使用符号识别堆和栈
可以为堆和栈的位置定义符号,链接应用程序时可以指定该封闭模块的位置。
随着目前嵌入式系统越来越复杂,系统中可能同时使用flash、ROM和RAM,所以建议在生产系统映像时使用Scatter文件。
3.分散加载命令行选项
可以使用下面的命令行选项使用分散加载文件。
-scatter description_file_name
使用该命令可以使链接器使用命令中给出的description_file_name文件生成最终的映像文件。
4.简单存储器映像举例
例如,一个实际系统的存储器映射如图13.7所示。
图13.7 简单存储器映射
为了实现图13.7的存储器映射,使用图13.8所现实的Scatter文件。
5.复杂存储器映像实现举例
一个复杂存储器映射如图13.9所示。
图13.8 实现简单内存映射的Scatter文件
图13.9 复杂存储器映射实例
为了实现图13.9的存储器映射,使用以下程序所现实的Scatter文件。
LOAD_ROM_1 0x0000 ;第一个加载时域的起始地址
{
EXEC_ROM_1 0x0000 ;第一个运行时域的起始地址
{
programl.o(+RO) ;放置program.o中所以的RO段
{
SRAM 0x9000 ;运行时域的起始地址
{
programl.o(+RW,+ZI) ;放置program.o中所有的RW和ZI段
}
}
LOAD_ROM_2 0x4000 ;第二个加载时域的起始地址
{
EXEC_ROM_2 0x4000 ;运行时域的起始地址
{
- 基于DSP的导弹仿真器嵌入式组件设计(04-30)
- 为嵌入式软件建立统一软件系统框架的方法详介(05-23)
- 在VIM中实现对嵌入式软件的调试(08-06)
- 基于仿真的嵌入式软件白盒覆盖测试系统设计(08-26)
- 嵌入式软件运行剖面建模及测试用例生成(11-06)
- 嵌入式软件与硬件的集成测试过程研究(11-16)