DSP/BIOS环境下的数据通信
,由PIP与HST模块使用;另一种是流模型,由SIO与DEV模块使用。2个模型都要求1个管道或者流具有1个读线程和1个写线程。2个模型都通过拷贝指针而不是数据来完成数据的拷贝。一般来说,管道模型支持低级通信,而流模型支持高级的、与设备无关的I/O。具体情况如表1所列。
表1DSP/BIOS环境下通信方式的比较
管道对象(PIP与HST)流对象(SIO与DEV)程序员必须创建自己的驱动程序提供了一种创建设备驱动程序的更加结构化方法读/写线程可以是任意线程类型或者主机PC一端必须由使用SIO调用的任务(TSK)来处理,另一端必须由使用Dxx调用的HWI处理PIP函数是非阻塞的,程序在管道写或读之间必须进行检查,以确保缓冲区可利用SIO_put、SIO_get和SIO_reclaim是阻塞函数(SIO)_issue是非阻塞函数)使用更少的内存,一般较快更加灵活,使用简单每个管道拥有自己的缓冲区缓冲区能够从一个流传输到另一个流而不用拷贝管道必须使用配置工具静态地配置流可以在运行时刻创建或者使用配置工具静态地配置对推栈设备(stackingdevic)没有内建地支持提供对堆栈设备(stackingdevic)的支持使用HST(内部PIP实现)使得主机与目标机的通信容易起来DSP/BIO提供了大量的设备驱动程序
2基于管道通信的一个例子
在基于以上分析的基础上,给出利用管道进行通信的1个例子。该例是音频处理的一个例子。数据从数据源输入到编码器以后经量化通过串行口输入到目标机,目标机处理完毕后再经串行口发送到编码器,由编码器经扬声器输出。图2给出数据的流程图。
(1)管道设计
该例中,设计了DSS_rxPipe和DSS_txPipe两个管道,其中DSS_rxPipe用于数据的接收,DSS_txPipe用于数据的发送。
(2)线程设计
由于每个管道分别对应1个读写线程,因此,发送管道与接收管道总共需要4个读写线程。本例中为了简化设计,只设计了2个线程。其中,音频处理函数(设计为软件中断SWI)既作为接收管道的读线程又作为发送管道的写线程;串行口接收中断处理服务例程ISR既作为接收管道的写线程又作为发送管道的读线程。
每次中断发生时,串行口中断服务例程(ISR)把数据接收寄存器(DRR)中的数据字(32位)拷贝到数据接收管道的一空闲帧中。当1帧被填满时,ISR把该满帧写到数据接收管道中(通过调用PIP_put),供该管道的读线程(即音频处理函数)读取。音频处理函数执行时,它读取接收管道中的一满帧,处理完毕后再把它写到发送管道的一空闲帧中,供该管道的读线程(即ISR)发送。每次ISR触发时,它从发送管道中读取一满帧(若有的话),并每次32位字地发向串行口发送寄存器(DXR)直到1帧中的所有数据发送完毕。然后,该空闲帧被回收到发送管道,供音频处理函数(即该管道的写线程使用)。需要注意的是,由于例子当中发送速率与接收速率一样,因此,中断处理函数不但负责数据的接收也负责数据的发送,并且每次中断执行时只发送1个32位字。
(3)需注意的问题
PIP_alloc和PIP_put由PIP对象的写线程调用,PIP_get和PIP_free由PIP对象的读线程调用,这种调用顺序是非常重要的。若打乱这种调用顺序,将会产生不可预测的后果。因此,每一次对PIP_ 《DSP/BIOS环境下的数据通信(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/174561.html
表1DSP/BIOS环境下通信方式的比较
管道对象(PIP与HST)流对象(SIO与DEV)程序员必须创建自己的驱动程序提供了一种创建设备驱动程序的更加结构化方法读/写线程可以是任意线程类型或者主机PC一端必须由使用SIO调用的任务(TSK)来处理,另一端必须由使用Dxx调用的HWI处理PIP函数是非阻塞的,程序在管道写或读之间必须进行检查,以确保缓冲区可利用SIO_put、SIO_get和SIO_reclaim是阻塞函数(SIO)_issue是非阻塞函数)使用更少的内存,一般较快更加灵活,使用简单每个管道拥有自己的缓冲区缓冲区能够从一个流传输到另一个流而不用拷贝管道必须使用配置工具静态地配置流可以在运行时刻创建或者使用配置工具静态地配置对推栈设备(stackingdevic)没有内建地支持提供对堆栈设备(stackingdevic)的支持使用HST(内部PIP实现)使得主机与目标机的通信容易起来DSP/BIO提供了大量的设备驱动程序
2基于管道通信的一个例子
在基于以上分析的基础上,给出利用管道进行通信的1个例子。该例是音频处理的一个例子。数据从数据源输入到编码器以后经量化通过串行口输入到目标机,目标机处理完毕后再经串行口发送到编码器,由编码器经扬声器输出。图2给出数据的流程图。
(1)管道设计
该例中,设计了DSS_rxPipe和DSS_txPipe两个管道,其中DSS_rxPipe用于数据的接收,DSS_txPipe用于数据的发送。
(2)线程设计
由于每个管道分别对应1个读写线程,因此,发送管道与接收管道总共需要4个读写线程。本例中为了简化设计,只设计了2个线程。其中,音频处理函数(设计为软件中断SWI)既作为接收管道的读线程又作为发送管道的写线程;串行口接收中断处理服务例程ISR既作为接收管道的写线程又作为发送管道的读线程。
每次中断发生时,串行口中断服务例程(ISR)把数据接收寄存器(DRR)中的数据字(32位)拷贝到数据接收管道的一空闲帧中。当1帧被填满时,ISR把该满帧写到数据接收管道中(通过调用PIP_put),供该管道的读线程(即音频处理函数)读取。音频处理函数执行时,它读取接收管道中的一满帧,处理完毕后再把它写到发送管道的一空闲帧中,供该管道的读线程(即ISR)发送。每次ISR触发时,它从发送管道中读取一满帧(若有的话),并每次32位字地发向串行口发送寄存器(DXR)直到1帧中的所有数据发送完毕。然后,该空闲帧被回收到发送管道,供音频处理函数(即该管道的写线程使用)。需要注意的是,由于例子当中发送速率与接收速率一样,因此,中断处理函数不但负责数据的接收也负责数据的发送,并且每次中断执行时只发送1个32位字。
(3)需注意的问题
PIP_alloc和PIP_put由PIP对象的写线程调用,PIP_get和PIP_free由PIP对象的读线程调用,这种调用顺序是非常重要的。若打乱这种调用顺序,将会产生不可预测的后果。因此,每一次对PIP_ 《DSP/BIOS环境下的数据通信(第2页)》