大家好,
我的程序为,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 execution3. 还有更好的建议吗?调试非常急!望不吝赐教!!谢谢!
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中。
程序运行正常。
但是类似这样的问题,感觉还是找不到一个有效的调试方法,就是把各个段搬来搬去,最后跑通了。
不知道,这类问题,应该参考哪些文档或者?