DSP/BIOS内核提供了丰富的数据交换途径。利用DSP/BIOS,用户不仅可以方便的实现DSP应用程序与主机的CCS或其他Windows程序之间的数据交换(RTDX和HST),而且还可以利用PIP或SIO实现线程之间的数据交换。
使用旗语,邮箱,队列等都可以实现线程间数据交换,但他们不适合高速实时或大批量的数据交换。
PIP和SIO主要用于I/O数据流的缓冲,这些数据流为线程,DSP芯片和实时外围设备的使用提供了牢固的数据软件结构。
而HST模块主要用于简化DSP目标系统和主机之间的I/O操作。
数据管道用来管理线程之间的数据交换,每个数据管道对象保留一个缓存,并将该缓存分成一定数量的定长的帧,分别有PIP模块的参数numframes和framesize规定。所有通过数据管道的I/O操作一次处理一帧,虽然每帧都是定长的,但是应用程序装入每帧的数据量可以不一样。但最多不超过帧的总长。
一个数据管道有两个末端,写入端是程序写入数据帧的地点,即写线程,读取端是程序读取数据帧的地点,即读线程。
管道能够用于在程序内的任意2个线程之间传递数据。经常地,管道的一端由ISR控制,另一端由软件中断函数控制。数据通知函数(也称为回调函数)用于同步数据的传输,包括通知读函数和通知写函数。当读或写1帧数据时,这些函数被触发,以通知程序有空闲帧或者有数据可以利用。
利用管道的步骤:
1 写入数据
1.1 检查函数PIP_getWriterNumFrames的返回值,即检查指定的PIP对象中可用于装入数据的空帧数量。
1.2 空帧数量大于0,则调用PIP_alloc函数,获取互数据管道中的一个空帧。
1.3 在调用的PIP_alloc返回之前,DSP/BIOS检查数据管道中是否有额外的可用空帧,如果有,则调用通知函数。
1.4 一旦PIP_alloc返回。则使用该空帧,调用PIP-getWriterAddr返回已经分配的帧的起始地址,PIP_getWriterSize 返回写入帧的字数。
1.5 帧装满则返回给数据管道,如果写入帧的字数小于帧的大小。该函数可以通过调用PIP_setWriterSize函数来加以规定,然后调用PIP_put函数来返回数据给数据管道。
1.6 PIP_put函数会运行读通知函数,读取数据。
2 读取数据
2.1 PIP_getReaderNumFrames的返回值,检查数据管道中读取的满帧数量。
2.2 满帧数量大于0,PIP_get函数来获取数据管道的一个满帧。
2.3 在PIP_get函数返回之前,DSP/BIOS将检查数据管道中是否有额外的满帧,如果有,则这个时候带哦用读通知函数。
2.4 一旦PIP_get返回,调用PIP_getReaderAddr和PIP_getReaderSize,读取数据。
2.5 读取完毕后,PIP_free函数将帧返回给数据管道。
2.6 PIP_free函数运行,会调用写通知函数,再次写入。
3 通知函数
一个数据管道的读取和写入线程可以工作在查询模式下,可以通过API函数直接检查管道中是否存在可用的满帧和空帧,以便确定是否可以进行数据的读,写操作。
使用通知函数可以更有效的完成数据传递。
可以在通知函数中,启动一个软件中断,实现读取函数,这样更能提高效率。
4 PIP模块的API调用顺序
每个数据管道对象内部保留了一个空帧的列表,在读取段,有一个空帧计数器,一个满帧列表,在写入端有一个满帧计数器。同时,数据管道对象也包含一个当前写入帧和读取帧的描述符。
5 防止循环问题
应该避免在读写通知函数中直接调用PIP函数,而应该使用软件中断调用PIP函数。
主机通道对象允许应用程序在DSP目标系统和主机之间传送流式数据。