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.

固定变量地址是否可以实现?



我想每个核上定一个变量,固定其地址,这样方便EDMA将数在核之间传递。请问如何实现定义一个变量的同时给定它的地址?

  • yu fei您好,

    固定其地址?您是指固定在某一个section吗?有两个可以指定section的方法。

    1,  CCS5支持部分GCC extension(在project下的properties里的language Options里勾选-gcc enable后才能使用此功能)新增的变量属性,是可以在定义变量时指定它的section。

    例如:int a __attribute__((section ("INITDATA"))) = 0;   //定义了一个int变量a,并把a放在名为“INITDATA”的section中。

    更具体的用法描述:

    通常情况下,编译器会将对象放在section(段)中,如data段或bss段。然而,有时你需要额外的段,或者你需要使某些特定的变量出现在特殊的段中,例如映射到特殊的硬件上。section属性指定一个变量(或函数)存在于一个特定的段中。如下例,这段程序使用了一些特定的段名:

    struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };

    struct duart b __attribute__ ((section ("DUART_B"))) = { 0 };

    char stack[10000] __attribute__ ((section ("STACK"))) = { 0 };

    int init_data  __attribute__ ((section ("INITDATA"))) = 0;

    main()

    {

    init_sp (stack + sizeof (stack)); / *初始化堆栈指针* /

    memcpy (&init_data, &data, &edata - &data); / *初始化已初始化的数据* /

    / *打开串口* /

    init_duart (&a);

    init_duart (&b);

    }

    如上例所示,在一个全局变量的初始化定义中使用了section属性。

    2, 伪指令 #pragma data-section 也可以指定存储的段。用法:

    #pragma DATA_SECTION (symbol, " sectionname");

    例:#pragma DATA_SECTION(bufferB, "my_sect")

    char bufferA[512];

    char bufferB[512];

    注意:.If  you allocate a globa lvariable using a DATA_SECTION pragma and youwant to reference the variable in C code,you must declare the variable as extern far.

  • 感谢您的回答!

    我想问的是能否固定一个地址。我的理解是:仅仅指定一个段的话是编译时在这个段中分配一个地址,并不一定每次上电运行这个地址都相同。

    是否能够固定一个具体地址,比如0x0081B000,变量就固定放在这里?

  • 大家好,

    定义一个指针,指向你想使用的固定地址,这样不就合适了。

  • 您好!

    这样做是可以实现变量固定地址。请问有没有什么方法在定义指针之后保护其后一段空间,使得程序不在其中开辟变量?

    也就是说我想定义一个数组,只指定数组头的指针位置的话有可能其他变量的定义与其空间重合,如何能够避免这种冲突呢?

  • 您好,

    使用一个数组指针,指向这个地址,就可以了。

  • 使用指针,只能让你准确指向固定的地址空间,并不能保护这段地址空间,在你程序中,需要注意这一点。

  • 您好,

    需要定义满足你需要传输的足够大的数组,因为无法给与不确定大数组的固定的首地址,不然memory会崩溃的。

    如果是想用edma在核之间传数的话,是否考虑使用shadow region,给你想要单独传的核之间分配指定的channel,通过配置相关寄存器(DRE/DREH)MASK来指定channel

  • 您好!

    你试试用数组指针。

    比如 int (*p)[10] = 0x0081B000;

  • 可以通过更改CMD文件来实现

    比如你的数组长度为10 想把数组放在核0的0x820000~0x820100之间

    你可以做如下步骤:

    1.更改CMD文件在memory中加入位置如下:

    memory

    {

    data_core0  org = 0x10820000,len = 0x00000100

    }

    在section中加入test_data如下

    section

    {

    test_data > data_core0

    }

    2在工程文件中定义int a[10]的数组并指向你新添加的位置

    如下

    #pragma DATA_SECTION(a,"flag_data");

    static volatile int a[10];

    如果你想保护某块空间的话,你只要在CMD文件不要映射该块就行,或只让某些变量映射

     

     

    如果该问题已解决请勾选“这是建议答案”,感谢对TI的支持!