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.

关于DSP6747 boot Nor模式加载段问题

TI技术您好:

         我用的DSP6747的boot nor模式,Flash中的段需要自己烧写和加载,现在有两个问题咨询下:

        1、cmd中哪些段是必须烧写到Flash中的?我之前只知道vectors段和text段,后来经过测试发现,.cinit段也需要烧写和加载。其他必须要加载的段还有什么?有哪些官方文档可以参考?

        2、关于C6747 boot Nor模式的Configure Word,我看手册说上电后,CPU会自动读取4个字节,即Configure word,然后判断数据宽度和要加载的Secondbootloader大小,是1k还是多少,那么这个Configure word被cpu读取后放到哪个位置了,是L2RAM 首地址0x11800000吗?

            我看手册说是0x11800000,然后调到0x11800004位置开始执行second bootloader代码,我的second bootloader必须放到0x11800004位置吗?

   十分感谢。

  • 1. 初始化段(Initialized Sections)是需要烧写到flash里的。

    2.  secondary bootloader没有大小限制,不超过32k就可以了。但通常二次bootloader只是做一些简单的初始化设置和程序搬移,一般不会很大。如果你的应用程序小于32K的话,不需要二次bootloader。 

    3. 是的,configuration word是放在0x11800000开始处的4个byte, secondary bootloader是放到0x11800004。

    请参考下面的wiki网站。
     http://processors.wiki.ti.com/index.php/Secondary_Bootloaders_on_OMAP-L1x

  • Shine Zhang 您好:

       很高兴您能帮助解答问题,我还有一点疑问:

       就是除了.vectors段 .text段 ,cinit段以外,像是.far .bss这些需要烧写到Flash中吗?

      我再cmd中加入 .bss       : load = FLASH_BSS, run = BSS_L2RAM ,编译工程就会出现警告

      LOAD placement ignored for ".bss": linker.

      意思好像是加载被忽略了。.far也是同样问题,我理解的意思就是这两个不需要烧写到Flash,是吗?

    十分感谢。

  • .bss段是非初始化段,不用烧写。你可以看一下map文件,里面会告诉哪些段是初始化段,哪些是非初始化段。

    在hex工具转的时候,用-boot选项就可以把所有的初始化段转成hex文件。

    请看下面的文档第275页上的表。
    http://www.ti.com/lit/ug/spru186w/spru186w.pdf 

  • Shine Zhang您好:

      关于以下cfg_word的空间分配长度不应该是0x00000004吗,为什么是0x00000020,我试了以下,改成长度为4,结果生成的map文件运行地址给我改成了0x00000020,这个是为什么?

    -stack 0x1000
    -heap  0x1000
    
    MEMORY {
        CFG_L2RAM:    o = 0x11800000  l = 0x00000020
        PROG_L2RAM:   o = 0x11800020  l = 0x00003FE0
    }
    
    SECTIONS {
        .entryPoint >       PROG_L2RAM
        .text	> PROG_L2RAM
        .data	> PROG_L2RAM
        .const	> PROG_L2RAM
        .far	> PROG_L2RAM
        .switch	> PROG_L2RAM
        .cinit	> PROG_L2RAM
        .bss	> PROG_L2RAM
        .cio	> PROG_L2RAM
        .stack	> PROG_L2RAM
        .sysmem	> PROG_L2RAM
        .nor_cfg_word > CFG_L2RAM
    }
  • 定义长度4也可以。请问你是怎么改的?map文件打开的是新生成的吧?

  • Shine Zhang您好:

       是这样的,我现在主要想弄明白为什么我的配置字给3个字节的00,二次启动代码运行位置在0x118000000的位置也能运行,而且我的用户程序都已经大于了64K了跑的也没问题。为了确认配置字的问题,我特意做了一个实验:

      我主板的配置: DSP6747+FPGA架构,DSP和FPGA共用FPGA的SPI Flash,DSP的复位引脚和EMIF总线和FPGA相连接。

    我利用FPGA中的FIFO,用串口向FIFO中发送2个0x00,然后释放DSP复位引脚,发现DSP EMIF_Addr增加到了0x02,说明共读了两个字节停止了。

    我利用FPGA中的FIFO,用串口向FIFO中发送3个0x00,然后释放DSP复位引脚,发现DSP在CS2空间读取了0x400个数据,刚好1K,加上3个配置字是0x403,

    我利用FPGA中的FIFO,用串口向FIFO中发送4个0x00,然后释放DSP复位引脚,发现DSP在CS2空间读取了0x400个数据,刚好1K,加上3个配置字是0x403,

    我不知道为什么,这个问题还是没想明白,这种现象是否正常?

    多谢您。

  • 有啥不明白的,0不就是1KB的legacy NOR boot吗。

  • Tony Tang 您好:

           这个配置的说明我再datasheet上看到了,我不明白的地方有两点:

          第一点事为什么我配置字写3个0x00,和写4个0x00,cpu都会自动拷贝1K,按照说法应该是4个0x00

         第二点,按照手册说法,应该是拷贝4个0x00,然后跳转到0x11800004处执行boot代码,为什么我放到0x11800000处,配置字是3个0x00,我的用户代码也可以正常执行。

    十分感谢您。这个问题我想了好几天了,还是没想太明白。

  • beihang873 说:
    第一点事为什么我配置字写3个0x00,和写4个0x00,cpu都会自动拷贝1K,按照说法应该是4个0x00

    DSP并不知道你配置了几个,它的动作只有一个,上电后从flash首地址去读4个byte,不管你配置了几个。所以你认为只配置了3了,那第4个byte的值是多少呢?是不是它读回的也是0呢。

    beihang873 说:
         第二点,按照手册说法,应该是拷贝4个0x00,然后跳转到0x11800004处执行boot代码,为什么我放到0x11800000处,配置字是3个0x00,我的用户代码也可以正常执行。

    你的cmd里的下面这句是根据什么来的?你的flash里的内容到底是什么样的?

    .entryPoint >       PROG_L2RAM
  • Shine Zhang您好:

       我的cmd如下所示:

        

      _boot是second bootloader启动代码的标号

     生成的map文件:

    OUTPUT FILE NAME: <SDRAM.out>
    ENTRY POINT SYMBOL: "_boot" address: 11800020

    后来我发现这个入口地址至少是32字节对齐。

    我强制4字节对齐,还是不能把入口地址设置到0x11800020,这个是为什么?   十分感谢

    附件为cmd文件和bootloader程序,麻烦帮忙看下cmd文件是否有问题,再次感谢


    cmd和bootloader.rar
  • 这句话有问题啊。明白load和run的区别吗?run address才是真正的link address.

    .boot_load  : load = FLASH_BOOT , run = BOOT_L2RAM2

  • Tony Tang:您好

           这个有什么问题呢?load是加载地址,从外部flash加载,run是运行地址,是L2RAM。

          还是run地址有问题?0x11800000-0x11800003放的是Configuration word,secondbootloader从0x11800004地址开始运行。

         

          十分感谢您。

  • 在编译链接的时候这个load地址是多余的,看上去很清楚,实际上老是让人误会它的作用.

    记住link即链接的时候,只按run地址,所以你上上面最后的结果显示_boot就是在BOOT_L2RAM2,跟FLASH_BOOT这个地址段没有任何关系。

    load address字面上是加载地址没错,但是这个需要告诉谁呢,好象没有哪个步骤需要关心这个,这是你自己在烧flash时自己指定的地址。

    直接把这个load部分删掉就可以了。

  • Tony Tang:

         您好 :

         可能我没说明白我的问题,我的问题是我的entry_point地址是从0x11800004开始,为什么map文件生成的entry_point是0x11800020,32字节对齐。

         十分感谢

  • 解释在这,因为取指包大小是32Byte,所以编译器把section都按32B对齐了。

    https://e2e.ti.com/support/development_tools/compiler/f/343/t/580266

    但是还是可以用绝对地址指令入口地址的。

    SECTIONS
    {
    .boot_load > 0x11800004