Davinci的异构多核间通信基础组件SysLink (3)

2019-07-15 01:08发布

Davinci的异构多核间通信基础组件SysLink


  4.1.3、如何使用SharedRegion中的内存
       SharedRegion中的内存可以使用Memory_alloc(IHeap_Handle heap, SizeT size, SizeT align, Ptr eb)来动态分配。IHeap_Handle获取方式如上例中gUtils_heapMemHandle = SharedRegion_getHeap(srId);
       4.1.4、相关API
  • SharedRegion_clearEntry()
  • ShareRegion_entryInit()
  • SharedRegion_getCacheLineSize()
  • SharedRegion_getEntry()、SharedRegion_setEntry()
  • SharedRegion_getHeap()
  • SharedRegion_getId
  • SharedRegion_getIdByName()
  • SharedRegion_getNumRegions()
  • SharedRegion_getPtr()
  • SharedRegion_getSRPtr()
  • SharegRegion_isCacheEnabled()
  • SharedRegion_translateEnabled()
  • SharedRegion_inValidSRPtr()

复制代码
      4.2、List
       List模块封装了双向循环链表的操作API,SYS/BIOS侧见“ti.sdo.utils.List”实现,HLOS侧见 “DVRRDK_xx.xx.xx.xx i_toolssyslinksyslink_x_xx_xx_xxpackages isyslinkutilshlosList.c”中实现。提供的API也就是通常用于操作链表的一些api接口,这里就不多介绍了。
       4.3、Trace
       用于打印相关调试是使用,有点像CCS下的探针,在SysLink中根据所带的参数分了7种不同的探针,不多介绍,具体实现参考“DVRRDK_xx.xx.xx.xx i_toolssyslinksyslink_x_xx_xx_xxpackages isyslinkutilscommonTrace.c”
       在调试TI的各种开发包(如HDVPSS  ISS等)时非常方便,加载syslink.ko时需要附加参数TRACE,如:
  • insmod syslink.ko TRACE=1
  • insmod syslink.ko TRACE=1 TRACEFAILURE=1 TRACECLASS=3
  • insmod syslink.ko TRACE=1 TRACEFAILURE=1 TRACEENTER=1 TRACECLASS=3


复制代码
      4.4、MultiProc
       MultiProc模块用于多核处理器中唯一的标识处理器(多处理器ID管理,如果你看了fwload的程序,肯定注意到其中调用MultiProc_getId获取ProcId用于ProcMgr_open的参数),在使用该模块前,需要在IPC环境中使用*.cfg脚本来配置多处理器环境。
       如:在DVRRDK_xx.xx.xx.xxdvr_rdkmcfwsrc_bios6cfg i816xSYSLINK_c6xdsp.cfg中
  • /*******************************************************************************
  • * SysLink  SysMgr initializations - IPC is a part of sysLink
  • *
  • ******************************************************************************/
  • var MultiProc              = xdc.useModule('ti.sdo.utils.MultiProc');
  • var Notify                 = xdc.useModule('ti.sdo.ipc.Notify');

  • /* The DSP is processor id 0 and there are 3 other cores */
  • MultiProc.setConfig("DSP", ["DSP", "VIDEO-M3", "VPSS-M3", "HOST"]);

复制代码
      除了上述的静态设置方法外,还可以主处理器起来后(此时从处理器均未startup,不能强制配置其Proc_ID)通过GPIO、Nand、EEPROM等手段动态获取,使用MultiProc_setLocalId() API设置,但cfg文件配置还是需要的,只不过此时相应处理器名称设置为NULL。

       MultiProc模块提供的API主要有:
       1.获取/设置多核系统的基ID:MultiProc_getBaseIdOfCluster()/MultiProc_setBaseIdOfCluster();
       2.通过处理器名字检索其ID:MultiProc_getId();
       3.通过处理器ID检索其名字:MultiProc_getName();
       4.查询多核系统的处理器数:MultiProc_getNumProcessors()/MultiProc_getNumProcsInCluster();
       5.返回当前处理器的ID:MultiProc_self();
       6.设置处理器ID:MultiProc_setLocalId();

       4.5、NameServer
       NameServer直译为名称服务器,大致看了下实现过程,有点像简单的网络中的DNS(Domain Name Server),即可以根据名字查找某对象(DNS中可以根据网址查找到对应网址的IP)。
       NameServer的实现原理:基于链表的结构,并且可以根据设置决定是否对value域进行Hash编码(查了下资料,这个可能是从java中吸其精华而改造来的),其基本数据结构如下:
  • typedef struct NameServer_TableEntry_tag {
  •     List_Elem                 elem;
  •     /* List element */
  •     UInt32                    hash;
  •     /* Hash value */
  •     String                    name;
  •     /* Name portion of the name/value pair. */
  •     UInt                      len;
  •     /* Length of the value field. */
  •     Ptr                       value;
  •     /* Value portion of the name/value entry. */
  •     Bool                      collide;
  •     /* Does the hash collides? */
  •     struct NameServer_TableEntry_tag * next;
  •     /* Pointer to the next entry, used incase of collision only */
  • } NameServer_TableEntry;

复制代码
      ameServer提供了以下API:
  • NameServer_Params_init()
  • NameServer_create()/NameServer_delete()
  • NameServer_getHandle()
  • NameServer_add()
  • NameServer_addUInt32()
  • NameServer_get()/NameServer_getUInt32
  • NameServer_getLocal()/NameServer_getLocalUInt32()
  • NameServer_removeEntry()/NameServer_remove()

复制代码
      在SysLink中很多组件都用到了NameServer,如FrameQ、HeapMemMP、GateMP、ListMP、MessageQ。RingIO等等。
0条回答

一周热门 更多>