SYSLINK模块是TI提供的给异构核心(ARM和DSP)通讯的基础软件模块,用户可以根据自身的应用来对SYSLINK模块进行再封装,达到简化应用程序编写的目的。TI也根据不同架构的SOC对其进行针对性的封装,如DAVINCE类处理器所使用的CODEC ENGINE-SERVER的通讯方式,NETRA平台MCFW框架的LINK通讯机制等。
SYSLINK模块主要提供的功能:
Processor Manager,Inter-Processor Communication,Utility
module;详细信息见SysLink UserGuide:http://processors.wiki.ti.com/index.php/SysLink_UserGuide。
本文主要总结SYSLINK模块Inter-Processor Communication下Notify的使用(notify example):
1)主机(HOST)端调用流程:SysLink_setup()--> MultiProc_getId(Main_remoteProcName)--> Ipc_control(remoteProcId,
Ipc_CONTROLCMD_LOADCALLBACK, NULL)-->Ipc_control(remoteProcId, Ipc_CONTROLCMD_STARTCALLBACK, NULL) -->App_exec() -->Ipc_control(remoteProcId,
Ipc_CONTROLCMD_STOPCALLBACK, NULL) -->SysLink_destroy()
2)客户机(C674X或M3)端调用流程:Server_init()--> Ipc_start()--> MultiProc_getId("HOST")-->Ipc_attach(remoteProcId) -->Server_run(remoteProcId) -->Ipc_detach(remoteProcId) -->Ipc_stop() --> Server_exit()
HOST和C674X或M3通讯执行分别在App_exec()和Server_run(remoteProcId)中执行:
App_exec():
/* register notify callback */
status = Notify_registerEventSingle(remoteProcId,
SystemCfg_LineId, SystemCfg_EventId, App_notifyCB, (UArg)NULL);
Server_run(remoteProcId):
/* wait until remote core has registered notify callback */
do {
status = Notify_sendEvent(remoteProcId, SystemCfg_LineId,
SystemCfg_EventId, 0, TRUE);
if (status == Notify_E_EVTNOTREGISTERED) {
Task_sleep(200);
}
} while (status == Notify_E_EVTNOTREGISTERED);
通讯关键在于Notify通道控制函数Notify_registerEventSingle和Notify_sendEvent。通道配置参数为SystemCfg_LineId,
SystemCfg_EventId。