DSP

多核DSP之双核多镜像之共享内存

2019-07-13 10:05发布

最近在做DSP双核通信,很让人头疼,看了很多IPC示例,发现是阻塞通信,而OpenMp虽然可以做并行系统,但是题目要求是两个核做互不想干的内容、偶尔进行一下通信传递一下数据就可以了。所以在经过大量调研以后,决定采用多镜像IPC通信。 采用的方法就是利用共享内存,采用的系统是SYS/BIOS系统。
首先在cmd文件中定义共享内存的大小: /* 内存段描述 */ MEMORY { IPC o = 0x80000000 l = 0x10000000 /* 256MB 多核通信专用内存 */ DDR3_CORE0 o = 0x90000000 l = 0x08000000 /* 128MB 核心 0 专用 DDR3 内存 */ DDR3_CORE1 o = 0x98000000 l = 0x08000000 /* 128MB 核心 1 专用 DDR3 内存 */ } 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); 方式进行写入内存。
并非采用什么通信机制,就是把需要共享的数据放到共享内存中,另一个核需要的时候,再去指定的位置读取数据就可以了~~