我想知道怎么让dsp启动的时候多核启动,debug的时候可以选择下载到那个核,然后运行,选择的核就会开始运行。
如果我把程序写到eeprom那么boot起来后就只有core0,运行,怎么让所有的核都运行呢?通过代码控制还是哪里配置呢?
我想让每个core都动起来,让他们自己读写自己的内存就可以了。我只想让他们都运行起来。
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.
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中。
-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