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 ROV观察Task Stack的问题

大家好,

我的程序为,C6670的4个Core都跑一个SYS/BIOS,每个SYS/BIOS上都跑一个SRIO Task。并且在cfg文件中,将Task Stack移到了MSMCSRAM中。

Program.sectMap[".idleTaskStackSection"] = "MSMCSRAM";
Program.sectMap[".taskStackSection"] = "MSMCSRAM";

程序运行后,我用CCS ROV观察Task Stack,发现4个Core上的4个SRIO Task使用的是同一个Task Base,见下图

感觉什么地方我理解错了。

望指教!谢谢!

  • 你四个核跑的相同的工程吗?如果这样的话,stack和.bss段一定要放到LL2里(用local address)。

    请参考另一个相关的帖子:

    http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/p/68413/163132.aspx#163132

     

  • 多个core上的task共享一份stack是有问题的,你这样配置的话代码运行会有出错的隐患。多核时,本核无法意识其他核对共享memory的使用,所以对共享memory的使用,可以在cfg中为每个core划分一块独立的共享memory,然后对每个core的task stack指定到对应的section中。

  • 您好! 

    4个Core跑一样的工程。每个Core上跑一个SRIO收发Task、两个算法Task,每个Core都是通过SRIO接收数据,然后处理,再发送出去。

    其中一个算法Task的stacksize为0x40000,另一个算法Task的stacksize为0x20000。

    这样导致.text、.far太大,无法都放在LL2上,所以我做了如下设置

    Program.sectMap[".idleTaskStackSection"] = "MSMCSRAM";
    Program.sectMap[".taskStackSection"] = "MSMCSRAM";
    Program.sectMap["systemHeap"] = "MSMCSRAM";

    结果查看map文件,.far:taskStackSection以及systemHeap被放置在了MSMCSRAM中,才能正确编译通过。

    Map文件片段如下

    MEMORY CONFIGURATION
    
             name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
      L2SRAM                00800000   00100000  000dfc08  000203f8  RW X
      MSMCSRAM              0c000000   00200000  001343a0  000cbc60  RW X
      DDR3                  80000000   20000000  00000000  20000000  RWIX
    
    
    SEGMENT ALLOCATION MAP
    
    run origin  load origin   length   init length attrs members
    ----------  ----------- ---------- ----------- ----- -------
    00800000    00800000    00059700   00059700    r-x
      00800000    00800000    000596e0   000596e0    r-x .text
      008596e0    008596e0    00000020   00000020    r-- .const.1
    00859700    00859700    000389c8   00000000    rw-
      00859700    00859700    000389c8   00000000    rw- .far.1
    008920d0    008920d0    000004b0   00000000    rw-
      008920d0    008920d0    000004b0   00000000    rw- .far.2
    00892580    00892580    0001c59e   0001c59e    r--
      00892580    00892580    0001c59e   0001c59e    r-- .const.2
    008aeb20    008aeb20    0000821a   0000821a    rw-
      008aeb20    008aeb20    0000821a   0000821a    rw- .fardata
    008b6d40    008b6d40    00010080   00000000    rw-
      008b6d40    008b6d40    00008080   00000000    rw- tcp3DriverSection
      008bedc0    008bedc0    00008000   00000000    rw- tcp3DDataSection
    008c6dc0    008c6dc0    00012080   00008000    rw-
      008c6dc0    008c6dc0    00008000   00008000    rw- .args
      008cedc0    008cedc0    00008000   00000000    rw- .stack
      008d6dc0    008d6dc0    00002080   00000000    rw- tcp3QueueDescrSection
    008d8e40    008d8e40    0000019c   0000019c    r--
      008d8e40    008d8e40    0000019c   0000019c    r-- .switch.1
    008d9000    008d9000    000004b0   000004b0    r-x
      008d9000    008d9000    00000200   00000200    r-x .vecs
      008d9200    008d9200    000002b0   000002b0    r-- .switch.2
    008d94b0    008d94b0    000000b4   00000000    rw-
      008d94b0    008d94b0    000000b4   00000000    rw- .bss
    008d9564    008d9564    000000d1   000000d1    rw-
      008d9564    008d9564    000000d1   000000d1    rw- .neardata
    008d9638    008d9638    00000068   00000068    r--
      008d9638    008d9638    00000068   00000068    r-- .rodata
    008d96a0    008d96a0    000001a0   00000000    rw-
      008d96a0    008d96a0    00000120   00000000    rw- .cio
      008d97c0    008d97c0    00000080   00000000    rw- tcp3DataSection
    008d9840    008d9840    000063fc   000063fc    r--
      008d9840    008d9840    000063fc   000063fc    r-- .cinit
    0c010000    0c010000    001219a0   00000000    rw-
      0c010000    0c010000    0007b8a0   00000000    rw- .Tran_Receive_buffer
      0c08b8a0    0c08b8a0    00060800   00000000    rw- .far:taskStackSection
      0c0ec0a0    0c0ec0a0    0003c000   00000000    rw- systemHeap
      0c1280a0    0c1280a0    00009900   00000000    rw- IRAM
    0c131a00    0c131a00    00002880   00000000    rw-
      0c131a00    0c131a00    00002400   00000000    rw- .qmss
      0c133e00    0c133e00    00000480   00000000    rw- .cppi
    0c134280    0c134280    00000180   00000180    rw-
      0c134280    0c134280    00000180   00000180    rw- .srioSharedMem

    跑程序时,这样的代码(同样的代码、同样的cfg文件)被加载到Core0上,程序运行正常。但是,程序加载继续加载到Core1上时,就出现了如下的问题

    The DSP core runs @ 983MHzDebug(Core 1): Waiting for SRIO to be initialized.
    Debug(Core 1): SRIO can now be used.
    SRIO start!
    Core Num = 1
    *********************************************
    *******ICT Debug Info: SRIO Task Start*******
    *********************************************
    A0=0xc0cb858 A1=0x0
    A2=0x1 A3=0xc131980
    A4=0xc0ec4d8 A5=0xc0ec4c8
    A6=0x8027 A7=0x1
    A8=0x828d20 A9=0xc133d38
    A10=0x847b2e A11=0xc0cb888
    A12=0x847b78 A13=0x0
    A14=0x1c9a1 A15=0x5400027
    A16=0xc0ecb18 A17=0x0
    A18=0xc0ec934 A19=0x1e0
    A20=0x20 A21=0x0
    A22=0x0 A23=0x0
    A24=0x0 A25=0x1
    A26=0x0 A27=0x0
    A28=0x1088e0c0 A29=0x134
    A30=0x34022e50 A31=0x8ae928
    B0=0xc0ecbd0 B1=0x0
    B2=0x0 B3=0x2000027
    B4=0x0 B5=0x15000102
    B6=0xc0ec4c8 B7=0x1
    B8=0x8b5978 B9=0x8ae964
    B10=0xc0cb88c B11=0x0
    B12=0x0 B13=0x3
    B14=0x8d94b0 B15=0xc0cb888
    B16=0x0 B17=0x0
    B18=0x2e40000 B19=0x0
    B20=0x0 B21=0x2e4
    B22=0x2e40000 B23=0x0
    B24=0x0 B25=0x3000
    B26=0x3000 B27=0x0
    B28=0x0 B29=0x0
    B30=0x2e4 B31=0xc0ecc54
    NTSR=0x1000e
    ITSR=0xf
    IRP=0x85651a
    SSR=0x0
    AMR=0x0
    RILC=0x0
    ILC=0x0
    Exception at 0x0
    EFR=0x2 NRP=0x0
    Internal exception: IERR=0x1
    Instruction fetch exception
    ti.sysbios.family.c64p.Exception: line 248: E_exceptionMin: pc = 0x00000000, sp = 0x0c0cb888.
    To see more exception detail, use ROV or set 'ti.sysbios.family.c64p.Exception.enablePrint = true;'
    xdc.runtime.Error.raise: terminating execution
    

    我的问题如下:

    1. Core1上运行代码出现的问题,是否是因为程序占据了MSMCSRAM 0x001343a0大小的空间,跑在一个Core上可以,但是继续跑在其他核上,就导致MSMCSRAM不够了?

    2. 因为每个Core上跑的程序占据的.far:taskStackSection以及systemHeap过大,不能都放在MSMCSRAM上,能否把这些放置在DDR3?每个Core都划分一个区域放置每个Core的.far:taskStackSection以及systemHeap?

    虽然我简单设置如下

    Program.sectMap[".idleTaskStackSection"] = "DDR3";
    Program.sectMap[".taskStackSection"] = "DDR3";
    Program.sectMap["systemHeap"] = "DDR3";

    结果编译正确,但是程序仅加载到Core0上也出现如下问题

    The DSP core runs @ 983MHz
    ICT BBU Debug Info: QMSS successfully initialized
    ICT BBU Debug Info: CPPI successfully initialized 
    ICT BBU Debug Info: PASS successfully initialized
    ICT BBU Debug Info: Ethernet subsystem successfully initialized
    ICT BBU Debug Info: Tx setup successfully done 
    ICT BBU Debug Info: Rx setup successfully done 
    ICT BBU Debug Info: PASS setup successfully done 
    ICT BBU Debug Info: Core0 SRIO Driver has been initialized
    SRIO start!
    SGMII start!
    *********************************************
    *******ICT Debug Info:SGMII Task Start*******
    *********************************************
    Core Num = 0
    *********************************************
    *******ICT Debug Info: SRIO Task Start*******
    *********************************************
    A0=0x8003ffb8 A1=0x0
    A2=0x1 A3=0xc0d1180
    A4=0xc0927d8 A5=0xc0927c8
    A6=0x8027 A7=0x1
    A8=0x828d20 A9=0xc0d3538
    A10=0xffbeffff A11=0x82ffffff
    A12=0xffbeffff A13=0x82ffffff
    A14=0xffbeffff A15=0xffffffff
    A16=0xc092e18 A17=0x0
    A18=0xc092c34 A19=0x1e0
    A20=0x0 A21=0x0
    A22=0x0 A23=0x0
    A24=0x0 A25=0x0
    A26=0x0 A27=0x0
    A28=0x1088de40 A29=0x134
    A30=0x34022e30 A31=0x8ae928
    B0=0xc092ed0 B1=0x0
    B2=0x0 B3=0x11be2000
    B4=0x82ffffff B5=0x15000102
    B6=0xc0927c8 B7=0x1
    B8=0x8b5978 B9=0x8ae964
    B10=0x11be2000 B11=0x80ff7021
    B12=0xffbeffff B13=0xffffffff
    B14=0x8d94b0 B15=0x8003ffe8
    B16=0x0 B17=0x0
    B18=0x2e20000 B19=0x0
    B20=0x0 B21=0x2e2
    B22=0x2e20000 B23=0x0
    B24=0x0 B25=0x3000
    B26=0x3000 B27=0x0
    B28=0x0 B29=0x0
    B30=0x2e2 B31=0xc092f54
    NTSR=0x1000e
    ITSR=0xf
    IRP=0x85651a
    SSR=0x0
    AMR=0x0
    RILC=0x0
    ILC=0x0
    Exception at 0x82fffffe
    EFR=0x2 NRP=0x82fffffe
    Internal exception: IERR=0x2
    Fetch packet exception
    ti.sysbios.family.c64p.Exception: line 248: E_exceptionMin: pc = 0x82fffffe, sp = 0x8003ffe8.
    To see more exception detail, use ROV or set 'ti.sysbios.family.c64p.Exception.enablePrint = true;'
    xdc.runtime.Error.raise: terminating execution

    3. 还有更好的建议吗?
    调试非常急!望不吝赐教!!谢谢!

  • Andy,

    谢谢!

    我的工程中,4个Core的代码一样(同样的代码,同样的cfg文件)。

    1. 如果在cfg文件中指定某个Core的task stack到某一个section中,cfg中的代码应该怎么写?是在一个工程,一个cfg文件中就能实现?还是说,建立4个工程,用4个cfg不同的文件?

    2. 即使我把MSMCSRAM均分成4个section,每个512KB,也放不下当前代码的task stack以及一些其他量。那么是否应该放在DDR3上?如果放在DDR3,需要怎么设置?我直接放到DDR3,貌似跑不起来。

    谢谢!

  • 我的cfg文件

    我的map文件

    生成的linker cmd file

  • 1 可以是每个core分别用不同的cfg文件;如果使用相同的cfg文件,则可以使用MPAX进行映射,对每个core将相同的逻辑地址映射到不同的物理地址,这个映射可以在boot.c中完成,参考附件。

    2 如果MSMC放不下,就放到DDR了,你的stack开了多大呀,MSMC可是有2M呢。

    关于Memroy的配置及逻辑映射参考如下帖子中的培训材料。

    http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/p/68413/163132.aspx#163132

  • Andy,

    你好!

    1. boot.c怎样加入我现在的工程?我现在的工程是基于SYS/BIOS的。

    2. 我每个Core跑3个任务,三个任务的stacksize加起来有600KB多,如果4个Core一起跑,则要2.4MB多,MSMCSRAM应该是放不下的。

    所以目前,我把task stack都放到了L2中,而把.text放到了MSMCSRAM上。

    .text大概有500多KB,那么在MSMCSRAM中只分配一个500多KB的空间放置.text,4个Core共享这个.text可不可以?如下图中,每个Core的main

    4个Core的main函数入口都为0x0C0B4DF4,_c_int00函数入口都在0x0C0F1F44。

    这样会不会有问题??

    我实际调试时会出现这样的问题,4个Core都加载.out跑起来后,一开始4个Core都运行正常,跑着跑着,其中2个Core就出问题了,显示结果如下

    The DSP core runs @ 983MHzDebug(Core 1): Waiting for SRIO to be initialized.
    Debug(Core 1): SRIO can now be used.
    SRIO start!
    Core Num = 1
    *********************************************
    *******ICT Debug Info: SRIO Task Start*******
    *********************************************
    ti.sysbios.knl.Task: line 345: E_spOutOfBounds: Task 0x8c23ec stack error, SP = 0x81dec8.
    xdc.runtime.Error.raise: terminating execution
    

    这个问题,是因为.text被4个Core共用而导致的吗??

    3. 如果要把某些数据段放到DDR3上,DDR3要进行什么配置吗?

    我用CCS链接自己的C6670板卡,load前都加载GEL,DDR3初始化显示Passed。

    但是我在CMD文件中,把某一个数据段放到DDR3上,如下

    .Tran_Receive_buffer:	load >> DDR3

    只加载到Core0上,程序都跑飞了。如果

    .Tran_Receive_buffer:	load >> MSMCSRAM//或者L2SRAM
    
    

    程序都没问题。而且跟是不是.Tran_Receive_buffer无关。任意数据段或者.text或者.far什么的,只要把某一个放到DDR3上,程序就跑飞。放回到L2RAM或者MSMCSRAM中,就没问题。

  • 1. 跟普通的c文件一样将其加入工程即可;

    2. 每个task stack为什么需要消耗那么大的memory呢,stack主要存放的是局部变量、任务切换及函数调用的上下文信息,一般每个task stack有个几KB就差不多了。代码可以共享没有问题;

    3. 需要保证在load代码及数据到DDR之前将DDR初始化好,请先参考如下附件STK中的memory test对板卡进行memory测试保证DDR测试通过。

    STK: http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx

    根据PCB layout及所选的SDRAM使用DDR spreadsheet生成相应的DDR初始化参数。

    Spreadsheet:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/53384.aspx

  • 您好!

    task跑一些算法,不是我写的,但是根据反馈,说stacksize太小,程序会跑飞。我用ROV观察了一下,stack peak可达70%的总stack size。

    目前,我把Program.heap=81920较小到0x1,把Program.argsize=0x8000减小到0x4.

    然后,把taskstack(.far:taskstacksection)放到L2SRAM,把.text放置到MSMCSRAM中,其他所有段都放到L2SRAM中。

    程序运行正常。

    但是类似这样的问题,感觉还是找不到一个有效的调试方法,就是把各个段搬来搬去,最后跑通了。

    不知道,这类问题,应该参考哪些文档或者?