TI C66x DSP平台运行在OSEck系统上,这样存在的进程间的通信方式有以下几种:
1,DSP的同一个core内的不同进程间的通信
这种通信属于core内通信,将会使用OSEck系统提供的系统调用函数,send与receive,A进程调用send函数,将消息发往B进程,消息(在OSEck系统中是signal,signal结构体包括message ID,message接收进程的PID,message的payload指针)的指针将作为send函数的参数,在send函数内部将会把消息挂载到进程B的signal
list上,并判断是否需要切换到进程B(基于抢占式调度);进程B中调用receive函数接收signal,当检测到B的signal list上已有siganl,进程就可开始处理signal(抢占式调度满足条件时,B进程才可以从ready状态切换到running状态)。这种通信由OSEck系统的系统调用函数实现,不需要DSP平台参与。
2,DSP不同core间的进程间通信
这种通信属于跨core通信,将利用C66x DSP的协处理器Queue Manager(C66x系列DSP才有该协处理器,同一个DSP内的所有core共享该硬件,其原理详见TI 多核导航user guide),coreA内运行的B进程与coreC内运行的D进程通信,首先A进程将指向消息payload以及接收消息进程信息的descriptor push到queue manager的queue E,在coreC的DSP 平台进程中将会监控queue
E(监控条件如可以是queue E内的descriptor数,监控queue的功能也由queue manager硬件提供,通过配置相关寄存器实现,无需软件参与),当监控条件满足时,将会产生中断(事先已经注册好中断,与event F触发),在中断函数中,从queue E中pop出descriptor,并从中提取出接收进程的pid,然后下面的事情就是core内通信了,在中断函数中调用send函数,将消息发给D进程。从而事先跨core的不同进程间的通信。
3,不同DSP间的进程通信
这种通信方式将会利用DSP的SRIO硬件实现,DSP A中coreB的C进程与DSP D中coreE的F进程通信,也将利用queue manager硬件,在C66x DSP的SRIO硬件中,其对外提供的接口只有queue,即C进程必须把descriptor push到queue G(SRIO的输入queue,在user guide中,SRIO的输入queue numer是固定的),然后F进程通过SRIO通信机制拿到descriptor,进而完成跨DSP通信。
这里只是简要介绍这三种通信机制,在以后文章中将会详细讨论。