完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,
我现在在做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:tixdctools_3_23_04_60packages下面的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 functionVoid 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 failedn"); 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有问题吗? |
|
相关推荐
9 个讨论
|
|
我看到你写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的地址 |
|
|
|
|
|
hdfsf 发表于 2018-7-24 09:29 你好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的代码吗? |
|
|
|
|
|
hkhwdz 发表于 2018-7-24 09:36 你在做boot table的时候可以看到入口地址,注意多个核合并成一个boot table时会把这个入口地址去除; 每个core 的boot table组织形式如下 word 0 (入口地址,c_int00) word 1 (段长度) word 2 (段起始地址) word 3...(段数据) ..... ..... 0x00000000(段长度为0为boot table结束符) |
|
|
|
|
|
hdfsf 发表于 2018-7-24 09:42 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应该要给出一套规范操作或者更方便一些的工具吧? |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
354 浏览 1 评论
547 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
793 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
664 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1141 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
88浏览 29评论
330浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
262浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
212浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
69浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 08:14 , Processed in 1.074660 second(s), Total 88, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号