This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

生成MLO文件



在资料里看到从.out文件生成MLO,可以用signGP也可以用ti image程序, 对比之后发现生成的文件在最开始的部分不同

signGP生成的二进制文件最开始只记录的image size, 不包括head size, 而ti image生成的文件显示的size是包含head size的

请问板载ROM在解析MLO的时候 如何区分size是否包含了head的大小? 两种文件都能运行 最后的区别在哪里?

  • 请问您指的是starterware么?不同的启动介质使用的MLO是不一样的。

  • 我用的是BBxM

    还有个问题, 先用CCS编译生成.out文件,然后用objcopy生成.bin文件,之后用signGP生成MLO文件,这个MLO可以在板子上运行

    我的问题是,在工程的CMD链接文件里, 如果写 .text > CS0_SDRAM, 生成的bin文件接近1GB,如果用.text > SRAM, 生成的bin文件只有几kB

    请问这是什么原因造成的, 有什么办法能避免生成这么大的bin文件?

    .out -> .bin -> MLO 是生成MLO的标准方法么?要是有什么别的办法?有没有相关的文档可以查看?、

    谢谢

  • 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方式了后,大小是否变小了?

  •  谢谢回复,我一开始只学习了汇编  还不是很清楚普通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里,但输出的文件还是很大

  • 首先,明确一点,如果一个程序足够小,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的地址是什么含义。然后再理解理解。

  • 谢谢回复,ARM Assembly Language Tools这个文档我也读了读, load的方法基本理解

    我想测试的就是裸机程序,没有系统, 程序由汇编初始化找入口点, 然后进入c主程序

    但问题是, 如果load到SRAM上, 编译输出之后最初的文件非常小, 但load到外部ram, 输出的文件接近1GB, 我想知道这个是为什么

    上面的两个例子 我试着用CCS6编译,但无法通过