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.

PCIE boot代码成功后运行CSL函数失败,而用仿真器正常

Other Parts Discussed in Thread: SYSBIOS

       我在使用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

现在找不到原因,特来请教,多谢指点


  • BIOS的配置里也有内存分段的配置,你检查一下看有没有重叠的部分

  • 你好,

    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文件,请帮忙查看下。

    test_load_map.rar
  • .sysmem分配的地址是局部地址,如果是PCIE boot需要把这个地址分配到全局地址上,外部boot时局部地址不能出现在内存分配表里。

  • 你好,

    在各工程.cfg文件中添加语句“Program.sectMap[".sysmem"]       = "L2SRAM";”,将.sysmem段分配在各core独立的L2SRAM空间中。但是,现象相同,core4~core7卡在一个CSL函数,core0~core3正确执行。

    附件是我们的测试工程,对应八核,由于Platform文件设置路径为“E:\test_load\packages”,所以工程需放至“E:\test_load”目录下。请帮忙分析下原因。

    PS:有没有一个PCIE boot通过的工程供我们参考下。

    多谢。

    test_load.rar
  • 改完地址以后,JTAG下载运行8个核有没有问题?

    PCIE boot如果不运行8个核,运行5个核,会不会有问题?

  • Hi,

    1. 改完地址之后,JTAG下载运行8个核没有问题;

    2. PCIE下运行5个核还是会有问题,core4卡在CSL函数,core0~core3运行正常;

    3. 我们尝试过只加载core0以及core4~core7,问题现象相同。(core0触发其他核运行) 

    4. 有没有一份PCIE BOOT模式通过的带BIOS的工程供我们参考下?

    多谢。

  • 没有这样的例子;

    你的boot magic address是在哪里写进去的?

  • 你好:

            我们是仿照MCSDK的例程,在PC端将BAR1的地址映射到L2,将_c_int00的地址写到各个核的。

  • 你在boot失败以后把后面四个核PC指针的地址查看一下,也可以连上JTAG单步调试看看汇编有没有问题。

  • core4,core5,core7连不上仿真器,core6连上仿真器,加载symbols( “test_load6.out”)文件之后,查看PC指针,如附件图片所示。

    单步调式,汇编指针在"ti_sysbios_family_c64p_Hwi_int0() "(地址0x16814800 ~ 0x1681481C)内循环,如附件图片所示。

    PS: 关于连不上仿真器问题,每次现象不固定出现在core4~core7的哪个核。

  • 这里是RESET中断,你的boot magic address应该是指向到这个中断上?

    如果直接通过JTAG load, 数据和PCIE boot写入的数据一致吗?

    boot 从这里执行是没有问题的,问题是为什么没有能跳转到main函数上

  • 八个核都已经正确的进入了main()并执行,以下是我简单测试代码(各核代码相同):

    void main ()
    {
    RunFlag =1;
    RunFlag =2;
    RunFlag++;
    coreNum = CSL_chipReadReg (CSL_CHIP_DNUM);
    RunFlag = 9;
    }

    Log显示,core0~core3正确执行,

    core4~core7:RunFlag=3,卡在函数CSL_chipReadReg (CSL_CHIP_DNUM),用于获取核号。


  • 我感到奇怪的是你跑飞的时候PC已经进了RESET中断,

    1. 你可以检查RESET_STATUS和BOOT_COMPLETE寄存器看有没有意外触发的RESET;

    2. 试试用coreNum = DNUM; 替代现有的函数看会不会出现跑飞的现象;

    3. 目前你的代码较小,把所有的数据段和代码段都放到L2里看是不是DDR3读写问题;

    4. 注意CSL中断控制函数和BIOS中断控制函数有冲突,在BIOS里只能使用BIOS的中断控制函数,不能用csl intc

  • 1.  寄存器RESET_STAT = 0x80000000,BOOTCOMPLETE = 0x000000FF,没有触发RESET;

    2.  我们尝试过替换DNUM,不会跑飞,能正确读取核号。但存在新的问题,例如core4~core7工程不能运行switch函数,改成 if 函数可以通过;

    3.  代码段和数据段放在L2中,core4~core7跑飞;

    4.  我们没有使用CSL中断控制函数,使用的是BIOS提供的HWI函数。

  • 现在用的编译器是否是最新版本?如果不是可以到http://software-dl.ti.com/codegen/non-esd/downloads/download.htm下载7.4.14;

    在PCIE boot的时候监测电压输入CVDD 和CVDD1 是否在正确的值上?

    目前用的silicon的版本是什么?1.1还是2.0? 读出寄存器地址0x01812000的值,结尾是2是1.1版本,3是2.0版本。

  • 1.  之前用的ccs5.5,TI v7.4.4,后来升级为ccs6.1,TI v7.4.12,问题现象相同;

    2.我们用的板卡是Demo板,silicon是1.1版本,这会有什么问题吗?

  • Once the boot is complete, it is highly recommended that software reconfigure the Main
    PLL to the desired frequency, even if it is already achieved by the initial settings. To
    minimize the overall output jitter, the PLLs should be operated as close as possible to
    the maximum operating frequency. To maximize the VCO frequency within the PLL, the
    PLL should be clocked to 2× the intended frequency and the PLL Output Divider should
    be set to /2. The main PLL Output Divider should be set to divide-by-2 by the software
    by writing 0b0001 to bits [22:19] of the SECCTL register (address 0x02310108) in the
    PLL controller. A read-modify-write can be used to make sure other bits in the register
    are not affected. This register is documented in the part-specific data manual.

  • silicon1.1版本对PCIE boot 有影响吗?

  • 通过检查silicon errata,应该是没有影响的。

  • 还有其他没有考虑到的地方导致这个问题吗?

  • 能不能帮看一下我们的工程的工程设置,看有没有设置出错的问题,之前回复里的附件为我们的测试工程。

    或者帮我们搞一份能正常下载过的工程,我们对比下设置。

  • PCIE boot和使用BIOS启动失败没有必然的联系,如果BIOS工程通过JTAG下载能够同时运行那么代码应该是正确的;

    可以尝试用别的boot模式看是否PCIE传输有错误。

  • 前面需要在Core 0增加PLL重新配置的代码的建议有没有测试过?这是silicon errata里要求的