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.

MSMC issues of coherency



I am accessing MSMC from ARM and DSP simultaneously and I have encountered Issues of coherency. I am loading DSP using MPM utility.  code snippets for ARM and DSP are as:

ARM:

int main()
      {
 
	int  fd, Offset, PageSize, Address;
	int * BaseAddress;
        int ARM_MessageQ, ARM_ServiceQ, ARM_DoorBell, DSP0_MessageQ, DSP0_ServiceQ, DSP0_DoorBell; 

	fd = open("/dev/mem", O_RDWR );
	if(fd < 0)
	{
		printf("Could not open /dev/mem \n");
		return -1;
	}

	PageSize =  sysconf(_SC_PAGE_SIZE);
	Address  =  (0xc000000 / PageSize) * PageSize;
	Offset   =  0xc000000 - Address;
		 
	BaseAddress = mmap(NULL, Offset + 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, Address);
        if(!BaseAddress)
         return -1;
        
     ARM_MessageQ = BaseAddress;
     ARM_ServiceQ = BaseAddress + 0x04;
     ARM_DoorBell = BaseAddress + 0x08;

     DSP0_MessageQ = BaseAddress + 0x10;
     DSP0_ServiceQ = BaseAddress + 0x14;
     DSP0_DoorBell = BaseAddress + 0x18;

	if(mpm_load("dsp0", "MSMC_example.out", & ErrorCode) != 0)
		printf(" Load Error Code for dsp0 is 0x%08x \n", ErrorCode);

	
	if(mpm_run("dsp0",  & ErrorCode) != 0)
		printf(" Run Error Code for dsp0 is 0x%08x \n", ErrorCode);


	while(1)
	{
		if( (ARM_MessageQ - ARM_ServiceQ) > 0   )
		{		

			printf("%d, ",ARM_ServiceQ);
                        ARM_ServiceQ = ARM_ServiceQ +1;
                        DSP0_MessageQ = DSP0_MessageQ + 1;
                        DSP0_DoorBell = DSP0_DoorBell + 1 
                }
        }
 return 0;
 }

DSP:

int main()
      {
 
	int  fd, Offset, PageSize, Address;
	int * BaseAddress;
        int ARM_MessageQ, ARM_ServiceQ, ARM_DoorBell, DSP0_MessageQ, DSP0_ServiceQ, DSP0_DoorBell; 

	
        BaseAddress= 0xc000000;
       
        
     ARM_MessageQ = BaseAddress;
     ARM_ServiceQ = BaseAddress + 0x04;
     ARM_DoorBell = BaseAddress + 0x08;

     DSP0_MessageQ = BaseAddress + 0x10;
     DSP0_ServiceQ = BaseAddress + 0x14;
     DSP0_DoorBell = BaseAddress + 0x18;


	while(1)
	{
		if( (DSP0_MessageQ - DSP0_ServiceQ) > 0   )
		{		

			System_printf("%d, ", DSP0_ServiceQ);
			DSP0_ServiceQ  = DSP0_ServiceQ +1;
			ARM_MessageQ = ARM_MessageQ + 1;
                        ARM_DoorBell = ARM_DoorBell + 1
		}
	}
return 0;
	
}

 

Now issue is that values updated by ARM are scene by DSP0 and I am getting prints of DSP0_ServiceQ as 1,2,3..... But for ARM the system is always reading ARM_ServiceQ=0 and  ARM_MessageQ=0. Seems like there are coherency issues. Any suggestion.