各位技术支持:
最近经NDK和SRIO整合在一起,出了点问题,以下是我的整合方法(我是将SRIO_LoopbackDioIsrexampleproject和helloworld_evmc6678l整合):
由于SRIO和NDK都有初始化QMSS,所以,只要将他们初始化QMSS那块分开就行,
1.注释掉SRIO 里面的system_init(),这个里面是初始化了QMSS了
2.在NDK stacktest()里面,将res_mgr_init_qmss()函数里面的
qmssInitConfig.maxDescNum = p_qmss_cfg->max_num_desc
改成
qmssInitConfig.maxDescNum = p_qmss_cfg->max_num_desc +128;
因为NDK使用128个desc,SRIO也使用128个desc。
NDK使用的时候memory region0, startIdx = 0, 这个跟helloworld demo一样,我修改的是重新给SRIO分配memory region1,startidx=128,
descBase 保证了相对NDK的descBase是一个升序关系,以下是代码:
void mysrioqmssinit() {
Int32 result; Qmss_MemRegInfo memRegInfo;
/* Memory Region 1Configuration */
memRegInfo.descBase = (UInt32 *)l2_global_address((UInt32)host_region);
memRegInfo.descSize = SIZE_HOST_DESC;
memRegInfo.descNum = NUM_HOST_DESC;
memRegInfo.manageDescFlag =Qmss_ManageDesc_MANAGE_DESCRIPTOR;
memRegInfo.memRegion = Qmss_MemRegion_MEMORY_REGION1;//Qmss_MemRegion_MEMORY_REGION_NOT_SPECIFIED;
memRegInfo.startIndex = 128;
/* Initialize and inset the memory region. */
result =Qmss_insertMemoryRegion (&memRegInfo);
if (result < QMSS_SOK)
{
//System_printf ("Error inserting memory region: %d\n", result);
return;
}
}
我将SRIO初始化放到NDK stacktest里面了,初始化顺序:
res_mgr_init_qmss();
mysrioqmssinit();
res_mgr_init_cppi();
res_mgr_init_pass();
enable_srio ();
SrioDevice_init();
Srio_init ();
我使用的平台是研华的8901,8片C6678
最终的现象是:
我将8片DSP在网络链路和SRIO上实现一个菊花链,即
SRIO链路数据流:DSP0->DSP1->DSP2…->DSP0
网络链路上:每个DSP运行一个client和一个sever,DSP0 client 连接DSP1 sever,并给DSP1sever发送数据,DSP1sever将收到的数据通过DSP1的client转发给
DSP2的sever,一次类推,整个测试程序中,SRIO和NDK是一起运行的,每次菊花链循环结束,等待2者都完成,进行下次循环。
发现测试程序每次都运行到第8次后,NDK输出retransmit timeout,导致网络传输失败,后来发现是将SRIO的相关初始化全部注释掉后网络正常,只打开mysrioqmssinit(); 然后网络还是出现retransmit timeout,而且都是在第8次循环开始。
希望各位技术支持帮忙解决下这个问题,或者是告诉下 NDK和SRIO整合在一起需要怎么修改demo程序。
谢谢!!!
jie lei:
不仅仅是NDK和SRIO一起工作会出问题,再加上OpenMP,问题多了去了。
我下了很大工夫才解决了这类问题,总的感受是MCSDK采取的分而治之的策略在实际工程中会遇到很大瓶颈,大部分新开发的基础组件或是成熟组件的抽象层几乎都需要调整。
NDK里面还有一些很隐蔽的bug,在一些情况下会导致信号量溢出,还有大量的代码运行效率非常低,这些内容在实际工程中都需要下功夫解决。
上次问过TI的技术支持,未果,后来调试了N多遍才解决的。
搞技术应该有很大价值才对,很多时候被认为无足轻重,即使能解决复杂问题,实现创新设计,仍然发展渺茫,层层代理层层盘剥,不知搞技术还有前途么。
Andy Yin1:
在res_mgr_init_qmss中会根据qmssInitConfig.maxDescNum的配置得到当前的最大支持描述符个数,单同时也会设置NDK的memory region中的描述符个数为maxDescNum,还会对所有的描述符做完初始化,所以你需要修改res_mgr_init_qmss中在初始化memory region及CPPI init时输入的描述符个数配置,对应memCfg.descNum及cppiDescCfg.descNum。
si cheng:
回复 Andy Yin1:
Andy Yin1 ,你好:
我发现我自定义的函数mysrioqmssinit()里面的Qmss_insertMemoryRegion(),该函数中有以下函数调用,
/* Open general purpose queue */
queueHnd = Qmss_internalQueueOpen (Qmss_QueueType_GENERAL_PURPOSE_QUEUE, 8000/*QMSS_PARAM_NOT_SPECIFIED*/, &isAllocated);
我将QMSS_PARAM_NOT_SPECIFIED 改成8000后,就可以了。
如果是*QMSS_PARAM_NOT_SPECIFIED参数的话,底层会给SRIO 分配 898 queue,因为之前分配给NDK 896,897queue。这样就会出现我之前说过的现象,运行一会就不行了,我估计是底层自动分配给SRIO 的898 queue ,可能在运行过程中NDK和SRIO 都会用到。
但是我现在不确定为什么会产生这种情况,是我哪里操作有问题导致的吗?请Andy Yin1 帮我分析分析,3Q~
gaotai zhang:
回复 si cheng:
si cheng,你好:
我遇到和你类似的问题,一开始SRIO和网络还能一起工作,但是过一段时间后,网络就不能工作了,我在想你能不能把你的NDK和SRIO初始化代码发一份给我学习一下,我知道得到一个能用的配置需要许多的trial and error(我正在这个过程中,非常理解你所经历过的),所以不胜感激。 我的邮箱是 zhanggaotai@gmail.com 如果不方便发工程的话,有关键的初始化代码就行。
Xiao Han:
楼主、TI工程师,您好!我现在也在做类似的工作。两个工程分别对QMSS和CPPI都有初始化,我搞不清楚两个CPPI是同一个还是各自的(QMSS内和SRIO内都有CPPI instance)您能否给我指导一下?CPPI的部分该如何去合并?
Xiao Han:
您好,我现在在做和您非常类似的工作,我已经将SRIO_LoopbackDioIsrexampleproject和helloworld_evmc6678l整合到一起,build通过。但现在遇到的问题是SRIO可以正常工作,网络部分的初始化也已经正常完成,但是网络connect时,连接不上,网络任务(一个基于TCP的task)一直处于阻塞状态。程序还提示:Verify_Init: Expected 0 entry count for Queue number = 898, found 128 entries。我发现SRIO部分根本没有用到这个队列,这是原网络部分给出的提示。
想问一下,您能不能给点建议,这样该朝什么方向查错。能不能把以前程序发我一份。不胜感激! hxlhan123@163.com
xian wang:
回复 jie lei:
在网络初始化及SRIO LLD初始化中都会进行Qmss_init()及Cppi_init()。
关于Qmss_Result Qmss_init(Qmss_InitCfg *initCfg, Qmss_globalConfigParams *qmssGblCfgParams)函数的描述中
This function initializes the Queue Manager subsystem low level driver
This function is called once in the system to setup the queue manager low level driver with information pertaining
to linking RAM and descriptor memory region.关于Cppi_Result Cppi_initCfg( Cppi_globalConfigParams *cppiGblCfgParams, Cppi_InitCfg *initCfg)函数的描述中
This function initializes the CPPI low level driver
This function is called once in the system to setup the CPPI low level driver with information pertaining
to maxinum supported Rx priority.Tx priority,Rx channels,Tx channels,Rx flows and memory mapped address for each CPPI CPDMA.
请问在同时用到网络及SRIO LLD的工程中,Qmss_init()及Cppi_init()的调用只能进行一次么?