最近在做DSP双核通信,很让人头疼,看了很多IPC示例,发现是阻塞通信,而OpenMp虽然可以做并行系统,但是题目要求是两个核做互不想干的内容、偶尔进行一下通信传递一下数据就可以了。所以在经过大量调研以后,决定采用多镜像IPC通信。
采用的方法就是利用共享内存,采用的系统是SYS/BIOS系统。
首先在cmd文件中定义共享内存的大小:
MEMORY
{
IPC o = 0x80000000 l = 0x10000000
DDR3_CORE0 o = 0x90000000 l = 0x08000000
DDR3_CORE1 o = 0x98000000 l = 0x08000000
}
DDR3的大小是512M,这里分成三块,256M的共享内存,以及各128M的单核使用的内存。内存的大小可根据实际情况自定义。
1.简单的int类型的整数
对于简单的整数,只需要在.c文件中进行定义:
extern volatile unsigned int far Flag;
然后在cmd文件中,为该变量进行内存分配:
.IPC > 0x80000004 START(Flag)
在Tsk中,可以直接调用Flag,并为其赋值:
Flag=1;
当然,为了把数值写入内存而不是放在cache缓存中,需要把缓存写入内存中:
Cache_wb((void *)&Flag, 4, Cache_Type_ALLD, TRUE);
2.对于char型数组
char型数组实际上与int型整数类似,只不过分配内存的时候不能用IPC定义。
在.c文件的定义:
unsigned char confirm_img[100000];
在cmd文件中的定义:
.IPC > 0x86000004 START(confirm_img)
写入数据的时候,我们可
memcpy(detect_img, image, sizeof(image)* sizeof(int));
写入内存。
3.结构体
结构体比较麻烦,之前写了好几次没有成功,后来发现是缓存没有写入内存。
结构体在.c文件中的定义:
result_point_info Result;
在cmd文件中:
.IPC > 0x82000004 START(Result)
每次赋值,写入后,要用
Result.x=1;
Cache_wb((void *)&Result.x, 4, Cache_Type_ALLD, TRUE);
方式进行写入内存。
并非采用什么通信机制,就是把需要共享的数据放到共享内存中,另一个核需要的时候,再去指定的位置读取数据就可以了~~