因为我的图片文件较大,容量超过了14M,所以改用32MRom+8M Ram,scatter文件我只改了3个地方:
1. ROM总大小,即把 ROM 0x00000000 0x00e00000 改成了 ROM 0x00000000 0x01e00000(由14M->30M);
2. 把ROM 的4个分区都改成了8M,即:
分区1:ROM 0x00000000 0x00400000 改成了 ROM 0x00000000 0x00800000(4M ->8M);
分区2:ROM2 +0x0 0x00400000 改成了 ROM2 +0x0 0x00800000(4M ->8M);
分区3:ROM3 +0x0 0x00400000 改成了 ROM3 +0x0 0x00800000(4M ->8M);
分区4:ROM4 +0x0 0x00400000 改成了 ROM4 +0x0 0x00800000(4M ->8M);
3. 把内存总大小改成了8M,原来才4M:
我把DUMMY_END 0x08400000 0x04 改成了 DUMMY_END 0x08800000 0x04
这样改后,我的16M bin档烧进去后,还是开不了机。超过14M原因是图片较大。
请教各位高手,我这样改Satter 文件有错没有?要怎样改呀,请指点!
请按以下我说的去分析这个问题.
1.首先,使用大的FLASH,改scatter文件只改结束地址就OK,所以只要做你所说的第一步。后面的是按照偏移量自动去算的,除非是加特殊的第三方软件,一般是不用修改的,dummy end也不用去改,不影响。你用的FLASH一般是由NOR+SDRAM组成。我们这里只讨论NOR的部分。NOR里确定code region是最优先的。你的情况是需要腾出一个大于14M的空间。那么我们假如用20M。那结束地址就是00001400000.
2.然后再说为什么开不了机的问题。因为你的FAT和NVRAM及Z盘的配置有问题。你用去30M给BIN,那就余下2M给NVRAM+Z+FAT.你认为够么。你得去custom_memory...这只文件下查一下,你的partion_sector是多少.1024代表512K。不出意外的话,你留给NVRAM+Z的空间只有1.5M左右。这是远远不够的。
3.而你用的这个FLASH,按我的猜想,应该是toshiba的,如果是spansion的,那你还有不分区的可能,直接分为28+4,28作BIN,4M做NVRAM+FAT,有可能能开机。但如果是TOSHIBA的,那多半是16个2M的bank结构的。那就没办法了。必须去打开makefile里的enhance_single_bank...这只开关。然后在xls表里对最后一个bank进行扩容。在表里的last bank下改其大小。必须按大的block的整数倍增加。
按照上面的去试下,应该可以开机。
----------------------------------------------------------------------------------------
Scatter file (分散加载描述文件)用于armlink的输入参数,他指定映像文件内部各区域的download与运行时位置。Armlink将会根据scatter file生成一些区域相关的符号,他们是全局的供用户建立运行时环境时使用。
(注意:当使用了scatter file 时将不会生成以下符号:
Image$$RW$$Base,
Image$$RW$$Limit,
Image$$RO$$Base,
Image$$RO$$Limit,
Image$$ZI$$Base,
Image$$ZI$$Limit)
二 什么时候使用scatter file
当然首要的条件是你在利用ADS进行项目开发,下面我们看看更具体的一些情况。
1 存在复杂的地址映射:例如代码和数据需要分开放在在多个区域。
2 存在多种存储器类型:例如包含 Flash,ROM,SDRAM,快速SRAM。我们根据代码与数据的特性把他们放在不同的存储器中,比如中断处理部分放在快速SRAM内部来提高响应速度,而把不常用到的代码放到速度比较慢的Flash内。
3 函数的地址固定定位:可以利用Scatter file实现把某个函数放在固定地址,而不管其应用程序是否已经改变或重新编译。
4 利用符号确定堆与堆栈:
5 内存映射的IO:采用scatter file可以实现把某个数据段放在精确的地指处。
因此对于嵌入式系统来说scatter file是必不可少的,因为嵌入式系统采用了ROM,RAM,和内存映射的IO。
三 scatter file 实例
1 简单的内存映射
LOAD_ROM 0x0000 0x8000
{
EXEC_ROM 0x0000 0x8000
{
*(+RO)
}
RAM 0x10000 0x6000
{
*(+RW, +ZI)
}
}
LOAD_ROM(下载区域名称) 0x0000(下载区域起始地址) 0x8000(下载区域最大字节数)
{
EXEC_ROM(第一执行区域名称) 0x0000(第一执行区域起始地址) 0x8000(第一执行区域最大字节数)
{
*(+RO(代码与只读数据))
}
RAM(第二执行区域名称) 0x10000(第二执行区域起始地址) 0x6000(第二执行区域最大字节数)
{
*(+RW(读写变量), +ZI(未初始化变量))
}
}
2 复杂内存映射
LOAD_ROM_1 0x0000
{
EXEC_ROM_1 0x0000
{
program1.o(+RO)
}
DRAM 0x18000 0x8000
{
program1.o (+RW, +ZI)
}
}
LOAD_ROM_2 0x4000
{
EXEC_ROM_2 0x4000
{
program2.o(+RO)
}
SRAM 0x8000 0x8000
{
program2.o (+RW, +ZI)
}
}
LOAD_ROM_1 0x0000(下载区域一起始地址)
{
EXEC_ROM_1 0x0000(第一执行区域开始地址)
{
program1.o(+RO) (program1.o内的Code与RO data 放在第一执行区域)
}
DRAM 0x18000(第二执行区域开始地址) 0x8000(第二执行区域最大字节数)
{
program1.o (+RW, +ZI) (program1.o内的RW data与 ZI data 放在第二执行区域)
}
}
LOAD_ROM_2 0x4000(下载区域二起始地址)
{
EXEC_ROM_2 0x4000
{
program2.o(+RO) (program2.o内的Code与RO data 放在第一执行区域)
}
SRAM 0x8000 0x8000
{
program2.o (+RW, +ZI) (program2.o内的RW data与 ZI data 放在第二执行区域)
}
}
2.1 BNF 符号与语法
":由引号赖标示的符号保持其字面原意,如A”+”B标示A+B。
A ::= B :定义A为B。
[A]:标示可选部分,如A[B]C用来标示ABC或AC。
A+:用来标示A可以重复任意次,如A+可标示A,AA,AAA, …
A*:同A+。
A | B:用来标示选择其一,不能全选。如A|B用来标示A或者B。
(A B):标示一个整体,当和|符号或复杂符号的多次重复一起使用时尤其强大,如(AB)+(C|D)标示ABC,ABD,ABABC,ABABD, …
2.2分散加载文件各部分描述
(2.1)
如图2.1所示为一个完整的分散加载脚本描述结构图。下面我们对图示中各个部分进行讲述。
2.2.1 加载区描述
每个加载区有:
名称:供连接器确定不同下载区域
基地址:相对或绝对地址
属性:可选
最大字节数:可选
执行区域列:确定执行时各执行区域的类型与位置
load_region_name (base_address | ("+" offset)) [attribute_list] [ max_size ]
"{"
execution_region_description+
"}"
load_region_name:下载区域名称,最大有效字符数31。(并不像执行区域段名用于Load$$region_name,而是仅仅用于标示下载区域)。
base_address:本区域内部目标被连接到的地址(按字对齐)。
+offset:相对前一个下载区域的偏移量(4的整数倍,如果为第一个区域)。
2.2.2 执行区描述
每个执行区有:
名称:供连接器确定不同下载区域
基地址:相对或绝对地址
属性:确定执行区域的属性
最大字节数:可选
输入段:确定放在该执行区域的模块
exec_region_name (base_address | "+" offset) [attribute_list] [max_size]
"{"
input_section_description+
"}"
exec_region_name:执行区域名称,最大有效字符数31。
base_address:本执行区域目标要被联接到的位置,按字对齐。
+offset:相对于前一个执行区域结束地址的偏移量,4的整数倍;如果没有前继之能够行区域(本执行区域为该下载区域的第一个执行区域),则该偏移量是相对于该下载区域的基址偏移量。
attribute_list:PI,OVERLAY,ABSOLUTE,FIXED,UNINIT。
PI: 位置独立。
OVERLAY: 覆盖。
ABSOLUTE: 绝对地址。
FIXED: 固定地址,下载地址与执行地址具有该地址指示确定。
UNINIT: 未初始化数据。
RELOC:无法明确指定执行区域具有该属性,而只能通过继承前一个执行区或父区域获得。
对于PI,OVERLAY,ABSOLUTE,FIXED,我们只能选择一个,缺省属性为ABSOLUTE。一个执行区域要么直接继承其前面的执行区域的属性或者具有属性为ABSOLUTE。
具有PI,OVERLAY,RELOC属性的执行区域允许其地址空间重叠,对于BSOLUTE,FIXED 属性执行区域地址空间重叠Armlink会报错。
max_size:可选,他用于指使Armlink在实际分配空间大于指定值时报错。
input_section_description:指示输入段的内容。
基本语法2
2.2.3 输入段描述
输入段:
模块名:目标文件名,库成员名,库文件名。名称可以使用通配符。
输入段名,或输入段属性(READ-ONLY,CODE)。
module_select_pattern
["("
("+" input_section_attr | input_section_pattern)
([","] "+" input_section_attr | "," input_section_pattern))*
")"]
2.2.3.1
module_select_pattern:选择的模块名称(目标文件,库文件成员,库文件),模块名可以使用通配符(*匹配任意多个字符,?匹配任意一个字符),名称不区分字母大小写,它是供选择的样本。
例1:*libtx.a (+RO)
libtx.a为threadX库文件。
例2:tx_ill.o (INIT)
tx_ill.o为threadX中断向量目标文件。
2.2.3.2
input_section_attr:输入段属性选择子,每个选择子以”+”开头,选择子不区分大小写字符。
选择子可选:
RO-CODE,
RO-DATA,
RO( selects both RO-CODE and RO-DATA),
RW-DATA,
RW-CODE,
�
评论0