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等等。
一周热门 更多>