我在使用C6638 DSP,使用PCIE Boot方式加载代码,测试代码是很简单的RTSC工程。LOG显示Boot时八个核都正确的进入了main(),但是core4~core7却卡在了一个CSL函数,无法继续执行,而core0~core3可以正确执行。这个函数是CSL_chipReadReg (CSL_CHIP_DNUM),用于获取核号,如果使用仿真器则没有这个问题。如果相同代码不带BIOS(即纯CCS代码)也没有问题。
各core使用独立的内存,用的是相对地址,代码段在DDR3,堆栈段在L2SRAM,如下:
core0:L2SRAM: 0x1080000,length:0x00010000 DDR3:0x60000000,length :0x00100000
core1:L2SRAM: 0x1180000,length:0x00010000 DDR3:0x60100000,length :0x00100000
…
core7:L2SRAM: 0x1780000,length:0x00010000 DDR3:0x60700000,length :0x00100000
现在找不到原因,特来请教,多谢指点
Allen35065:
BIOS的配置里也有内存分段的配置,你检查一下看有没有重叠的部分
user_haike:
回复 Allen35065:
你好,
BIOS的内存分段没有重叠,如下:
L1DSRAM 00600000 00008000 00000000 00008000 RW L1PSRAM 00700000 00008000 00000000 00008000 RW X L2SRAM_A 00800000 00010000 00000008 0000fff8 RW X DDR3_CODE0 60000000 00100000 000118d6 000ee72a RW X DDR3_CODE1 60100000 00100000 00000000 00100000 RW X DDR3_CODE2 60200000 00100000 00000000 00100000 RW X DDR3_CODE3 60300000 00100000 00000000 00100000 RW X DDR3_CODE4 60400000 00100000 00000000 00100000 RW X DDR3_CODE5 60500000 00100000 00000000 00100000 RW X DDR3_CODE6 60600000 00100000 00000000 00100000 RW X DDR3_CODE7 60700000 00100000 00000000 00100000 RW X
各core定义自己的L2SRAM空间,如下:
core0 :L2SRAM 10812000 00030000
core1:L2SRAM 11812000 00030000
…
core7:L2SRAM 17812000 00030000
且各core使用各自的DDR空间,如下(以core0为例):
Program.sectMap[".text"] = "DDR3_CODE0";Program.sectMap[".cinit"] = "DDR3_CODE0";
Program.sectMap[".stack"] = "DDR3_CODE0";Program.sectMap[".switch"] = "L2SRAM";Program.sectMap[".bss"] = "L2SRAM";Program.sectMap[".neardata"] = "L2SRAM";Program.sectMap[".rodata"] = "L2SRAM";Program.sectMap[".cio"] = "L2SRAM";
Program.sectMap[".vecs"] = "L2SRAM";Program.sectMap[".csl_vect"] = "L2SRAM";Program.sectMap[".systemHeap"] = "L2SRAM";Program.sectMap[".bcpDesc"] = "L2SRAM";Program.sectMap[".fftcDesc"] = "L2SRAM";
Program.sectMap[".const"] = "DDR3_CODE0";Program.sectMap[".fardata"] = "L2SRAM";Program.sectMap[".far"] = "L2SRAM";
附件为core0和core4的map文件,请帮忙查看下。
Allen35065:
回复 user_haike:
.sysmem分配的地址是局部地址,如果是PCIE boot需要把这个地址分配到全局地址上,外部boot时局部地址不能出现在内存分配表里。
user_haike:
回复 Allen35065:
你好,
在各工程.cfg文件中添加语句“Program.sectMap[".sysmem"] = "L2SRAM";”,将.sysmem段分配在各core独立的L2SRAM空间中。但是,现象相同,core4~core7卡在一个CSL函数,core0~core3正确执行。
附件是我们的测试工程,对应八核,由于Platform文件设置路径为“E:\test_load\packages”,所以工程需放至“E:\test_load”目录下。请帮忙分析下原因。
PS:有没有一个PCIE boot通过的工程供我们参考下。
多谢。
Allen35065:
回复 user_haike:
改完地址以后,JTAG下载运行8个核有没有问题?
PCIE boot如果不运行8个核,运行5个核,会不会有问题?
user_haike:
回复 Allen35065:
Hi,
1. 改完地址之后,JTAG下载运行8个核没有问题;
2. PCIE下运行5个核还是会有问题,core4卡在CSL函数,core0~core3运行正常;
3. 我们尝试过只加载core0以及core4~core7,问题现象相同。(core0触发其他核运行)
4. 有没有一份PCIE BOOT模式通过的带BIOS的工程供我们参考下?
多谢。
Allen35065:
回复 user_haike:
没有这样的例子;
你的boot magic address是在哪里写进去的?
user_haike:
回复 Allen35065:
你好:
我们是仿照MCSDK的例程,在PC端将BAR1的地址映射到L2,将_c_int00的地址写到各个核的。
Allen35065:
回复 user_haike:
你在boot失败以后把后面四个核PC指针的地址查看一下,也可以连上JTAG单步调试看看汇编有没有问题。
user_haike:
回复 Allen35065:
core4,core5,core7连不上仿真器,core6连上仿真器,加载symbols( “test_load6.out”)文件之后,查看PC指针,如附件图片所示。
单步调式,汇编指针在"ti_sysbios_family_c64p_Hwi_int0() "(地址0x16814800 ~ 0x1681481C)内循环,如附件图片所示。
PS: 关于连不上仿真器问题,每次现象不固定出现在core4~core7的哪个核。