我想每个核上定一个变量,固定其地址,这样方便EDMA将数在核之间传递。请问如何实现定义一个变量的同时给定它的地址?
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的支持!