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.