目前想实现8核同时运行不同的算法,然后分别将结果通过swrite包从SRIO 4x发出。每个核单独使用一个LSU,每个LSU分配相同数量的shadow register,当多个核同时配置不同的LSU发包时,SRIO底层是如何在多个LSU之间仲裁的?是采取下面哪一种方式?
1、采取优先级的方式,先到先发,直到将一个LSU所请求的数据包全部发出之后,才开始发送下一个LSU请求的包。
2、所有LSU优先级相同,在不同的LSU间以round robin的形式循环发包,依次为每个LSU发一定数量的包,直到把所有核要发送的数据发送完毕。
yao yao2:
你好,我们原先只使用单核的SRIO 4X,现在需要在多核使用SRIO,我是在TI提供的例程基础上修改的SRIO。有以下问题想请教您
1、多核srio需要修改原先例程的驱动函数吗?那个driver函数的句柄如何让所有核共享呢?
2、是否要在每个核上都初始化和配置srio socket?
3、如何在多核上分配LSU?
4、dsp通过srio与fpga通信,是否每个核都可以相应doorbell中断?
谢谢!
miker wang:
回复 yao yao2:
你好!
1、我也是在PDK例程的基础上改的,但是我的改动比较大,把driver部分全部替换成了底层csl驱动来实现,并没有使用任何PDK里的SRIO driver函数。
2、应该需要的。
3、不需要分配,一共8个LSU,每个核想用哪个就用哪个。从提高传输效率的角度来看,最好还是每个核使用单独的LSU。
4、可以,SRIO里一共有24个中断源INTDST0~23,其中8个是直接映射到每个核内部的中断控制器,其余16个都可通过片上中断控制器CIC0和CIC1进行二次路由。你只需要将doorbell中断路由到这16个中断源中的任意一个,然后再通过CIC0和CIC1将该中断源二次路由到每个核内部的中断控制器就可以了。
yao yao2:
回复 miker wang:
你好!
谢谢你的回复!
我用的是6670芯片,例程里的驱动是有问题吗?那我理解是先只用一个核先对srio外设配置和初始化,然后在每个核再初始化socket吧。那配置中断应该放在那里呢?是每个核都要单独配置吧?
miker wang:
回复 yao yao2:
1、驱动本身没有任何问题,相对也比较稳定。只是我觉得驱动函数相对结构比较复杂,代码量也比较大,生成的out文件里.text段也比较大,过于冗余,用起来感觉也不顺溜。所以直接用PDK里的CSL来实现,代码精简了很多。
2、doorbell中断路由只需要配置一次,中断二次路由到每个核都要在每个核中单独配置。
yao yao2:
回复 miker wang:
你好!
关于doorbell中断,我还是没有在多核的情况下调通,我理解的是doorbell中断路由到不同的host interrupt ID上,每个核都有自己的host interrupt ID,这个我是在bios启动之后在socket start之前在每个核上单独配置的,现在的情况是dsp做自环数据是可以收发正确的,但是无法进入doorbell中断。
以下是我配置的doorbell中断,初始化时的配置未列出应该是没问题的,我用的是CSL_INTC0_INTDST1和CSL_INTC0_INTDST5,并将其绑定到host interrupt ID 8(core0的) 和 host interrupt ID 24(core1的)。我是不是哪里配置的有问题或者理解的有问题要,期待您的解答!
CSL_SRIO_DisableInterruptPacing(hSrioCSL,1);
CSL_SRIO_DisableInterruptPacing(hSrioCSL,5);
CpIntc_dispatchPlug(CSL_INTC0_INTDST1,(CpIntc_FuncPtr)myDoorbellIsr1,(UArg)hDrvManagedSrioDrv,)
CpIntc_dispatchPlug(CSL_INTC0_INTDST1,(CpIntc_FuncPtr)myDoorbellIsr1,(UArg)hDrvManagedSrioDrv,)
CpIntc_mapSysIntToHostInt(0,CSL_INTC0_INTDST1,8);
CpIntc_mapSysIntToHostInt(0,CSL_INTC0_INTDST5,24);
CpIntc_enableSysInt(0,CSL_INTC0_INTDST1);
CpIntc_enableSysInt(0,CSL_INTC0_INTDST5);
eventID_0 = CpIntc_getEventId(8);
eventID_1 = CpIntc_getEventId(24);
EventCombiner_dispatchPlug(eventID_0,CpIntc_dispatch,8,TRUE);
EventCombiner_dispatchPlug(eventID_1,CpIntc_dispatch,24,TRUE);