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设置变量的地址问题

.h文件里源代码如下:

long g_SampBufUab1[N], g_SampBufUab2[N], *g_SampPtrUab, *g_IpcbPtrUab;
long g_SampBufUbc1[N], g_SampBufUbc2[N], *g_SampPtrUbc, *g_IpcbPtrUbc;
long g_SampBufUca1[N], g_SampBufUca2[N], *g_SampPtrUca, *g_IpcbPtrUca;

Uint16 g_THDArrayUab[H_MAX+2], g_THDArrayUbc[H_MAX+2], g_THDArrayUca[H_MAX+2];

#pragma DATA_SECTION(g_SampBufUab1, "UFFTbuf");
#pragma DATA_SECTION(g_SampBufUab2, "UFFTbuf");
#pragma DATA_SECTION(g_SampBufUbc1, "UFFTbuf");
#pragma DATA_SECTION(g_SampBufUbc2, "UFFTbuf");
#pragma DATA_SECTION(g_SampBufUca1, "UFFTbuf");
#pragma DATA_SECTION(g_SampBufUca2, "UFFTbuf");
#pragma DATA_SECTION(g_THDArrayUab, "UFFTbuf");
#pragma DATA_SECTION(g_THDArrayUbc, "UFFTbuf");
#pragma DATA_SECTION(g_THDArrayUca, "UFFTbuf");
//ebss section
long g_R1I1Uab[2], g_R1I1Ubc[2], g_R1I1Uca[2];
long g_R1I1Usa[2], g_R1I1Usb[2], g_R1I1Usc[2];
long g_Us1Us2[5];

在UFFTbuf里放入了多个数组(只放入了这几个变量数组),想询问一下这几个数组的地址是否是按顺序排列的?目前在线调试显示变量的地址是没有按顺序的。

因为当前项目里用到了两片DSP,外部接了一个FPGA当外部RAM,在外部RAM里定义了UFFTbuf这个区域,想要把这几个数组变量放在一个段里并且这些变量在两个DSP里显示的地址一样。

  • 你好,

    我理解变量定义应该是在#pragma DATA_SECTION定义之后的。你尝试过么?

  • 您好,

       我尝试过将变量定义放在#pragma DATA_SECTION之后,查看变量的地址是一样的。

    .h文件如下:

    /*-------------------------------------------------------------*/
    // U variables
    /*-------------------------------------------------------------*/
    long g_SampBufUab1[N], g_SampBufUab2[N], *g_SampPtrUab, *g_IpcbPtrUab;
    long g_SampBufUbc1[N], g_SampBufUbc2[N], *g_SampPtrUbc, *g_IpcbPtrUbc;
    long g_SampBufUca1[N], g_SampBufUca2[N], *g_SampPtrUca, *g_IpcbPtrUca;

    Uint16 g_THDArrayUab[H_MAX+2], g_THDArrayUbc[H_MAX+2], g_THDArrayUca[H_MAX+2];

    #pragma DATA_SECTION(g_SampBufUab1, "UFFTbuf");
    #pragma DATA_SECTION(g_SampBufUab2, "UFFTbuf");
    #pragma DATA_SECTION(g_SampBufUbc1, "UFFTbuf");
    #pragma DATA_SECTION(g_SampBufUbc2, "UFFTbuf");
    #pragma DATA_SECTION(g_SampBufUca1, "UFFTbuf");
    #pragma DATA_SECTION(g_SampBufUca2, "UFFTbuf");
    #pragma DATA_SECTION(g_THDArrayUab, "UFFTbuf");
    #pragma DATA_SECTION(g_THDArrayUbc, "UFFTbuf");
    #pragma DATA_SECTION(g_THDArrayUca, "UFFTbuf");
    //ebss section
    long g_R1I1Uab[2], g_R1I1Ubc[2], g_R1I1Uca[2];
    long g_R1I1Usa[2], g_R1I1Usb[2], g_R1I1Usc[2];
    long g_Us1Us2[5];
    /*-------------------------------------------------------------*/
    // IL variables
    /*-------------------------------------------------------------*/
    //for FFT
    long g_SampBufILa1[N], g_SampBufILa2[N], *g_SampPtrILa, *g_IpcbPtrILa;
    long g_SampBufILb1[N], g_SampBufILb2[N], *g_SampPtrILb, *g_IpcbPtrILb;
    long g_SampBufILc1[N], g_SampBufILc2[N], *g_SampPtrILc, *g_IpcbPtrILc;

    Uint16 g_THDArrayILa[H_MAX+2], g_THDArrayILb[H_MAX+2], g_THDArrayILc[H_MAX+2];

    #pragma DATA_SECTION(g_SampBufILa1, "ILFFTbuf");
    #pragma DATA_SECTION(g_SampBufILa2, "ILFFTbuf");
    #pragma DATA_SECTION(g_SampBufILb1, "ILFFTbuf");
    #pragma DATA_SECTION(g_SampBufILb2, "ILFFTbuf");
    #pragma DATA_SECTION(g_SampBufILc1, "ILFFTbuf");
    #pragma DATA_SECTION(g_SampBufILc2, "ILFFTbuf");
    #pragma DATA_SECTION(g_THDArrayILa, "ILFFTbuf");
    #pragma DATA_SECTION(g_THDArrayILb, "ILFFTbuf");
    #pragma DATA_SECTION(g_THDArrayILc, "ILFFTbuf");
    //ebss section
    long g_R1I1ILa[2], g_R1I1ILb[2], g_R1I1ILc[2];
    long g_IL1IL2IL0[6], g_CosSinArray[2];
    long g_ILdqArray[6];

    //for IFFT
    long g_IFFTRebufILa[N], g_IFFTImbufILa[N];
    long g_IFFTRebufILb[N], g_IFFTImbufILb[N];
    long g_IFFTRebufILc[N], g_IFFTImbufILc[N];

    int16 g_IFFTbufILa[N], g_IFFTbufILb[N], g_IFFTbufILc[N];

    #pragma DATA_SECTION(g_IFFTRebufILa, "ILIFFTbuf");
    #pragma DATA_SECTION(g_IFFTImbufILa, "ILIFFTbuf");
    #pragma DATA_SECTION(g_IFFTRebufILb, "ILIFFTbuf");
    #pragma DATA_SECTION(g_IFFTImbufILb, "ILIFFTbuf");
    #pragma DATA_SECTION(g_IFFTRebufILc, "ILIFFTbuf");
    #pragma DATA_SECTION(g_IFFTImbufILc, "ILIFFTbuf");
    #pragma DATA_SECTION(g_IFFTbufILa, "ILIFFTbuf");
    #pragma DATA_SECTION(g_IFFTbufILb, "ILIFFTbuf");
    #pragma DATA_SECTION(g_IFFTbufILc, "ILIFFTbuf");

    /*-------------------------------------------------------------*/
    // IO variables
    /*-------------------------------------------------------------*/
    long g_SampBufIOa[N], g_SampBufIOb[N], g_SampBufIOc[N];
    Uint16 g_THDArrayIOa[H_MAX+2], g_THDArrayIOb[H_MAX+2], g_THDArrayIOc[H_MAX+2];

    #pragma DATA_SECTION(g_SampBufIOa, "IOFFTbuf");
    #pragma DATA_SECTION(g_SampBufIOb, "IOFFTbuf");
    #pragma DATA_SECTION(g_SampBufIOc, "IOFFTbuf");
    #pragma DATA_SECTION(g_THDArrayIOa, "IOFFTbuf");
    #pragma DATA_SECTION(g_THDArrayIOb, "IOFFTbuf");
    #pragma DATA_SECTION(g_THDArrayIOc, "IOFFTbuf");
    //ebss section
    long g_R1I1IOa[2], g_R1I1IOb[2], g_R1I1IOc[2];
    long g_IO1IO2IO0[6];
    int16 g_IOdqArray[6];
    /*-------------------------------------------------------------*/

    cmd文件如下:

    /*-l DSP281x_Headers_nonBIOS.cmd */
    MEMORY
    {
    PAGE 0 :


    BEGIN : origin = 0x3F7FF6, length = 0x000002 /* 2 Words User's Start Codes */
    FLASH_0 : origin = 0x3D8000, length = 0x000200 /* 512 Words .econst*/
    FLASH_1 : origin = 0x3D8200, length = 0x000200 /* 512 Words .switch and .pinit */
    FLASH_2 : origin = 0x3D8400, length = 0x000400 /* 1K Words .cinit */
    FLASH_3 : origin = 0x3D8800, length = 0x001F00 /* 8K-512 Words Program Ram functions Flash */
    FLASH_4 : origin = 0x3DA800, length = 0x01D7F0 /* 118K-10 Words .text */
    RESET : origin = 0x3FFFC0, length = 0x000002 /* 2 Words .reset */
    BOOTROM : origin = 0x3ff000, length = 0x000fc0 /* IQmath lib*/

    PRAMH0 : origin = 0x3F8002, length = 0x001EFB /*for program*/
    /*VECTORS : origin = 0x3fffc2, length = 0x00003e*/


    PAGE 1 :


    RAMM0 : origin = 0x000000, length = 0x000400 /* 1K Words .stack */
    RAMM1 : origin = 0x000400, length = 0x000400 /* 1K Words .esystem */

    RAML0L1 : origin = 0x008000, length = 0x002000


    RAMH0 : origin = 0x200000, length = 0x000102 /*store mag*/

    RAMOUT : origin = 0x100000, length = 0x080000 /*out RAM 512k*16*/
    }


    SECTIONS
    {
    .switch : > FLASH_1, PAGE = 0
    .pinit : > FLASH_1, PAGE = 0
    .cinit : > FLASH_2, PAGE = 0
    .text : > FLASH_4, PAGE = 0
    codestart : > BEGIN, PAGE = 0
    .reset : > RESET, PAGE = 0, TYPE = DSECT


    .stack : > RAMM0, PAGE = 1
    .esysmem : > RAMM1, PAGE = 1
    .ebss : > RAML0L1, PAGE = 1

    RFFTmag : > RAMH0, PAGE = 1

    RFFTipcb ALIGN(512) : { } > RAML0L1, PAGE 1
    CFFTipcb ALIGN(1024) : { } > RAML0L1, PAGE 1

    UFFTbuf : > RAMOUT, PAGE = 1
    ILFFTbuf : > RAMOUT, PAGE = 1
    ILIFFTbuf : > RAMOUT, PAGE = 1
    IOFFTbuf : > RAMOUT, PAGE = 1
    ISFFTbuf : > RAMOUT, PAGE = 1

    IQmathTables : load = BOOTROM, type = NOLOAD, PAGE = 0
    IQmath : load = FLASH_3, PAGE = 0
    RUN = RAML0L1, PAGE = 1
    RUN_START(_RAM_IQ_BEGIN), /*Define the run_Begin Adrress*/
    LOAD_START(_FLASH_IQ_BEGIN),
    LOAD_END(_FLASH_IQ_END)

    ramfuncs: LOAD = FLASH_3 PAGE = 0
    RUN = PRAMH0 PAGE = 0
    RUN_START(_RAM_RAMFUN_BEGIN), /*Define the run_Begin Adrress*/
    LOAD_START(_FLASH_RAMFUN_BEGIN),
    LOAD_END(_FLASH_RAMFUN_END)
    .econst LOAD = FLASH_0 PAGE = 0
    RUN = RAML0L1 PAGE = 1
    RUN_START(_RAM_CONST_BEGIN), /*Define the run_Begin Adrress*/
    LOAD_START(_FLASH_CONST_BEGIN),
    LOAD_END(_FLASH_CONST_END)

    FFTtf: LOAD = FLASH_4 PAGE = 0
    RUN = RAML0L1 PAGE = 1
    RUN_START(_RAM_FFTTF_BEGIN), /*Define the run_Begin Adrress*/
    LOAD_START(_FLASH_FFTTF_BEGIN),
    LOAD_END(_FLASH_FFTTF_END)

    现在存在着几组数组的变量都放在RAMOUT中,并且没有其他的变量会用到这。


  • 你好,

    我做了个简单的测试,没有复现你的问题。你能参考一下么?

    main.c

    #define   SRC_W   320
    #define   SRC_H   240

    #pragma DATA_SECTION(inBlkPtr, "my_sect" )
    #pragma DATA_SECTION(outBlkPtr, "my_sect" )
    unsigned char inBlkPtr[SRC_W*SRC_H];
    unsigned char outBlkPtr[SRC_W*SRC_H];

    cmd file

    MEMORY
    {
    ...
            DDR3_SR0:        org = 0x8F000000 len = 0x01000000    /* 16 MB */
    }


    SECTIONS
    {
    ...
         my_sect: {}> DDR3_SR0

    ...

    }

    generated map file:

    8f000000   inBlkPtr
    8f012c00   outBlkPtr

  • 您的意思我理解,这两个inBlkPtr,outBlkPtr按顺序和大小分配了地址,但是我的程序里现在显示的地址并不是按顺序的

    例如:SampBufUab1 0x00102140

                SampBufUbc1 0x00102340

                SampBufILa1   0x00101080

                SampBufILb1   0x00101A80

     这四个变量按地址顺序来说应该是Uab1<Ubc1<ILa1<ILb1 现在只是Uab1<Ubc1,ILa1<ILb1,是否是因为 #pragma DATA_SECTION定义是分开的缘故?并且起始位置也不是0x00100000。

    而且我现在两片DSP用一样的变量,一样的内存段,只有这些数组用这个内存段,但是显示这些变量的地址不一样。

  • 这是目前的地址显示,我已经把每一个变量放在#pragma DATA_SECTION后面了,这里变量的地址不是按顺序的,更别说从初始地址开始了
  • 你好,

    你的问题是C2000的么? 如果是,请到C2000论坛提问吧。我这里的芯片都没有page0/1的概念。不知道是不是编译器不同导致的。

    C2000论坛地址:

    http://www.deyisupport.com/question_answer/microcontrollers/c2000/f/56.aspx