微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式软件开发之: 映像文件存储器映射调整

嵌入式软件开发之: 映像文件存储器映射调整

时间:08-30 来源:3721RD 点击:

件指定上面的代码在内存中的放置位置。如果代码和数据段的名称相同,则首先放置代码段。

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命令行链接产生的内存映像由一个加载域和三

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top