新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 嵌入式软件开发之: 映像文件存储器映射调整

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

作者:时间:2013-09-30来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257027.htm

2.为执行域确定固定地址

可以在执行区描述中使用FIXED属性来创建根区,该根区在固定地址载入和执行。

FIXED可以用于在单一加载域内(因此通常用于单个ROM设备)创建多个根区。

例如,使用FIXED属性将函数或数据块(如常数表或校验和)放在ROM中的固定地址,这样就可以使用指针很方便的对其进行访问。

下面的例子显示了如何放置单个目标内容。

LOADREG1 0x0 0x10000

{

EXECREG1 0x0 0x1000 ;启动域,包含初始化代码

{ ;将初始化代码放在0x0地址

init.o (Init, +FIRST)

* (+RO) ;随后排放余下的只读数据

}

RAM 0x400000 0x2000 ;将可读可写数据放在0x400000地址

{

* (+RW +ZI)

}

DATABLOCK 0x4FF00 FIXED 0xFF ;执行域放在 0x4FF00地址

{ ;限制该域的最大长度为 0xFF

data.o(+RO-DATA) ;将只读数据放在0x1FF00 和 0x1FFFF之间

}

}

通过上面的Scatter文件,可以将初始化代码放在0x0处,其后是其他RO代码和除了data.o对象中的RO数据之外的所有RO数据;所有全局的RW变量放在RAM中0x400000处;最好将data.o的RO-DATA只读数据表放在地址0x4FF00处,并指定其最大长度为0xFF。

上例将代码或数据对象放在其各自的源文件中,然后放置目标文件域,这些操作方式是ARM公司建议的标准编码方式。为方便起见,可以使用编译指示#pragma和分散载入描述文件放置已命名的域。下面的例子创建模块dump.c并显式命名域。

// file dump.c

int a = 10; // 放入数据域

short b[100]; // 放入bss段

int const c[3] = {1,2,3}; // 放入.constdata段

int func1(int a) {return a*1;} // 放入.text段

#pragma arm section rwdata = foo, code =foo

int x = 5; // 在foo的数据域

char *s = abc; // s3在code段, abc 在 .constdata

int func2(int x) {return x+1;} // 放入foo的.text段

#pragma arm section code, rwdata // 返回

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

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。

存储器相关文章:存储器原理




评论


相关推荐

技术专区

关闭