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.

C6670多核SPI Boot的问题

大家好,

我现在在做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有问题吗?

  • 我看到你写boot magic address的代码 

    /*write Boot Magic add of other cores and send IPC interrupt*/
    pBootMagicAddCore0 = (int*)0x108FFFFC;
    (*pBootMagicAddCore0)+= 0x10000000;// translate to global address
    for(i = 1;i < CORE_NUM_6670; i++)//write the other cores' boot magic address
    {
    *(pBootMagicAddCore0+ (0x01000000*i)/4 ) = (*pBootMagicAddCore0) + 0x01000000 * i;
    }

    core 0启动其它core的时候,应该往其它core的boot magic address里写对应core的入口地址(_c_int00)

    //core 1

    *((int *)(0x118FFFFC)) = 0xABCDEFGH; //c_int00的地址

  • 你好Allen,

    1. boot magic address代码我是基于http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/8065.aspx这个帖子的附上的zip文件修改的。

    我也对

    /*write Boot Magic add of other cores and send IPC interrupt*/
    pBootMagicAddCore0 = (int*)0x108FFFFC;
    (*pBootMagicAddCore0)+= 0x10000000;// translate to global address
    for(i = 1;i < CORE_NUM_6670; i++)//write the other cores' boot magic address
    {
    *(pBootMagicAddCore0+ (0x01000000*i)/4 ) = (*pBootMagicAddCore0) + 0x01000000 * i;
    }

    感到有些疑惑。但是,我写的测试工程,不带SYS/BIOS,只有GPIO控制很简单的一个程序,这段代码确实能把其他Core Boot起来。很奇怪!

    2. 怎样获得其他Core的_c_int00呢?有TI官方提供的比较完善的IPC唤醒其他Core的代码吗?

  • 你在做boot table的时候可以看到入口地址,注意多个核合并成一个boot table时会把这个入口地址去除;

    每个core 的boot table组织形式如下

    word 0 (入口地址,c_int00)

    word 1 (段长度)

    word 2 (段起始地址)

    word 3...(段数据)

    .....

    .....

    0x00000000(段长度为0为boot table结束符)

  • 或者你在用CCS加载代码以后,在memory view里输入_c_int00,就能跳转到这个地址

  • 1. 有一个疑问:

    做boot table之前,我肯定已经写好工程代码了,得到.out再去做boot table的。然后再从boot table中获得了c_int00地址,再返回去修改boot部分的IPC唤醒其它核代码?这样是不是不合理。


    2. 我的工程中.text是放在MSMCSRAM中的,4个Core共享这.text,则4个Core的c_int00物理地址应该是一样的吧?


    3. 正常的C66x做多核SPI Boot的流程就是:先编写代码(没有IPC唤醒多核代码)--->写完后功能验证OK,则通过memory view观察各个Core的c_int00物理地址--->再在原工程中添加IPC唤醒多核代码--->再生成.out--->再做boot table--->实现Boot?

    是这样的流程吗?还是有别的流程?

    感觉对于Boot这种保证产品中代码运行的基本操作,TI应该要给出一套规范操作或者更方便一些的工具吧?

  • 1, 一般做boot时,代码基本就基本固定了

    2, 不一定;

    3, 对,boot的代码只需要存在于core 0

  • 如果BIOS工程配置文件cfg把.text、.const、.cinit放到了DDR3中,用官网上的spi Flash 工程烧写进去不能启动,把.text、.const、.cinit放到MSMC就可以,请问我如果必须把.text、.const、.cinit放到了DDR3中药怎么做?急急急....

  • allen,你好,

    2.不一定--代表什么意思呢,

    我也遇到了跟楼主一样的问题

  • jin feng 你好,

    请问你的问题解决了吗,能否给一些帮助,谢谢