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.

如何使用#pragma DATA_SECTION将一个初始化数组放到DDR3中去

Other Parts Discussed in Thread: SYSBIOS

Hi:

    大家好,我在a.c中写了如下的一段代码:

   #pragma DATA_SECTION(TEST_DATA,".Test_Data");

  const unsigned int TEST_DATA[1024] = {0x21,0x3c,0x58,0x79,...}

  .Test_Data在cfg文件中被指定放在DDR3中起始位置为0x80000000, 然后编译,下载代码,查看0x80000000,发现该位置是全0值,而不是TEST_DATA的初始化值,请问这种情况该怎么解决?

  • Jerry,

             您在下载代码之前有没有初始化DDR接口? 如果没有初始化DDR, 可以用一个GEL脚本先做初始化,再下载代码。 同时注意代码中不能再有DDR的初始化过程。

             如果您的商用软件版本也需要把一个常数表放在DDR,需要考虑类似的问题,即下载DSP代码之前,需要初始化DDR接口。这个可以基于您的单板系统设计做进一步讨论。

  • 我们目前还在调试阶段,使用仿真器,加GEL的方式调试的,使用的GEL使TI提供的6670的GEL,我搜索了一下,GEL中用这样的一个函数ddr3_setup_auto_lvl_1333(0)操作,应该是将DDR初始化了,在此基础上下载代码,放在DDR的值任然看不到,请问这种情况该怎么解决?

  • 我做了一个实验,将之前的数据不放在0x80000000开始的地方,而是放在0xa0000000开始的地方,数据不再是全0,而是初始化的值,这个能说明什么呢?

  • 能做个复现小工程发上来看看吗? 谢谢!

  • Jane 您好,我这两天一直想做一个小工程来复现我遇到的问题,但是都失败了,不管是有Sysbios的,还是没有sysbios的小工程,初始化数据都可以直接放入到0x8000 0000开始的地方,但是在我们的正式工程中数据仍然不能正确初始化。我使用RTSC做的内存规划,请问这样是否有问题;

  • 另外请教一个问题,我有四个段.DAF_OSS,.DAF_ShareMem,.DRV_QMSS,.DRV_CPPI, 我想将这四个段放到共享Memory中,并且先后顺序固定,请问该如何配置.cmd;谢谢!

  • Jerry,

                可以用Group方式实现:

                  GROUP{

                    .DAF_OSS

                    .DAF_ShareMem

                    .DRV_QMSS

                     }  >  XX_Memory

     

     

  • Jane,谢谢你的回答,请问在哪里可以找到如何编写cmd的教程?谢谢!

    另外之前的DDR 0x80000000-0xa0000000这段内存不能存放初始化数据这个问题,我把我们的RTSC配置发上来,麻烦你看一下,这样写有什么问题?

    谢谢!

  • Jerry,

               关于CMD的教程您可以参考spru186文档。

               关于DDR的问题,您是在C6670的EVM单板上测试吗? 若是,C6670 EVM板上DDR的size是512M,也就是说DDR memroy的0xa0000000其实和0x80000000对应了同一个物理单元(地址回卷了)。 您的rtsc配置中不能再对0xa0000000开始的空间进行定义。

  • Jane,

          你好,我们不是使用的C6670的EVM板,是自己设计的基带板,外挂DDR3的size是2G,不知道这样会不会有问题?谢谢!

  • Jerry,

               如果是2G的DDR,RTSC上memory配置应该没有问题。您前面提到单独的小工程也没有复现问题,是基于这个rtsc的配置吗? 

               全局变量的初始化工作是在_cint00函数中完成,您能在这个函数执行前看一下DDR的数据情况,然后在main函数前再看一下0x80000000的值?

               

  • Jane,

          请问_cint00()函数在哪里,如何查看_cint00()函数?_cint00()执行前如何查看0x80000000的值?谢谢!

  • Jane,

           你好,我刚才又做了一个实验,还是使用相同的RTSC配置,但是将所有的数据都放在0x80000000-0xa0000000这个范围内,发现所有的初始化数据都正确了,这个实验是不是证明0xa0000000以后的地址覆盖了0x80000000-0xa0000000的地址,但是我们的DDR大小确实是2G,应该是的我的配置出了问题,导致系统未识别0xa0000000以后的地址,请问该如何解决这个问题?

  • Jerry,

                   _c_int00的位置可以搜索一下map文件得到。

                  DDR是2G byte 还是 2G bit?

                   如果是2G Byte, 根据您新提供的信息,建议您根据论坛上提供的memory测试文档和代码做一下address test, 看看是否硬件有问题?

    http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/21928.aspx

    http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx(这个开发包里有memory测试例程,您把DDR的地址范围改为2G)

  • _cint00()函数的位置建议你查看*.map文件,例如:

    ******************************************************************************

    TMS320C6x Linker PC v7.4.1
    ******************************************************************************
    >> Linked Mon Feb 10 13:00:10 2014

    OUTPUT FILE NAME: <../example.out>
    ENTRY POINT SYMBOL: "_c_int00" address: 84080b40

    Br

    William

  • Jane,yuanwen dong,

            谢谢你们的大力支持,DDR3 0x80000000-0xa0000000这段地址初始化出错的问题已经找到,是硬件工程师将2G的DDR3芯片换成了512M的DDR3芯片,没有告诉我们;再次感谢两位的帮助。借楼再请教一个问题:6670有4个核,想将每个CoreL2SRAM划分为大小不同的Memory块?e.g. Core 0 L2划分为2块,Code_memData_mem,两块大小分别为0x80000Core 1L2划分为三块,分别为Code_memData_memDebug_mem,大小分别为0x80000,0x500000x30000Core 2L2划分为2块,Code_memData_mem,两块大小分别为0x900000x70000Core3L2划分为2块,分别为Code_memData_mem,大小分别为0x300000xD0000。上述需求通过统一的RTSC无法实现,请问如何才能满足上述需求,谢谢!

  • 你好,

    通常情况下,可以多核可以通过编译出一个.out,每个核下载相同的代码,然后在代码中通过判断DNUM寄存器核号的方式,让每个核走不同流程。

    针对这种情况,我只用过建立多个工程,然后分别修改各自的linkscript.cmd文件进行编译出多个执行文件的方式实现。

    没有用过RTSC, Jane可能有好主意。

    Br

    William

  • 你好,

        在建立sys/bios工程时,必须选择一个rtsc的包,默认的6670包里面也有内存的划分,使用自己的cmd文件对存储器进行划分时,会和这个包里面的划分冲突,如何解决这个问题呢?


  • Jerry,

               您可以通过file-> new -> new RTSC Platform 建一个customerized RTSC 平台, 在建立过程中,选择custmized memory.

  • Jane,

         我之前就是用的这种方法建立RTSC,但是这种方法建立的内存分配,所有核的分配方案是一样的,我现在想用对L2不同核,使用不同的分配方案。请问一下,如何在工程连接时,系统不识别RTSC分配的内存,而识别自己编写的cmd的内存分配。在Sysbios手册6.3.4中有一个链接http://rtsc.eclipse.org/cdoc-tip/xdc/cfg/Program.html#sections.Exclude,该页上介绍了一个指令Program.memoryExclude = Bool false;当Program.memoryExclude值为True时,可以排除,但是在我的sysbios中,program下没有memoryExclude这个指令,我的sysbios版本是6.32.5.54,请问这个怎么解决,谢谢!

  • Jerry,

               建议用下面的方法:

                 1    所有核共有的section在RTSC cfg文件中定义

                 2   每个核不同的部分单独写*.cmd

               一个CCS工程允许有多个配置文件的。