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\ti_tools\syslink\syslink_x_xx_xx_xx\packages\ti\syslink\utils\hlos\List.c”中实现。提供的API也就是通常用于操作链表的一些api接口,这里就不多介绍了。
4.3、Trace
用于打印相关调试是使用,有点像CCS下的探针,在SysLink中根据所带的参数分了7种不同的探针,不多介绍,具体实现参考“DVRRDK_xx.xx.xx.xx\ti_tools\syslink\syslink_x_xx_xx_xx\packages\ti\syslink\utils\common\Trace.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.xx\dvr_rdk\mcfw\src_bios6\cfg\ti816x\SYSLINK_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等等。
|