#嵌入式如何使用Base Address#
嵌入式软件开发之: 映像文件存储器映射调整
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文件的第一行加上需要编译器进行预处理的操作。语法格式如下所示。
#!
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
查看评论 回复