SharedRegion内存共享到底是个什么机制呀?
我在主核上通过Memory_alloc分配了一段共享内存,然后在这段内存中写入数据,之后通过Notify模块就这个地址传递给了从核。
从核获得这个地址后,读取这个地址的内容发现同原来写入的数据不一样,这到底是个什么回事呀?
下面是我的代码:
.cfg文件中的SharedRegion设置
var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
/* Shared Memory base address and length */
var SHAREDMEM_0 = 0x0c000000;
var SHAREDMEMSIZE_0 = 0x00200000;
SharedRegion.setEntryMeta(0, // 区域ID
{ base: SHAREDMEM_0, // 基地址
len: SHAREDMEMSIZE_0, // 区域大小
ownerProcId: 0, // 所有者的核ID
isValid: true, // 对于当前核,该区域是否有效
name: "DDR2_RAM_0", // 区域名称
});
.c文件中的相关代码:
if (coreId == 0) {
inBuf = (unsigned char*)Memory_alloc(SharedRegion_getHeap(0), dateNum, 128, NULL);
if(inBuf==NULL)
{
System_printf("malloc Buf failed\n");
BIOS_exit(0);
}
for(i=0;i<dateNum;i++){
inBuf[i]=i*3+5;
}
inBuf_srptr = SharedRegion_getSRPtr(inBuf, 0);
inBuf=SharedRegion_getPtr(inBuf_srptr);
System_printf("inBuf address 0x%x\n",inBuf);
System_printf("outBuf date is ");
for(i=0;i<dateNum;i++)
System_printf("%d ",inBuf[i]);
System_printf("\n");
for(i=1;i<8;i++)
status = Notify_sendEvent(i, INTERRUPT_LINE, BufEVENT, (UInt32)inBuf_srptr, TRUE);
}else{
Semaphore_pend(semHandle, BIOS_WAIT_FOREVER); // 等待从核完成全部任务
inBuf=SharedRegion_getPtr(inBuf_srptr);
System_printf("inBuf address 0x%x\n",inBuf);
System_printf("regionId is %d\n",SharedRegion_getId(inBuf));
System_printf("outBuf date is ");
for(i=0;i<dateNum;i++)
System_printf("%d ",inBuf[i]);
System_printf("\n");
}
结果:
[TMS320C66x_0] inBuf address 0xc02d780
[TMS320C66x_1] registerEvent status is 0
[TMS320C66x_0] outBuf date is 5 8 11 14 17 20 23 26 // 这里是输入数据
[TMS320C66x_0] SharedMem is finished
[TMS320C66x_1] inBuf address 0xc02d780
[TMS320C66x_2] inBuf address 0xc02d780
[TMS320C66x_3] inBuf address 0xc02d780
[TMS320C66x_4] inBuf address 0xc02d780
[TMS320C66x_5] inBuf address 0xc02d780
[TMS320C66x_6] inBuf address 0xc02d780
[TMS320C66x_7] inBuf address 0xc02d780
[TMS320C66x_1] regionId is 0
[TMS320C66x_2] regionId is 0
[TMS320C66x_3] regionId is 0
[TMS320C66x_4] regionId is 0
[TMS320C66x_5] regionId is 0
[TMS320C66x_6] regionId is 0
[TMS320C66x_7] regionId is 0
[TMS320C66x_1] outBuf date is 255 255 255 255 128 40 29 0 // 输出数据
[TMS320C66x_2] outBuf date is 255 255 255 255 128 40 29 0
[TMS320C66x_3] outBuf date is 255 255 255 255 128 40 29 0
[TMS320C66x_4] outBuf date is 255 255 255 255 128 40 29 0
[TMS320C66x_5] outBuf date is 255 255 255 255 128 40 29 0
[TMS320C66x_6] outBuf date is 255 255 255 255 128 40 29 0
[TMS320C66x_7] outBuf date is 255 255 255 255 128 40 29 0
[TMS320C66x_1] SharedMem is finished
[TMS320C66x_2] SharedMem is finished
[TMS320C66x_3] SharedMem is finished
[TMS320C66x_4] SharedMem is finished
[TMS320C66x_5] SharedMem is finished
[TMS320C66x_6] SharedMem is finished
[TMS320C66x_7] SharedMem is finished