TI中文支持网
TI专业的中文技术问题搜集分享网站

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

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

Melody Chen:

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.

yu fei:

回复 Melody Chen:

感谢您的回答!

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

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

noaming:

回复 yu fei:

大家好,

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

yu fei:

回复 noaming:

您好!

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

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

noaming:

回复 yu fei:

您好,

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

noaming:

回复 yu fei:

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

Ellie Jiang:

您好,

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

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

Bruce Chen1:

回复 Ellie Jiang:

您好!

你试试用数组指针。

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

Yue Cao:

可以通过更改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的支持!

赞(0)
未经允许不得转载:TI中文支持网 » 固定变量地址是否可以实现?
分享到: 更多 (0)