怎样把一段二进制编译到mtk的bin里面去
2010-02-03 16:27
141 查看
最近需要让mtk在加电时把一个firmware的原原本本的download到我们芯片的指定位置中去,仔细分析了mtk的scattle和arm汇编后,发现可以采用如下方法实现。
mtk的sattle文件在costom/system中,在mak文件里的SYSGEN_ENABLE 宏代表是否自动产生sattle。
一.mtk系统中一般有一个连续的norflash空间和一片连续的sdram空间
所有的code当然事先都存入norflash里,到系统加电时有一些代码直接放在norflash上就地运行,而有些被搬到sdram中去运行
所以这样mtk系统中就有一个加载域和两个运行域(其中一个运行域就在nor上,而另外一个在sdram上)
ROM 0x00000000 0x00e00000 {
ROM 0x00000000 0x00400000
{
......
}
ROM2 +0x0 0x00400000
{
.......
}
ROM3 +0x0 0x00400000
{
.ANY (+RO-CODE)
}
ROM4 +0x0 0x00400000
{
.ANY (+RO-CODE)
}
ROM5 +0x0
{
.ANY (+RO-DATA)
}
INTSRAM_CODE 0xA0000000 0x7600
{
...
}
}
1.从MTK的Sattle文件看,mtk只有一个加载域,也就是最外层的那个大括号代表的域。
注意0x00000000 代表加载域的起始地址,简化起见,以下我们都用Load_start表示 0x00e00000代表加载域的最高地址,以下我们用Load_end表示。加载域是指代码和数据在系统未运行,也就是没有加电时所存放的位置,一般指flash.
2.在最外层大括号里的每个大括号包裹的区域代表一个运行时域,例如: ROM2 +0x0 0x00400000 ;+0x0代表运行时域的起始址,以下我们都用RUNNING_START表示;而0x00400000代表运行时域的最高地址,我们用 RUNNING_END表示。运行时域是指代码和数据在真正运行时所在的位置。
3.如果一个运行域的位置就包含在加载域之中,也就是说RUNNING_START在 Load_start和Load_end之间,那么就说明,加载域和运行域重叠了。意思就是这块代码就直接在flash里面运行,而不必被搬到sdram 中去。如果运行时域的位置不在加载域之中的话,也就是说RUNNING_START不在Load_start和Load_end之间,那么就说明该代码在运行时必须由bootload搬移到sdram中去运行。
二.建立一个汇编文件,文件名为cmmb.s代码如下。
AREA TEST, CODE, READONLY, ALIGN =2
INCBIN TEST.bin
END
这样编译出来的目标文件叫cmmb.o
三.修改scattle file, 在其中的ROM4中添加 "cmmb.o (TEST)"
四.把test.bin拷贝到和这个汇编文件同一目录,编译后生成cmmb.o
在scattle文件中的任意ROMx的运行时域中添加 cmmb.o(TEST)
五.在要去读取test.bin的代码中做如下声明
extern uint32 TEST[];
后续的代码可以通过TEST的标示符去访问test.bin里面的内容。
后续可以通过i2c,spi等等接口download
(注意,这段代表必须要确定是有机会调用的,否则编译器很可能在优化过程中不把cmmb.o中的TEST代码段link进image中)
mtk的sattle文件在costom/system中,在mak文件里的SYSGEN_ENABLE 宏代表是否自动产生sattle。
一.mtk系统中一般有一个连续的norflash空间和一片连续的sdram空间
所有的code当然事先都存入norflash里,到系统加电时有一些代码直接放在norflash上就地运行,而有些被搬到sdram中去运行
所以这样mtk系统中就有一个加载域和两个运行域(其中一个运行域就在nor上,而另外一个在sdram上)
ROM 0x00000000 0x00e00000 {
ROM 0x00000000 0x00400000
{
......
}
ROM2 +0x0 0x00400000
{
.......
}
ROM3 +0x0 0x00400000
{
.ANY (+RO-CODE)
}
ROM4 +0x0 0x00400000
{
.ANY (+RO-CODE)
}
ROM5 +0x0
{
.ANY (+RO-DATA)
}
INTSRAM_CODE 0xA0000000 0x7600
{
...
}
}
1.从MTK的Sattle文件看,mtk只有一个加载域,也就是最外层的那个大括号代表的域。
注意0x00000000 代表加载域的起始地址,简化起见,以下我们都用Load_start表示 0x00e00000代表加载域的最高地址,以下我们用Load_end表示。加载域是指代码和数据在系统未运行,也就是没有加电时所存放的位置,一般指flash.
2.在最外层大括号里的每个大括号包裹的区域代表一个运行时域,例如: ROM2 +0x0 0x00400000 ;+0x0代表运行时域的起始址,以下我们都用RUNNING_START表示;而0x00400000代表运行时域的最高地址,我们用 RUNNING_END表示。运行时域是指代码和数据在真正运行时所在的位置。
3.如果一个运行域的位置就包含在加载域之中,也就是说RUNNING_START在 Load_start和Load_end之间,那么就说明,加载域和运行域重叠了。意思就是这块代码就直接在flash里面运行,而不必被搬到sdram 中去。如果运行时域的位置不在加载域之中的话,也就是说RUNNING_START不在Load_start和Load_end之间,那么就说明该代码在运行时必须由bootload搬移到sdram中去运行。
二.建立一个汇编文件,文件名为cmmb.s代码如下。
AREA TEST, CODE, READONLY, ALIGN =2
INCBIN TEST.bin
END
这样编译出来的目标文件叫cmmb.o
三.修改scattle file, 在其中的ROM4中添加 "cmmb.o (TEST)"
四.把test.bin拷贝到和这个汇编文件同一目录,编译后生成cmmb.o
在scattle文件中的任意ROMx的运行时域中添加 cmmb.o(TEST)
五.在要去读取test.bin的代码中做如下声明
extern uint32 TEST[];
后续的代码可以通过TEST的标示符去访问test.bin里面的内容。
后续可以通过i2c,spi等等接口download
(注意,这段代表必须要确定是有机会调用的,否则编译器很可能在优化过程中不把cmmb.o中的TEST代码段link进image中)
相关文章推荐
- 怎样执行一段存放在字符串变量里面的java代码
- vsts编译silverlight工程为什么xap文件不能进入web project 的ClientBin文件夹
- 【怎样在fans-rt上进行开发】1.windows 系统下 gcc 交叉编译环境搭建(cortex-m3)
- MTK资源的编译
- 编译 pld 文件的时候缺少依赖文件: 怎样打patch
- Ubuntu14.04 编译 /usr/bin/ld: cannot find -l*** 问题
- c++编译时遇到的错误总结(不定期更新,遇到问题就写在这里面)
- 怎样查看Jsp编译后生成的Java文件
- .NET里面怎样防止SQL注入
- C# 如何在编译时将 dll 复制到 bin\Release 目录下
- MTK程序编译环境搭建之一
- 怎样把 excel 的数据导入到数据库里面去
- 怎样使用EDIUS里面的抠像功能
- VC6.0编译的DLL文件能否反编译知道里面的代码?
- MTK程序编译
- 转载+自练(莫喷)怎样在cocos2d 2.1.4里面使用动画和Texture Packer
- 编译报错 /usr/bin/ld: cannot find -lc 解决
- Eclipse怎样重新编译项目
- QT 怎样添加编译选项
- maven资源文件的相关配置才会在编译后的target里面有