在资料里看到从.out文件生成MLO,可以用signGP也可以用ti image程序, 对比之后发现生成的文件在最开始的部分不同
signGP生成的二进制文件最开始只记录的image size, 不包括head size, 而ti image生成的文件显示的size是包含head size的
请问板载ROM在解析MLO的时候 如何区分size是否包含了head的大小? 两种文件都能运行 最后的区别在哪里?
Jian Zhou:
请问您指的是starterware么?不同的启动介质使用的MLO是不一样的。
Zhiwen He:
回复 Jian Zhou:
我用的是BBxM
还有个问题, 先用CCS编译生成.out文件,然后用objcopy生成.bin文件,之后用signGP生成MLO文件,这个MLO可以在板子上运行
我的问题是,在工程的CMD链接文件里, 如果写 .text > CS0_SDRAM, 生成的bin文件接近1GB,如果用.text > SRAM, 生成的bin文件只有几kB
请问这是什么原因造成的, 有什么办法能避免生成这么大的bin文件?
.out -> .bin -> MLO 是生成MLO的标准方法么?要是有什么别的办法?有没有相关的文档可以查看?、
谢谢
Steven Liu1:
回复 Zhiwen He:
http://e2e.ti.com/support/development_tools/compiler/f/343/p/481211/1734607?keyMatch=out%20to%20bin%20conversion&tisearch=Search-EN-Everything
上面的链接解释了从out到bin的编译。
但是你提到的那个大小的问题,我觉得和MLO工程本身有关,因为MLO本身就只能运行在SRAM中,如果你把TEXT段定义到了SDRAM中了后,那对应的好些设置的属性也应该做相应的改动,这个可以参考一个普通的app程序是怎样定义自己的cmd file。
不考虑他是否能运行,而只是为了探究size问题,你把他的cmd改成了普通app的cmd load方式了后,大小是否变小了?
Zhiwen He:
回复 Steven Liu1:
谢谢回复,我一开始只学习了汇编 还不是很清楚普通app是怎么load的, 有没有文档可以参考?具体怎么设置?
我从新建工程里 选了hello world的例子,cmd文件里.text >SRAM, 默认设置编译之后bin的比较小的,.map文件显示hello.obj(.text)是在sram的里的
40204f0c 00000028 : strchr.obj (.text) 40204f34 00000028 : strcmp.obj (.text) 40204f5c 00000024 hello.obj (.text) 40204f80 00000024 rtsv7A8_A_le_eabi.lib : _lock.obj (.text) 40204fa4 00000020 : args_main.obj (.text) 40204fc4 0000001c : strlen.obj (.text) 40204fe0 00000018 : strcpy.obj (.text)
如果改成.text>CS0_SDRAM,bin文件又非常大,.map显示如下
80004ee0 0000002c : memchr.obj (.text) 80004f0c 00000028 : strchr.obj (.text) 80004f34 00000028 : strcmp.obj (.text) 80004f5c 00000024 hello.obj (.text) 80004f80 00000024 rtsv7A8_A_le_eabi.lib : _lock.obj (.text) 80004fa4 00000020 : args_main.obj (.text) 80004fc4 0000001c : strlen.obj (.text) 80004fe0 00000018 : strcpy.obj (.text)
怎么才能设置使自己写的文件运行在sdram里, 系统默认的文件运行在sram里?
SECTION里这样写,
.text > SRAM .text{hello.obj (.text)} > CS0_SDRAM
map文件:
.text 0 40200000 00005014 40200000 00001a70 rtsv7A8_A_le_eabi.lib : _printfi.obj (.text) 40201a70 0000063c : memory.obj (.text) 402020ac 00000548 : lowlev.obj (.text) 402025f4 000004cc : trgdrv.obj (.text) 40202ac0 000002d4 : fopen.obj (.text) 40202d94 000002b8 : ull_div32.obj (.text)
…..
40205000 00000008 : pre_init.obj (.text) 40205008 00000004 : i_div0.obj (.text) 4020500c 00000008 hello.obj (.tramp.main.1)
.text 0 80000000 0000002c 80000000 00000024 hello.obj (.text) 80000024 00000008 rtsv7A8_A_le_eabi.lib : printf.obj (.tramp.printf.1)
只有hello.obj的text定义在SDRAM里,其余的.text还是在SDRAM里,但输出的文件还是很大
Steven Liu1:
回复 Zhiwen He:
首先,明确一点,如果一个程序足够小,load到内部的SRAM和外部的DDR都可以。
但是如果你的是bootloader,这个里面会对DDR进行配置的,就需要load到内部的SRAM上。
所以考虑load到哪里,要从size大小和功能两个方面来考虑。内部的SRAM只有100+K左右,而DDR则会有上G。
至于文件load到哪里怎么设置,读cmd文件,多比较多想想就清楚了。
举个例子:
Load到sram中的:C:\ti\AM335X_StarterWare_02_00_01_01\build\armv7a\cgt_ccs\am335x\evmskAM335x\bootloader
load到ddr上的:C:\ti\AM335X_StarterWare_02_00_01_01\build\armv7a\cgt_ccs\am335x\evmskAM335x\edma
比较一下两个cmd有哪些不同,为啥会有这个不同,这些load的地址是什么含义。然后再理解理解。
Zhiwen He:
回复 Steven Liu1:
谢谢回复,ARM Assembly Language Tools这个文档我也读了读, load的方法基本理解
我想测试的就是裸机程序,没有系统, 程序由汇编初始化找入口点, 然后进入c主程序
但问题是, 如果load到SRAM上, 编译输出之后最初的文件非常小, 但load到外部ram, 输出的文件接近1GB, 我想知道这个是为什么
上面的两个例子 我试着用CCS6编译,但无法通过