怎样修改MTK Scatter 文件

来源:互联网 发布:大数据股票 编辑:程序博客网 时间:2024/05/29 13:20

 因为我的图片文件较大,容量超过了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 文件有错没有?要怎样改呀,请指点!!  
  附件为我的Scatter文件。

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

请按以下我说的去分析这个问题.
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的整数倍增加。

按照上面的去试下,应该可以开机.

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

scat  文件的大小可以随便改吗?? 那不是需要硬件支持吗? !!!

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,超过的字节数,就是需要调整的内存大小

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

请教11楼的兄台,我的是4M的RAM,lis文件的最后内容为:
================================================================================


      Code    RO Data    RW Data    ZI Data      Debug  

   6597536    7448732      52056    4266705    3730676   Grand Totals

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

    Total RO  Size(Code + RO Data)             14046268 (13717.06kB)
    Total RW  Size(RW Data + ZI Data)           4318761 (4217.54kB)
    Total ROM Size(Code + RO Data + RW Data)   14098324 (13767.89kB)

================================================================================
RAM 大小看起来已经超过4M(4318761)了,怎么编译没有报错,并且使用正常?


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

genhualiu Post at 2009-7-25 10:23:33
13楼的是不是内存复用了?

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

perennial Post at 2009-7-25 11:12:01
[QUOTE][B]以下是引用[i]genhualiu[/i]在2009-7-25 10:23:33的发言:
13楼的是不是内存复用了?

却是有内存复用,莫非lis文件里面列出的只是线性叠加,不考虑复用?
========================================================================

MTK6225平台。仅编译的时间不同,没有修改任何东西。同一台机器环境一样。全编后得到的bin文件(ROM文件)完全不同,但功能未发现不同。请高手释疑!

分析:
1、比较ROM文件和Sym文件,发现的第一处不同是EXTSRAM_BSS_Limit_Ptr指向的地址内容不同。查找发现Bootarm.s文件有如下动作:

  EXPORT  EXTSRAM_BSS_Limit_Ptr
EXTSRAM_BSS_Limit_Ptr
  IMPORT  |Image$$EXTSRAM$$ZI$$Limit|
  DCD    |Image$$EXTSRAM$$ZI$$Limit|


可见是变量Image$$EXTSRAM$$ZI$$Limit的初值不同。查找整个工程,只发现在custom_scatstruct.c文件中有如下声明:

extern kal_uint32 Image$$EXTSRAM$$ZI$$Limit;

这个变量在哪里定义赋值的没找到,难道它是根据时间不同随机生成的?Why?看名字是某块存储区域的限制大小,这个不应该在编译阶段就产生区别了吧。

2、比较.lis文件(相当于Cbuilder中的.map文件),发现以下四个域的大小都不同:
ROM1、ROM3、ROM4、EXTSRAM.

如下表:

域 Build1(start:size) Build2(start:size)
ROM 0x08000000: 0x0000032c 0x08000000: 0x0000032c
ROM0 0x08001000: 0x00000054 0x08001000: 0x00000054
ROM1 0x08001054: 0x001f90f0 0x08001054: 0x001f9164
ROM2 0x081fa144: 0x00111ae4 0x081fa144: 0x00111ae4
ROM3 0x0830bc28: 0x000e437c 0x0830bc28: 0x000e43dc
ROM4 0x083effa4: 0x000e46ac 0x083effa4: 0x000e476c
...
EXTSRAM 0x00100280: 0x0023bd8c 0x00100280: 0x0023bd90
...

两次编译链接用的scatter文件完全相同,大致结构是这样:
ROM 0x08000000 0x00a00000
{
    ROM 0x08000000 0x800
    {
        bootarm.obj (C$$code,+First)
    }
    ROM0 0x08001000 FIXED ;4KB
    {
        *.obj (SECINFO)
    }
    ROM1 +0x0 0x00400000
    {
        *.obj (LEADING_PART,+First)
        *plutommi.lib (+RO-CODE)
        *lcmmi.lib (+RO-CODE)
        *l4_classb.lib (+RO-CODE)
        *mtkapp.lib (+RO-CODE)
        *l1_classb.lib (+RO-CODE)
        *email.lib (+RO-CODE)
        *l4misc.lib (+RO-CODE)
       
        cpp_initialise.o(+RO)
        cpp_finalise.o(+RO)
        * (C$$pi_ctorvec)
        * (C$$pi_dtorvec)
        * (C$$ddtorvec)
    }
    ROM2 +0x0 0x00400000
    {
; WAP family
        *wapadp.lib (+RO-CODE)
        *wap.lib (+RO-CODE)
        *wae.lib (+RO-CODE)
        *jataayu.lib (+RO-CODE)
        *jataayuapp.lib (+RO-CODE)
        *wapapp.lib (+RO-CODE)
        *obigo05aadp.lib (+RO-CODE)
        *obigo05alib.lib (+RO-CODE)
; J2ME family
        *j2me_11.lib (+RO-CODE)
        *j2me_hi.lib (+RO-CODE)
        *jal.lib (+RO-CODE)
        *ijet_adp.lib (+RO-CODE)
        *jblendia.lib (+RO-CODE)
        j2me_custom_*.obj (+RO-CODE)
    }
    ROM3 +0x0 0x00400000
    {
        .ANY (+RO-CODE)
    }
    ROM4 +0x0 0x00400000
    {
        .ANY (+RO-CODE)
    }
    ROM5 +0x0
    {
        .ANY (+RO-DATA)
    }
    ROM_TAIL +0x0
    {
        *.obj (SECINFO_TAIL)
    }
...
怎么编译出来就不一样了呢?!

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

不过现在看应该和编译器没有多大关系。编译链接平台是ADS1.2

编译出来的.obj文件和lib文件都完全相同(除了注释中的时间信息)

而armlink出来以后的elf文件和bin文件就大相径庭了。从mak文件分析出来armlink命令大概是这样的:

c:/progra~1/arm/adsv1_2/bin/armlink.exe -map -info sizes,totals -symbols -xref -remove -first LARGEPOOL_FIRST_ZI -scatter ./scat.txt -output ./xxx.elf -symdefs ./xxx.sym -list ./xxx.lis -libpath c:/progra~1/arm/adsv1_2/lib -keep g_aaa -keep g_bbb -keep g_ccc -keep g_ddd -keep g_eee 
(后面是lib文件列表)

从网上查找到的信息显示armlink语法如下:
armlink [-help] [-vsn] [-partial] [-output file] [-elf] [-reloc][-ro-base address] [-ropi] [-rw-base address] [-rwpi] [-split] [-scatter file][-debug|-nodebug][-remove?RO/RW/ZI/DBG]|-noremove] [-entry location ] [-keep section-id] [-first section-id] [-last section-id] [-libpath pathlist] [-scanlib|-noscanlib] [-locals|-nolocals] [-callgraph] [-info topics] [-map] [-symbols] [-symdefs file] [-edit file] [-xref] [-xreffrom object(section)] [-xrefto object(section)] [-errors file] [-list file] [-verbose] [-unmangled |-mangled] [-match crossmangled][-via file] [-strict] [-unresolved symbol][-MI|-LI|-BI] [input-file-list]

其中几个重要参数解释如下:

-map 这个选项创建映像文件的信息图。映像文件信息图包括映像文件中的每个加载域,运行域和输入段的大小和地址,这里的输入段还包括调试信息和链接器产生的输入段。

-scatter file 这个选项使用在file中包含的分组和定位信息来创建映像内存映射。注意,如果使用了该选项的话,必须要重新实现堆栈初始化函数__user_initial_stackheap()。

虽然猜测应该是armlink的问题,但是还不能确定是那个步骤,哪个参数造成的。

原创粉丝点击