例5 PIP对应的读任务:
extern far PIP_Obj pip;
reader()
{
Uns size;
Ptr addr;
if(PIP_getReaderNumFrames(&pip)>0)
{
PIP_get(&pip);
addr=PIP_getReaderAddr(&pip);
size=PIP_getReaderSize(&pip);
/*Code to empty the frame*/
PIP_free(&pip);
}
else{
LOG_error(″no frames available″);
/* or you could just return;*/
}
}
例6 PIP对应的写任务:
extern far PIP_Obj pip;
writer()
{
Uns size;
Ptr addr;
if(PIP_getWriterNumFrames(&pip)>0){
PIP_alloc(&pip);
addr=PIP_getWriterAddr(&pip);
size=PIP_getWriterSize(&pip);
/* fill the frame up to size */
PIP_put(&pip);
}
else{
LOG_error(″no frames available″);
/* or you could just return;*/
}
}
由逻辑关系可以看到,通过使用PIP应用程序可以保持一个简单统一接口而不必关心具体的硬件操作,因此当该软件移植到不同环境中时,至多只需要改写设备驱动程序。使用PIP的一个具体实例就是HST模块。HST模块在主机和DSP之间建立起一条数据链路,该链路就是一个PIP对象。对HST的操作方式与PIP一致。其差别仅仅在于HST在初始化时指向了预定义的DSP上的HPI接口而已。
SIO:从PIP的逻辑关系可以看出,读写PIP就是一个数据拷贝的过程。这在某些应用中,如实现网络协议TCP/IP时,不是非常有效。因为数据每向上传递一层就需要进行一次数据拷贝,其效率非常差。如果采用SIO来实现就会有很大的改善。SIO的操作只有get()和 put()两种。与PIP不同的是SIO没有自己的缓冲队列。每次get() 或 put() 操作时都会在应用程序和设备驱动程序之间交换缓冲的指针。所以SIO操作的实质是数据地址的交换。由于没有数据拷贝,其运行效率就很高。SIO的运行逻辑如图4所示。
7 RTDX
实时数据交换Real-Time-Data-eXhange是DSP/BIOS提供的一个全新的功能。在很多应用中要求DSP不能够停下来,而需要从主机中实时地读取数据或者向主机实时地输出数据。德州仪器的C5000,C6000系列的DSP都可以通过JTAG接口来实现这个功能。其逻辑结构如图5所示。