大家好,
我现在在做C6670的多核SPI Boot。
我们板子是这样弄的,把.out生成的bin文件给FPGA,FPGA模拟一个SPI FLASH。然后设置C6670为SPI Boot,通过SPI接口去从FPGA中读取bin文件。
写了一个测试工程,即Core0操作GPIO14去闪烁一个LED,Core1操作GPIO15去闪烁另一个LED。经过测试,C6670的Core0、Core1都能启动。
我们的实际工程是
1)基于SYS/BIOS
2).text、.const、.cinit放在了MSMCSRAM中,4个Core共用一个.text、.const、.cinit
3)每个Core各自的task stack等放在了各自的L2SRAM中
3)部分全局数组Load到了DDR3上
工程的cfg文件
工程的linker.cmd文件
另一个CMD文件
工程的map文件
实现的功能大致是:多核独立收发SRIO数据、独立收发以太网数据,并独立处理数据。
遇到的问题是:
我对该实际工程进行多核SPI Boot时,遇到了只有Core0启动,其它Core无法启动的问题。
为了实现多核SPI Boot,我将上面这个工程复制了4个工程,每个工程生成对应的.out文件。
首先,我将C:\ti\xdctools_3_23_04_60\packages下面的ti.platforms.evm6670改为下图所示、
对于Core0工程,我将Code Memory、Data Memory、Stack Memory设置为Core0_L2SRAM
对于Core1工程,我将Code Memory、Data Memory、Stack Memory设置为Core1_L2SRAM
这样Core0生成的.out文件对应的map文件头如下
MEMORY CONFIGURATION
name origin length used unused attr fill
---------------------- -------- --------- -------- -------- ---- --------
SRIO_Rev 00800000 00002000 00000000 00002000 RW X
L1PSRAM 00e00000 00008000 00000000 00008000 RW X
L1DSRAM 00f00000 00008000 00000000 00008000 RW
MSMCSRAM 0c000000 00200000 000b4bce 0014b432 RW X
Core0_L2SRAM 10802000 000fe000 000fce62 0000119e RW X
Core1_L2SRAM 11802000 000fe000 00000000 000fe000 RW X
Core2_L2SRAM 12802000 000fe000 00000000 000fe000 RW X
Core3_L2SRAM 13802000 000fe000 00000000 000fe000 RW X
DDR3 80000000 20000000 001ee280 1fe11d80 RW X
对于Core1工程,生成的.out对应的map文件如下
MEMORY CONFIGURATION
name origin length used unused attr fill
---------------------- -------- --------- -------- -------- ---- --------
SRIO_Rev 00800000 00002000 00000000 00002000 RW X
L1PSRAM 00e00000 00008000 00000000 00008000 RW X
L1DSRAM 00f00000 00008000 00000000 00008000 RW
MSMCSRAM 0c000000 00200000 000b4bce 0014b432 RW X
Core0_L2SRAM 10802000 000fe000 00000000 000fe000 RW X
Core1_L2SRAM 11802000 000fe000 000fce62 0000119e RW X
Core2_L2SRAM 12802000 000fe000 00000000 000fe000 RW X
Core3_L2SRAM 13802000 000fe000 00000000 000fe000 RW X
DDR3 80000000 20000000 001ee280 1fe11d80 RW X
这样Core0、Core1的.out共享了位于MSMCSRAM中的.text、.const、.cinit,而各自的stack等都分配到了各自独立的L2SRAM中。
然后通过工具生成bin文件,工具为
然后,把生成的bin文件交给FPGA。
经过测试发现,只有Core0启动,Core1没有启动。
我的代码是这样的:
extern volatile unsigned int cregister TSCL;
//延时函数
void cycleDelay (uint32_t count)
{
uint32_t sat;
if (count <= 0)
return;
sat = TSCL + count;
while (TSCL < sat);
}
// main function
Void main(Void)
{
Task_Params ICT_BBU_SRIO_TaskParams;
Task_Params ICT_BBU_SGMII_TaskParams;
UInt8 myDSP_MACAddr[4][6] = { {0x00, 0x0A, 0x35, 0x01, 0x02, 0x07},
{0x00, 0x0A, 0x35, 0x01, 0x02, 0x08},
{0x00, 0x0A, 0x35, 0x01, 0x02, 0x09},
{0x00, 0x0A, 0x35, 0x01, 0x02, 0x0A}
};
UInt32 pktLength;
//*****************************************************//
//多核Boot测试
int coreId = 0;
CSL_GpioHandle hGpio;//因为要使用GPIO,则先定义GPIO句柄
//*****************************************************//
//*****************************************************//
//多核Boot测试
MulticoreBoot();
//*****************************************************//
//*****************************************************//
//多核Boot测试
coreId = DNUM;
TSCL = 1;
hGpio = CSL_GPIO_open (0);
CSL_GPIO_setPinDirOutput(hGpio, 14);
CSL_GPIO_setPinDirOutput(hGpio, 15);
if(coreId == 0)
{
CSL_GPIO_setOutputData(hGpio,14);
CSL_GPIO_setOutputData(hGpio,15);
while(1)
{
cycleDelay(100000000);
CSL_GPIO_setOutputData(hGpio,14);
cycleDelay(100000000);
CSL_GPIO_clearOutputData(hGpio,14);
}
}
else if(coreId == 1)
{
while(1)
{
cycleDelay(1000000000);
CSL_GPIO_setOutputData(hGpio,15);
cycleDelay(1000000000);
CSL_GPIO_clearOutputData(hGpio,15);
}
}
//*****************************************************//
multitasksem = Semaphore_create(0, NULL, NULL);
CoreNum = DNUM;
//JF:set L1P, L1D and L2 cacheable
CACHE_setL1PSize(CACHE_L1_32KCACHE);
CACHE_setL1DSize(CACHE_L1_32KCACHE);
CACHE_setL2Size(CACHE_0KCACHE);
CACHE_invAllL1p(CACHE_WAIT);
CACHE_wbInvAllL1d(CACHE_WAIT);
CACHE_wbInvAllL2(CACHE_WAIT);
//ICT_BBU_BSP_QMSSCPPIInit();
ICT_BBU_BSP_SGMIIInit(myDSP_MACAddr[0], myDSP_MACAddr[1], myDSP_MACAddr[2], myDSP_MACAddr[3], ICT_BBU_BSP_SGMII_RxISR);
//The first parameter set the DSP self SRIO DeviceID
//The second parameter is the SRIO_LineRateSet, 0 is for 1.25G 1X, 1 and the others are for 5G 4X
ICT_BBU_BSP_SRIOInit(0xAB,0);//set DSP self SRIO DeviceID
if(ICT_BBU_BSP_SRIO_Config(myDorrbellFunc)<0)
System_printf("SRIO parameters configure failed\n");
Task_Params_init(&ICT_BBU_SRIO_TaskParams);
ICT_BBU_SRIO_TaskParams.priority=12;
ICT_BBU_SRIO_TaskParams.stackSize=2048;
Task_create(ICT_BBU_SRIO_Task, &ICT_BBU_SRIO_TaskParams, NULL);
System_printf("SRIO start!\n");
Task_Params_init(&ICT_BBU_SGMII_TaskParams);
ICT_BBU_SGMII_TaskParams.priority=13;
ICT_BBU_SGMII_TaskParams.stackSize=20480;
Task_create(ICT_BBU_SGMII_Task, &ICT_BBU_SGMII_TaskParams, NULL);
System_printf("SGMII start!\n");
/* Start the BIOS */
BIOS_start();
}
为了测试,没有跑到BIOS task部分,只在GPIO处死循环。
MulticoreBoot.c为
正常来说:Core0操作GPIO14能闪烁一个LED,Core1操作GPIO15能闪烁另一个LED。
结果,只有Core0控制的LED闪烁。应该只有Core0启动了。
但是之前写的GPIO控制测试代码,却能够正常启动Core0、Core1.
那么代码、MulticoreBoot.c、SPI_Boot工具、FPGA端程序应该都没问题。
而两个工程的区别在于“:
1)测试工程没有SYS/BIOS;实际工程有,虽然没有实际运行。
2)测试工程所有section都放到了各自的L2SRAM中;而实际工程.text、.const、.cinit放到了MSMCSRAM中,4个Core共享。
求各位帮助分析一下,为什么实际工程中Core1没有启动?
是因为CMD配置的问题,导致.out有问题吗?
