失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 怎样修改MTK Scatter 文件

怎样修改MTK Scatter 文件

时间:2021-04-26 01:04:57

相关推荐

怎样修改MTK Scatter 文件

因为我的图片文件较大,容量超过了14M,所以改用32MRom+8MRam,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 +0x00x00400000改成了ROM2+0x00x00800000(4M->8M);

分区3:ROM3 +0x00x00400000改成了ROM3+0x00x00800000(4M->8M);

分区4:ROM4 +0x00x00400000改成了ROM4+0x00x00800000(4M->8M);

3.把内存总大小改成了8M,原来才4M:

我把DUMMY_END 0x08400000 0x04改成了DUMMY_END 0x08800000 0x04

这样改后,我的16Mbin档烧进去后,还是开不了机。超过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 -7-25 10:23:33

13楼的是不是内存复用了?

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

perennial Post at -7-25 11:12:01

[QUOTE][B]以下是引用[i]genhualiu[/i]在-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的问题,但是还不能确定是那个步骤,哪个参数造成的。

如果觉得《怎样修改MTK Scatter 文件》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。