您的位置:首页 > 其它

根据scat文件,谈ROM和RAM的分配

2014-04-16 20:36 387 查看

根据scat文件,谈ROM和RAM的分配

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,

  RW( selects both RW-CODE and RW-DATA),

  ZI,

  ENTRY( that is a section containing an ENTRY point)。

  

  以下同义词可以选择:

  CODE (for RO-CODE),

  CONST( for RO-DATA),

  TEXT (for RO),

  DATA (for RW),

  BSS (for ZI)。

  

  还有两个伪属性:FIRST,LAST。如果各段的先后顺序比较重要时,可以使用FIRST,LAST标示一个执行区域的第一个和最后一个段。

  例1:os_main_init.o (INIT ,+FIRST)

  FIRST表示放于本执行区域的开始处。

  例2:*libtx.a (+RO)

  RO 表示*libtx.a的只读部分。

  2.2.3.3

  input_section_pattern:输入段名。

  例1:os_main_init.o (INIT ,+FIRST)

  INIT 为os_main_init.o的一个段。

  例2:os_stackheap.o (heap)

  heap 为os_stackheap.o的一个段。

  例3:os_stackheap.o (stack)

  stack为os_stackheap.o的一个段。

  

  提高篇

  3.1 在scatter file中指定胶合段

  胶合段用于实现ARM代码到Thumb代码的切换或者实现代码的长转移。使用scatter file可以指定怎样放置胶合输入段。通常,在scatter file中一个执行区域可以拥有胶合段选择*(Venner$$Code)。

  Armlink把胶合输入段放到拥有段选择符*(Veneer$$Code)的执行区域中,这样做是安全的。

  可能由于地址范围问题或者受执行区域大小限制无法完成把胶合段分配个某个执行区域。如果当发生胶合段无法加到指定区域时,他将会被加到那些包含了生成胶合段的可重载输入段的执行区域。

  

  3.2 创建根执行区域

  根执行区域就是指那些执行与加载时地址相同的区域。

  当你为映像文件指定初始化入口点或者由于你只使用一个ENTRY导向符而使得连接器创建初始化入口位置时,你就必须确保该入口点位于根执行区域。如果入口点不在根执行区域,连接将会失败,连接器会报错。

  如:ENTRY point (0x00000000) lies within non-root region ER_ROM

  可以通过以下方式实现在scatter file中指定根执行区域。

  ① 显示或缺省的指定执行区的属性为ABSOLUTE,同时使得加载区域与第一个执行区域具有相同的地址。

  ② 使用FIXED属性使得执行区域的加载地址与其执行时地址保持不变。

  

  3.3 创建根执行区域

  可以通过在scatter file中为某个执行区域指定FIXED属性来实现该区域加载于运行时地址保持不变。

  FIXED可以用来在一个加载区中创建多个根执行区域。因此我们可以通过它实现把某个函数或一段数据放到目标地址,从而可以通过指针方便地访问该地址。比如,我们可以实现把常量表和checksum放到ROM上的固定地址处。

  注意:

  ① 为了使得代码更加易于维护和调试,请尽量少使用scatter file来指定放置位置,而是应该尽可能多地让连接器来确定函数和数据的位置。

  ②

  

  3.3.1 怎样把函数或数据放到指定地址

  通常,编译器处理来自单个源文件的RO,RW,和ZI段。这些区域包括源文件的代码与数据。如果打算把单个函数或数据项放到某个固定地址,我们就必须让编译器单独处理这些函数和数据。

  我么可以通过以下方式处理单个目标:

  ① 把函数和数据放到其源文件。

  ② 使用编译选项 –zo为每个函数单独生成一个目标文件。(参看ARM Compiler Guide)

  ③ 在C,C++源文件内利用 #pragma arm section 来生成多命名段。

  ④ 在汇编源文件内利用AREA 导向符来生成可重载段。

  

  3.3.2 怎样放置单个目标文件的内容

  

  3.3.3 怎样使用ARM的 section pragma

   通常把函数和数据放到其源代码文件,然后放到其目标文件的相应段中。然而,我们也可以#pragma 和scatter file实现单独处理某个命名段。

  

  // file adder.c

  int x1 = 5; // in.data

  int y1[100]; // in.bss

  int const z1[3] = {1,2,3}; // in.constdata

  int sub1(int x) // in.text

  {

  return x-1;

  }

  #pragma arm section rwdata = "foo", code ="foo"

  int x2 = 5; // in foo (data part of region)

  char *s3 = "abc"; // s3 in foo, "abc" in .constdata

  int add1(int x)

  {

  return x+1;

  } // in foo (.text part of region)

  #pragma arm section code, rwdata // return to default placement

  

  FLASH 0x24000000 0x4000000

  {

  FLASH 0x24000000 0x4000000

  {

  init.o (Init, +First) ;place code from init.o first

  * (+RO) ;sub1(), z1[]

  }

  32bitRAM 0x0000

  {

  vectors.o (Vect, +First)

  * (+RW,+ZI) ;x1, y1

  }

  ADDER 0x08000000

  {

  adder.o (foo) ;x2, string s3, and add1()

  }

  }

-----------------------------------------------------------------------------

mtk25平台默认的是128Mbit flash memory 和 32Mbit SRAM,因为1BYTE等于8BIT,所以就是我们通常所说的是16M ROM和4M RAM,不过由于文件系统占用2M,这2M一般又被分为系统盘和用户盘,系统盘存储NV文件和MMS相关文件,对用户不可见,用户盘用户连上电脑就可以看到,但由于一些原因,有不少手机是不设用户盘的,用户盘过大,会导致彩信等一些模块不稳定,所以很多使用NORFALSH时不设用户盘,但NAND FALSH一般都会设置一定的用户盘。

如果需要设置,只要修改宏PARTITION_SIZE值就可以控制。所以我们能够使用的就只剩下14,这一点可以从BUILD目录下的scatWINGTECH25_GEMINI.txt文件的声明部分看到,在SCAT文件中,有一行是SCHEME   : external 14MB flash memory and 4MB SRAM,就是说14MROM和4MRAM。  

由于用户需求不同,有些时候我们会修改RAM和ROM大小,一般就要相应的修改SCAT文件。在SCAT文件中,我们可以看到行ROM 0x00000000 0x00e00000,就是说可以使用的ROM从0x00000000开始,到0x00e00000结束,共计0x00e00000字节,在下面又可以看到这些ROM被分成四个4M的段使用。在SCAT的行EXTSRAM_LARGEPOOL_NORMAL 0x08000000处我们可以看到RAM的使用情况,地址从0x08000000开始, 到0x08400000 结束,共计0x00400000BYTE,即4MBYTE,如果你是32MROM,8MRAM,就要修改ROM
0x00000000 0x00e00000为

ROM 0x00000000 0x01c00000,修改DUMMY_END 0x08400000 0x04为    DUMMY_END 0x08800000 0x04,这样的修改,现在的ROM和RAM大小都为以前默认的2倍。

其实有时RAM紧张时不一定非要采用增加RAM来实现,这样成本较大,可以采用复用内存也可以节约大量内存。在SCAT文件中,很多时候,我们可以看到关健字overlay,这是一些手机的应用中为节省内存使用的复合内存,如INTSRAM_MULTIMEDIA 0x40000000 0xC000,声明了MED复用内存的起始地址,只要不冲突,这几乎是最好的解决内存紧张的方法。如果ROM超过了,可能会比较麻烦一些,去掉不必要的图片,音乐,减小图片的质量,去掉一些不必要的功能,把宏函数转为普通函数都可以节约一部分ROM。

如果RAM或者ROM编译到最后出错,提示ROM超了或者RAM超过了,这时就要精确计算超出部分的大小,然后再根据计算的大小寻找解决办法。计算的方法是打开LIS文件,把RAM或者ROM加起来,减去14或者4,超过的字节数,就是需要调整的内存大小

---------------------------------------------------------------------------------------

SCAT: 用于代码的重定位

FAT:文件系统

BIN: 二进制文件

scat文件在编译时的作用是告诉armlink生成的目标文件(也就是BIN文件时),各部分代码和数据的位置。在下载时flashtool根据scat文件得知BIN文件的下载位置和大小.scater文件并不是MTK引入的,而是ADS编译器定义的。SCAT文件的规范可以查看ADS的帮助文档。

---------------------------------------------------------------------------------------

PS : 平常我们老是以为, MTK 的 RAM 是 4M ,看lis 文件的时候,认为超过了4M 就爆内存了,其实不是这样的。mtk 还有一些内存,不是 外部内存,是 片内 内存,在scate文件里面就能晓得。MTK6225 好像是 (72+48)KB ,所以,这点要注意一下,有时候,为什么lis 最后的RAM 大小超过了实际的大小【4/8】M,也能生成,其实就是这个原因,这点在list文件里面可以看到。

============================================

sumsung 2833 :

ROM     0x0800000 0x00f0000 =15M

INTSRAM 0xa0000000 (0x12000)=72K

INTSRAM_0x40000000 (0xC000) =48K

EXTSRAM_0x00000200 (0x00400000) = 4M

RAM = 0x400000 + 0xC000 + 0x12000 =

Execution Region SINGLE_BANK_CODE (Base: 0x00000200, Size: 0x00001458, Max: 0xffffffff, ABSOLUTE)

Execution Region EXTSRAM_LARGEPOOL_NORMAL (Base: 0x00002000, Size: 0x001545c8, Max: 0xffffffff, ABSOLUTE)

Execution Region EXTSRAM (Base: 0x001565c8, Size: 0x002a1590, Max: 0xffffffff, ABSOLUTE)

Execution Region INTSRAM_CODE (Base: 0xa0000000, Size: 0x00005ee4, Max: 0x00006870, ABSOLUTE)

Execution Region INTSRAM_DATA (Base: 0xa0006870, Size: 0x000058e0, Max: 0x00005a00, ABSOLUTE)

Execution Region DYNAMIC_CODE_SXMOBI (Base: 0xa000c270, Size: 0x00000af0, Max: 0x00000d90, OVERLAY)

Execution Region DYNAMIC_CODE1 (Base: 0xa000d000, Size: 0x00002d00, Max: 0x00005000, OVERLAY)

Execution Region DYNAMIC_MIIPTS (Base: 0xa000d000, Size: 0x000035a0, Max: 0x00005000, OVERLAY)

Execution Region INTSRAM_MULTIMEDIA (Base: 0x40000000, Size: 0x0000b500, Max: 0x0000c000, ABSOLUTE)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: