在双核(ARM+DSP)系统中(典型的为达芬奇系统),如何共享缓冲区并进行通信是一个值得学习和思考的问题。
CMEM是一个连续物理存储空间分配模块,使得ARM端Linux进程和DSP端算法之间能够共享缓冲区。DSPLINK即DSP/BIOS LINK是基于DaVinci架构处理器的ARM与DSP端进行通信。
由于应用程序是运行在 MontaVista Linux 之上,在应用程序里进行的地址空间都是虚拟地址,实际上的物理地址空间不一定是连续的,当将这个指针传递给 DSP 端的算法时, DSP 不能够进行处理,因为 DSP 端的算法运行在 DSPBIOS 之上,而 DSP端只能访问实的物理地址,为了解决这个问题, TI 提供了一个 CMEM 模块,用于解决这个问题。
CMEM 是一个连续物理存储空间分配模块,使得 ARM 端 Linux 进程和 DSP 端算法之间能够共享缓冲区。当应用程序需要在共享缓存区动态申请一个连续的物理空间时,通过调用 CMEM 的 API 可以实现,申请得到的空间可以供 DSP 端访问,进行算法处理时数据的传递与处理。
对于DVS365开发套件,CMEM位于:..\dvsdk_2_10_00_17\linuxutils_2_24_02\packages\ti\sdo\linuxutils\cmem
注意:DVS365下的cmem下的demo和测试代码make不通过,待处理。。。。基本测试流程如下图所示:
CMEM Demo 提供了以下测试程序, apitest 用于演示测试 CMEM 的 API 功能,translate 用于演示虚拟地址与实物理地址之间的转换,具体流程如下图所示:
DSPLINK 即 DSP/BIOSTMLINK 是基于 DaVinci 架构处理器的 ARM 与 DSP 端进行通信, DSPLINK 提供了一套通用的 API,从应用层抽象出 ARM 与 DSP 的物理连接特性,从而降低用户开发程序的复杂度。 DSPLINK 可以为用户提供以下 API 服务:
--基本的处理器控制;
--基于逻辑通道的数据传输;
--基于 DSP/BIOS 的 MSGQ 模块的消息传递机制,支持 Zero Copy和 ProcessorCopy 两种物理机制的消息传递。
在实际应用中,应用可能不需要 DSPLINK 提供的所有模块功能,而且可能只需要一种消息传递机制,因此 TI 的 DSPLINK 提供了可配置功能,用户可以根据自己的需要进行裁剪配置,以满足应用需求。
DSPLINK的软件架构如下图所示:
从上图看,在 GPP 端,一般运行一个操作系统,基于 GPP 上还有以下模块:OS抽象层、LINK Driver、Processor Manager、DSP/BIOS LINK API。
--OS抽象层 :该层包含了 DSPLINK 需要的一些通用的 OS 服务部件,提供一套通用的 API 与 OS 的其他组件隔离,其他组件通过API 访问不进行直接的访问。而此特性也使DSPLINK 可以方便的移植到不同操作系统中。
--LINK Driver :该层包含了基于 GPP 与 DSP 的物理连接的底层控制操作,负责 GPP 与 DSP 之间的数据传输和 DSP 的运行等操作。
--Processor Manager:该层维护一个针对所有模块的 Book-Keeping 信息,通过 API 给用户提供通过 LINK Driver 的控制操作。
--DSP/BIOS LINK API:该层是提供给 GPP 端的接口,是非常轻小型的组件,API 层可以认为是基于 PROCESSOR MANAGER 和LINK DRIVER 之上的层。
LINK DRIVER 是 DSP/BIOS 中驱动的一部分,该部分驱动只负责基于物理连接之上与 GPP 之间的交互。 DSP 端没有 DSPLINK 的 API ,通信是基于DSP/BIOSTM 模块上的 SIO、 GIO、 MSGQ 模块实现。