各位技术支持:
最近经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程序。
谢谢!!!