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.

请教下,6678如何实现多核共享内存?

Hi,TI工程师:

有如下几种场景,看如何来实现多核共享内存:

1.同一个工程(包括同样的代码和cmd文件)生成出来的out文件,加载到多个核上。

这种场景,应该可以适用于那些每个核都处理类似任务的场景,编程主要靠coreID来区分流程,内存分配也最好以放置在MSMC上为主(主要是为节省内存空间),而且加载时也只用加载一份(如果有放置在LL2上的,则需各自都要加载)。

2.各核自建工程,但是部分代码数据相同:

这种情况下,如果考虑把相同的代码or数据放到MSMC上一份以实现多核共享。这个时候,由于工程不一致,cmd文件也不尽相同。如果要实现共享,是否需要在各自的cmd文件中指定一个相同的MSMC绝对地址来划分一个段,然后将需要共享的代码or数据通过#progma放进去?但是同时,编译器又是如何来保证各个核放置在这个段里面的代码or数据的内容的顺序又是一致的呢?

即,假设我需要定义一个共享变量来实现多核同步,编译器如何来保证每个核工程编译时让其出现在同一个地址上的?

另外,对于共享段,在加载时,是否就只用加载一次就可以了?

3.各个核的任务差异很大:

由于差异较大,MSMC就没有必要划分共享段来。用法就可以类似LL2来用,将MSMC私有化。一个核可以通过绝对地址去访问另一个核的MSMC段内容。

这些都是个人的一些理解,还请TI工程师指正是否正确。

特别是场景2,一直没有搞明白它是如何实现的。

谢谢!

  • 麻烦TI工程师给解惑下,谢谢!

  • 您说的第二种情况我觉得还是用同一个工程来实现比较简单,用#paragma把不同核用的代码或数据放在不同的段里,比如分拆成如下段:

    Core0Data,Core0Code,Core1Data,Core1Code...

    所有核共用的代码或数据放在另外的段里,比如分拆成如下段:

    CommonData, CommonCode...

    在CMD文件里把CommonData, CommonCode放到Shared L2里,把Core0Data,Core0Code放到Core0的LL2里(用global address),把Core1Data,Core1Code放到Core1的LL2里(用global address)....stack和.bss段一定要放到LL2里(用local address).

    附件的培训材料中有一些和这个问题相关的信息,可能对你有所帮助。

    C6678.pdf
  • 嗯,thx,Brighton!这个建议还是很不错滴。就这么弄了。

    btw:这个培训文档也很好,有助于我们更好的理解芯片。

  • Brighton Feng工程师,你好!我想问一下

    你在帖子中的描述“用#paragma把不同核用的代码或数据放在不同的段里,比如分拆成如下段:

    Core0Data,Core0Code,Core1Data,Core1Code...”;请问在基于sys/bios的多核工程如何将利用.cfg文件来拆分段;下图我自己尝试在cfg文件中开辟一个自己定义段

    但是当我利用#paragma将代码放到该段中,CCS报错,我查看生成的cmd文件如我所愿的开辟了.mysegment这个段,但是该段并没有任何数据放入其中。还有一个问题是就算我通过#paragma将专属于某核代码放到该核的L2中去,但是在自己开辟的段如何与该核的L2的地址进行映射呢?如何对应起来呢?

  • 你好,

    变量是每个核单独的,不是共享的,但可以每个核上变量定义到同一个内存位置,达到类似全局的效果,教你一个方法。

    (1)比如要共享变量share_variable,在每个核的代码中都声明:

    ///////////////////////////////////////////////////////////////////////////////////////////////

    #pragma DATA_SECTION (share_variable, ".global_shared");
    static unsigned int share_variable;

    ///////////////////////////////////////////////////////////////////////////////////////////////

    (2)在link文件*.cmd中加入段定义

    //////////////////////////////////////////////////////////////////////////////

    MEMORY {

    .....
    VAR_SHARED_RAM: origin = 0x0C3E0000 length=0x00020000

    .....
    }

    ....

    .global_shared: type=NOINIT > VAR_SHARED_RAM

    ///////////////////////////////////////////////////////////////////////////////////////////////

    这样每个核上的变量share_variable,都对应与M3中的同一个内存,这就达到了类似全局变量的效果。

    另外,记得在访问核间共享内存时,用spin_lock互斥(C6678有64个硬件信号量)。

    -------------------------------------------------------------------------------------------------------------------------------------------

    BTW:Enea提供针对C66的商用平台软件,如果有兴趣可以联系。

    我们是TI的白金合作伙伴,可以提供C66上的全套商用平台软件,,包括操作系统、BSP驱动、TCP/IP协议栈,LINX IPC模块、中间件和开发工具。

    OSEck RTOS 软件平台包括:
    ? OSEck RTOS内核:
    o 稳定可靠,支持所有DSP,有20+年历史。
    o 专门针对C66x优化。没有内存碎片的内存管理。
    o 内存自动裁剪,统一的出错处理机制。
    o …….
    ? BSP(驱动)源代码:优化高效的驱动,如RapidIO,Ethernet等。
    ? LINX IPC: 支持分布式系统的IPC.
    o 使多核、多DSP、多板卡的编程好像单核编程一样。
    o 支持任何物理介质,如C66x多核之间(EDMA),多DSP之间(RapidIO),多板卡之间(RapidIO, Ethernet)。
    ? TCP/IP协议
    ? Package Flow 软件加速包
    ? Optima开发优化工具:CPU,内存等性能优化工具。


    Enea在DSP RTOS领域有近20年的开发、现场使用经验,针对复杂的C6678,从2010年起专门投入30多人的专家团队来支持优化6678软件平台,包括:
    ? 内核、重写高性能驱动、分布式支持、网络加速、优化工具等,现在以及有30多个客户使用Enea针对6678的软件平台:
    1. 成熟、稳定、可靠、现场验证的,专门针对6678 DSP特别优化的OSEck RTOS。
    2. 成熟稳定的针对C6678的驱动程序,支持包括SRIO、以太网、PA、Multicore Navigator、MPAX、中断管理等。
    3. 跨核、跨DSP、跨板卡系统的透明传输模块LINX。

    Br

    William.dong@enea.com

  • 你好,首先谢谢你的回复,你说的这种方法并不是基于SYS/BIOS工程的,在不上内核的情况下我也会这种方法。我想问的是在同一个SYS/BIOS工程、同一cfg文件下,如何将每个核独自的代码放到各自的L2上而不是将每个核的代码都完全放入L2中。

  • 你好 解决了么 分享一下