我想每个核上定一个变量,固定其地址,这样方便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的支持!
TI中文支持网