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,// 所有者的核IDisValid: 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
Denny%20Yang99373:
1,看看是否与CACHE有关系,没有真的写进去
2,通过仿真器连上各核,看memory browser,分析一下
Qian Tang:
回复 Adam Yao94020:
的确只是写入cache了,如何才能让其写入共享内存呢?
TI中文支持网