TI中文支持网
TI专业的中文技术问题搜集分享网站

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,见下图

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

望指教!谢谢!

Brighton Feng:

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

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

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

 

Andy Yin1:

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

Feng Jin:

回复 Brighton Feng:

您好! 

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 CONFIGURATIONnameoriginlengthusedunusedattrfill
-------------------------------------------------------------------L2SRAM0080000000100000000dfc08000203f8RW XMSMCSRAM0c00000000200000001343a0000cbc60RW XDDR380000000200000000000000020000000RWIXSEGMENT ALLOCATION MAPrun originload originlengthinit length attrs members
--------------------- ---------- ----------- ----- -------
00800000008000000005970000059700r-x0080000000800000000596e0000596e0r-x .text008596e0008596e00000002000000020r-- .const.1
0085970000859700000389c800000000rw-0085970000859700000389c800000000rw- .far.1
008920d0008920d0000004b000000000rw-008920d0008920d0000004b000000000rw- .far.2
00892580008925800001c59e0001c59er--00892580008925800001c59e0001c59er-- .const.2
008aeb20008aeb200000821a0000821arw-008aeb20008aeb200000821a0000821arw- .fardata
008b6d40008b6d400001008000000000rw-008b6d40008b6d400000808000000000rw- tcp3DriverSection008bedc0008bedc00000800000000000rw- tcp3DDataSection
008c6dc0008c6dc00001208000008000rw-008c6dc0008c6dc00000800000008000rw- .args008cedc0008cedc00000800000000000rw- .stack008d6dc0008d6dc00000208000000000rw- tcp3QueueDescrSection
008d8e40008d8e400000019c0000019cr--008d8e40008d8e400000019c0000019cr-- .switch.1
008d9000008d9000000004b0000004b0r-x008d9000008d90000000020000000200r-x .vecs008d9200008d9200000002b0000002b0r-- .switch.2
008d94b0008d94b0000000b400000000rw-008d94b0008d94b0000000b400000000rw- .bss
008d9564008d9564000000d1000000d1rw-008d9564008d9564000000d1000000d1rw- .neardata
008d9638008d96380000006800000068r--008d9638008d96380000006800000068r-- .rodata
008d96a0008d96a0000001a000000000rw-008d96a0008d96a00000012000000000rw- .cio008d97c0008d97c00000008000000000rw- tcp3DataSection
008d9840008d9840000063fc000063fcr--008d9840008d9840000063fc000063fcr-- .cinit
0c0100000c010000001219a000000000rw-0c0100000c0100000007b8a000000000rw- .Tran_Receive_buffer0c08b8a00c08b8a00006080000000000rw- .far:taskStackSection0c0ec0a00c0ec0a00003c00000000000rw- systemHeap0c1280a00c1280a00000990000000000rw- IRAM
0c131a000c131a000000288000000000rw-0c131a000c131a000000240000000000rw- .qmss0c133e000c133e000000048000000000rw- .cppi
0c1342800c1342800000018000000180rw-0c1342800c1342800000018000000180rw- .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 initializedICT BBU Debug Info: PASS successfully initialized
ICT BBU Debug Info: Ethernet subsystem successfully initialized
ICT BBU Debug Info: Tx setup successfully doneICT BBU Debug Info: Rx setup successfully doneICT BBU Debug Info: PASS setup successfully doneICT 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. 还有更好的建议吗?调试非常急!望不吝赐教!!谢谢!

Feng Jin:

回复 Andy Yin1:

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,貌似跑不起来。

谢谢!

Feng Jin:

回复 Andy Yin1:

我的cfg文件

我的map文件

生成的linker cmd file

Andy Yin1:

回复 Feng Jin:

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

Feng Jin:

回复 Andy Yin1:

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中,就没问题。

Feng Jin:

回复 Andy Yin1:

您好!

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

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

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

程序运行正常。

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

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

赞(0)
未经允许不得转载:TI中文支持网 » C6670 ROV观察Task Stack的问题
分享到: 更多 (0)