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

最近在做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);

方式进行写入内存。
并非采用什么通信机制,就是把需要共享的数据放到共享内存中,另一个核需要的时候,再去指定的位置读取数据就可以了~~

你可能感兴趣的:(DSP学习)