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.

C6678 多核启动的问题



我想知道怎么让dsp启动的时候多核启动,debug的时候可以选择下载到那个核,然后运行,选择的核就会开始运行。

如果我把程序写到eeprom那么boot起来后就只有core0,运行,怎么让所有的核都运行呢?通过代码控制还是哪里配置呢?

我想让每个core都动起来,让他们自己读写自己的内存就可以了。我只想让他们都运行起来。

  • 1. 关于DSP启动,请参考“KeyStone Architecture Bootloader User Guide”;

    2. eeprom中烧写的是IBL二级启动程序,应用程序.out一般烧写在NAND flash、NOR flash,或者使用其他方式来加载;

    3.关于多核启动的实现原理,我的理解如下:core0执行RBL(一级启动)、IBL(二级启动),其中IBL的最后一步是加载应用程序到内存(各个段加载的地址由CMD文件决定),然后跳转执行应用程序;此时的core1~7一直处于IDEL状态,等待被唤醒(从RBL到IBL等过程均是由core0执行的,core1~7一直处于休眠状态)。多核启动只需在应用程序中做些内容:具体是core0将程序入口跳转地址写入core1~7的magic_addr(0x87fffc),然后触发core1~7的IPC中断唤醒,使其跳转至指定地址执行应用程序。

     

    总的来说,如果你要运行一个多核启动的程序,你需要做两件事:

    1是编写一个用DNUM区分的程序,通过判断DNUM值做分支,运行每个core的执行函数(里面可以加入printf打印信息,用来判断执行成功)。最重要的是,当DNUM==0(即core0)时,它需要做以下工作:将程序入口地址(_c_int00)写入到其他core的MAGIC_ADDR(C6678上是LL2的最后32bit,局部地址为0x0087fffc)上,然后向该core发送IPC唤醒;

    2是编写一个CMD文件,注意必须将text段、cinit段、switch段和const段放入SL2中。其他段可放入LL2。

     

    这个程序写好后,你可以在CCS下,将程序下载到core0中。如果你的程序执行成功,应该可以看到所有core都执行了各自的函数。然后你可以将这个程序烧写到NAND flash中。

  • 你好  非常感谢你的回答,我现在才接触6678不久,项目很急时间很紧。

    》》》将程序入口地址(_c_int00)写入到其他core的MAGIC_ADDR(C6678上是LL2的最后32bit,局部地址为0x0087fffc)上,然后向该core发送IPC唤醒;

    》》》2是编写一个CMD文件,注意必须将text段、cinit段、switch段和const段放入SL2中。其他段可放入LL2。

    这两个功能能否提供一个简单的sample。我对的DSP不熟悉,项目时间紧迫,拜托了!

  • -c
    -heap  0x4000
    -stack 0x4000
    MEMORY
    {
        SHRAM:           o = 0x0C000000 l = 0x00400000   /* 4MB Multicore shared Memmory */
     
        CORE0_L2_SRAM:   o = 0x10800000 l = 0x00080000   /* 512kB CORE0 L2/SRAM */
        CORE0_L1P_SRAM:  o = 0x10E00000 l = 0x00008000   /* 32kB CORE0 L1P/SRAM */
        CORE0_L1D_SRAM:  o = 0x10F00000 l = 0x00008000   /* 32kB CORE0 L1D/SRAM */
     
    }
     
    SECTIONS
    {
        .text          >  SHRAM
        .stack         >  SHRAM
        .bss           >  SHRAM
        .cio           >  SHRAM
        .const         >  SHRAM
        .data          >  SHRAM
        .switch        >  SHRAM
        .sysmem        >  SHRAM
        .far           >  SHRAM
        .args          >  SHRAM
        .ppinfo        >  SHRAM
        .ppdata        >  SHRAM
     
        /* COFF sections */
        .pinit         >  SHRAM
        .cinit         >  SHRAM
     
        /* EABI sections */
        .binit         >  CORE0_L2_SRAM
        .init_array    >  CORE0_L2_SRAM
        .neardata      >  CORE0_L2_SRAM
        .fardata       >  CORE0_L2_SRAM
        .rodata        >  CORE0_L2_SRAM
        .c6xabi.exidx  >  CORE0_L2_SRAM
        .c6xabi.extab  >  CORE0_L2_SRAM
    }

    我写的cmd文件,能帮我检查一下吗?看看有什么问题吗

  • 1.除了上述建议的4个段外,不建议将其他段放入SL2中。SL2的资源是珍贵而有限的。所以应慎用。

    2.你上述的CMD文件编译后,所有的core程序 的“EABI sections”都会被放入到core0的L2中。这是你想要的结果吗?

     

    这是我写的比较通用的CMD文件,仅供参考:

    -stack 0x2000
    -heap 0x8000

    MEMORY
    {
      LOCAL_L2_SRAM:  origin = 0x00800000 length = 0x00080000   /* 512kB LOCAL L2/SRAM */
      LOCAL_L1P_SRAM: origin = 0x00E00000 length = 0x00008000   /* 32kB LOCAL L1P/SRAM */
      LOCAL_L1D_SRAM: origin = 0x00F00000 length = 0x00008000   /* 32kB LOCAL L1D/SRAM */
      SHRAM:          origin = 0x0C000000 length = 0x00400000   /* 4MB Multicore shared Memmory */
     
      EMIF16_CS2:     origin = 0x70000000 length = 0x04000000   /* 64MB EMIF16 CS2 Data Memory */
      EMIF16_CS3:     origin = 0x74000000 length = 0x04000000   /* 64MB EMIF16 CS3 Data Memory */
      EMIF16_CS4:     origin = 0x78000000 length = 0x04000000   /* 64MB EMIF16 CS4 Data Memory */
      EMIF16_CS5:     origin = 0x7C000000 length = 0x04000000   /* 64MB EMIF16 CS5 Data Memory */

      DDR3:           origin = 0x80000000 length = 0x20000000   /* 512MB DDR3 SDRAM */
    }
     
    SECTIONS
    {
     .text          >  SHRAM
     .const         >  SHRAM
     .switch        >  SHRAM
     .cinit         >  SHRAM
     
     .stack         >  LOCAL_L2_SRAM
     .bss           >  LOCAL_L2_SRAM
     .data          >  LOCAL_L2_SRAM
     .neardata      >  LOCAL_L2_SRAM
     .fardata       >  LOCAL_L2_SRAM
     .rodata        >  LOCAL_L2_SRAM 
     .far           >  LOCAL_L2_SRAM
     .cio     >  LOCAL_L2_SRAM
     .sysmem        >  LOCAL_L2_SRAM }

     

    另外,CCS安装完后,你可以在目录中搜索一些自带的CMD文件。一般都是比较标准和通用的。

  • 我这样写,总是报错

    -c
    -heap  0x2000
    -stack 0x8000
    MEMORY
    {

        LOCAL_L2_SRAM:   o = 0x00800000 l = 0x00080000   /* 512kB CORE0 L2/SRAM */
        LOCAL_L1P_SRAM:  o = 0x00E00000 l = 0x00008000   /* 32kB CORE0 L1P/SRAM */
        LOCAL_L1D_SRAM:  o = 0x00F00000 l = 0x00008000   /* 32kB CORE0 L1D/SRAM */
        SHRAM:           o = 0x0C000000 l = 0x00400000   /* 4MB Multicore shared Memmory */

       EMIF16_CS2:     o = 0x70000000 l = 0x04000000   /* 64MB EMIF16 CS2 Data Memory */
       EMIF16_CS3:     o = 0x74000000 l = 0x04000000   /* 64MB EMIF16 CS3 Data Memory */
       EMIF16_CS4:     o = 0x78000000 l = 0x04000000   /* 64MB EMIF16 CS4 Data Memory */
       EMIF16_CS5:     o = 0x7C000000 l = 0x04000000   /* 64MB EMIF16 CS5 Data Memory */

       DDR3:           o = 0x80000000 l = 0x10000000   /* 512MB DDR3 SDRAM */


    }
     
    SECTIONS
    {
        .text          >  SHRAM
        .stack         >  LOCAL_L2_SRAM
        .bss           >  LOCAL_L2_SRAM
        .cio           >  LOCAL_L2_SRAM
        .const         >  SHRAM
        .data          >  LOCAL_L2_SRAM
        .switch        >  SHRAM
        .sysmem        >  LOCAL_L2_SRAM
        .far           >  LOCAL_L2_SRAM
        .args          >  LOCAL_L2_SRAM
        .ppinfo        >  LOCAL_L2_SRAM
        .ppdata        >  LOCAL_L2_SRAM
     
        /* COFF sections */
        .pinit         >  LOCAL_L2_SRAM
        .cinit         >  SHRAM
     
        /* EABI sections */
        .binit         >  LOCAL_L2_SRAM
        .init_array    >  LOCAL_L2_SRAM
        .neardata      >  LOCAL_L2_SRAM
        .fardata       >  LOCAL_L2_SRAM
        .rodata        >  LOCAL_L2_SRAM
        .c6xabi.exidx  >  LOCAL_L2_SRAM
        .c6xabi.extab  >  LOCAL_L2_SRAM
    }

     

    错误信息:

    "../MyC6678.cmd", line 25: error #10264: LOCAL_L2_SRAM memory range overlaps

       existing memory range L2SRAM
    "../MyC6678.cmd", line 28: error #10264: SHRAM memory range overlaps existing
       memory range MSMCSRAM
    "../MyC6678.cmd", line 31: error #10263: DDR3 memory range has already been
    "../MyC6678.cmd", line 31: error #10264: DDR3 memory range overlaps existing
       memory range DDR3

  • “CCS安装完后,你可以在目录中搜索一些自带的CMD文件。”

    您好,请问如何在ccs里搜索自带的CMD文件啊?

    新手,求详细步骤!

  • 你好 你对那个多核启动的程序启动还有印象吗