怎样修改MTK Scatter 文件
因为我的图片文件较大,容量超过了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的问题,但是还不能确定是那个步骤,哪个参数造成的。
怎样修改MTK Scatter 文件相关推荐
- android mmi 联想手机,[分享教程] 深入了解MTK方案刷机之“Scatter”文件
4.jpg (105.79 KB, 下载次数: 20) 2012-11-9 11:47 上传 为什么需要Scatter文件: 制定存储器映射(memory map)的方法基本上有二种,一是在link时 ...
- MTK DTS 文件配置
mtk dts文件的配置 一.dts学习(注:pin 包括但不属于 gpio)1.gpio0 node编写方法:gpio0: gpio@0 {pins_cmd_dat {pins = <PINM ...
- Android系统定制源码修改 - MTK平台
Android系统定制源码修改 - MTK平台 1.修改开机弹出欢迎使用SIM MTK工程/mediatek/packag ...
- mtk dts文件的配置
mtk dts文件的配置 一.dts学习(注:pin 包括但不属于 gpio)1.gpio0 node编写方法:gpio0: gpio@0 {pins_cmd_dat {pins = <PINM ...
- armlink 第四章 scatter文件举例
armlink 第四章 scatter文件举例 在前面学习了基本术语和概念之后,本章是加强scatter编写能力的章节. 4.1 什么时候使用scatter文件 scatter文件通常用于嵌入式系统中 ...
- 【TX2】TX2开发板系统默认串口有ttyS0(调试口)、ttyTHS1、ttyTHS2、ttyTHS3,通过修改设备树文件,可以新增三个串口
1.简述 TX2开发板系统默认串口有ttyS0(调试口).ttyTHS1.ttyTHS2.ttyTHS3,通过修改设备树文件,可以新增三个串口. 2.设备树 设备树中关于串口部分的描述 2.1 基础配 ...
- 修改MySQL日志文件位置
MySQL日志文件相信大家都有很多的了解,MySQL日志文件一般在:/var/log/mysqld.log,下面就教您修改MySQL日志文件位置的方法,供您参考. 今天需要改MySQL日志文件的位置, ...
- git放弃修改放弃增加文件
1. 本地修改了一堆文件(并没有使用git add到暂存区),想放弃修改. 单个文件/文件夹: git checkout -- filename 所有文件/文件夹: git checkout . 2. ...
- mysql 设置表空间位置_如何修改表空间数据文件路径
如何修改表空间数据文件路径 -- 修改表空间的数据文件路径: -- 5个步骤 -- 1. alter tablespace tbs_name offline; -- 2. 物理拷贝到指定路径[这个很重 ...
- linux chcon命令 修改对象(文件)的安全上下文
修改对象(文件)的安全上下文 chcon命令 是修改对象(文件)的安全上下文,比如:用户.角色.类型.安全级别.也就是将每个文件的安全环境变更至指定环境.使用--reference选项时,把指定文件的 ...
最新文章
- TOJ 3750: 二分查找
- 026_Pagination分页
- 部署在sae上的servlet程序出现is not a javax.servlet.Servlet 错误
- java调用reader的nextInt_Java中如何从键盘输入内容: import java.util.Scanner; .nextLine(); .hasNextInt();...
- asp.net core源码飘香:从Hosting开始
- 【数学建模】day02-整数规划
- python pymysql_python使用pymysql实现操作mysql
- BZOJ 1007 [HNOI2008]水平可见直线 ——半平面交 凸包
- [Audio processing] Harmonic change detection function (HCDF)
- Vue err:This dependency was not found
- css如何去掉已经存在的样式_CSS 选择器的介绍和使用(一)
- 气象数据产品下载网址汇总
- android stagefright框架
- 第一个Mac程序——倒计时v1v2
- 如果使用CSS创建表格显示
- C++的依赖倒置原则
- keras使用LSTM生成文本
- CNN数据集——自己建立数据集要点
- Android 科大讯飞 语音听写
- 京东数科DevOps落地攻略