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.

SharedRegion内存共享问题



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