专利名称:多处理器对象控制的利记博彩app
申请的优先权来自临时申请系列第60/199,753;60/199,755;60/199,917;和60/199,754号;全部在04/26/2000申报。
本发明涉及电子设备,尤其是涉及多处理器和数字信号处理器的分布对象及其方法。
因特网的增长联同高速的网络接入已经推动着分布式计算成为主流。公用对象请求代理调度程序体系结构(CORBA)和分布元件对象模型(DCOM)标准已经出现简单化的面向对象网络编程和分软件方法。这样一个客户应用程序能访问一个提供数据或功能的远程服务器对象并因此简化应用程序设计;图24示例了普通的远程程序访问结构。实际上,面向对象的程序设计封装详细资料并因此仅给出用于询问或允许这种分布计算的其它对象互作用的对象接口。
CORBA的核心是为对象间相互作用提供“总线”的对象请求代理(ORB),不论是本地还是远程。一个CORBA对象是一套方法加一个接口。作为调用方法的处理,CORBA对象的客户使用的参考对象好像对象是位于客户的地址空间中。ORB负责发现一个对象的实现(在一个可能的远程服务器上),对这个对象从一个客户应用程序接收一个调用请求进行准备,从客户输送请求(例如,参数)到对象,并从对象把一些答复返回到客户。通过一个ORB接口或一个对象适配器,对象的实现对ORB有影响。图25显示了整个CORBA的结构。
通常在面向对象程序设计中,当对详细资料(数据,实现)进行隐匿时,一个语言定义(IDL)的接口定义了一个包括由客户调用的方法的对象接口。典型的,IDL提供数据封装,多形性,和继承性。如图24所示,客户调用一个对象的功能首先是产生一个到客户存根(代理)的访问;存根把访问参数整理成一条信息;电线协议把信息发送到服务器存根(框架);服务器存根不对信息的访问参数进行整理并访问对象的功能。在图25的顶层是基本的程序设计体系结构,中层是远程体系结构,和底层是电线协议体系结构。客户编程和服务器对象编程的开发者同基本程序设计体系结构一起工作,在客户和服务器的进程中参考对象和处理有意义的事情。电线协议有效的把远程体系结构扩展到各种硬件设备中。
如Cheung等人所描述的,DCOM和CORBA并排的,步进的,和多层的,使用一个带有允许CORBA客户和服务器的远程对象的一个简单应用程序能产生五个文件(1)一个用于定义对象接口的IDL文件。IDL编译器将生成客户存根和对象骨架代码加上一个由客户和服务器使用的首标文件接口。(2)一个实现首标文件导出来自接口对象的服务器实现类别。实质上,实现类别与由IDL编译器产生的接口类别相关(通过继承性)。(3)一个服务器类别的实现方法。(4)一个用于服务器的主程序;这个程序将示例一个服务器类别的例子(对象)。和(5)通过访问客户存根调用对象方法的客户应用程序。
对于静态对象的调用,在编译之后,仅在执行之前,CORBA登记在实现储存库中的可执行服务器的接口名和路径名之间的关联(看图25)。对于动态对象的调用,IDL编译器也产生在一个接口中每种方法的类型信息并通过动态调用接口调用在动态对象上的一种方法。同样,在服务器这边,动态框架接口允许一个客户调用在一个对象上的操作,该对象不具有正在实现的对象的编译时的类型知识。
图26a显示了CORBA顶层的一个对象的客户请求活动以及调用它的方法,服务器产生一个对象的例子以及它对于客户的可用性。尤其是,对象接着活动(1)客户访问用于对象接口的客户的静态功能。(2)ORB启动包含一个支持对象接口对象的服务器。(3)服务器对一个对象示例编程并登记参考对象。(4)ORB把参考对象返回到客户应用程序。然后为了[1],[2]的对象调用方法,客户访问最后调用服务器中方法的对象接口的方法。如果方法返回值,则服务器发送这些值回到客户。
图26b示例了CORBA与对象的中层(远程体系结构)活动(1)依据接收的访问,客户存根把任务委派到ORB。(2)ORB咨询实现储存库把调用映象到它的服务器路径名,并激活服务器编程。(3)服务器示例对象并且还产生得到的参考对象的唯一参考ID。它向ORB登记参考对象。(4)用于服务器类别的构造符也产生一个框架类别的例子。(5)ORB把对象参考航向发送到客户和也产生一个客户存根类别的示例并把它登记在与参考对象相应的客户存根对象表中。(6)客户存根返回一个参考对象到客户。随后客户调用对象的方法进行,通过[1]依据收到的客户对客户存根的访问,产生一个请求伪对象,整理访问的参数进到伪对象,请求在通道中把伪对象翻译成一条信息送到服务器,并等待应答。[2]当信息到达服务器时,ORB发现目标框架,重构请求伪对象,并把它转发到框架。[3]框架不整理来自请求伪对象的参数,调用服务器对象的方法,整理返回值(如果有的话),并返回来自框架的方法。ORB建立一个应答信息并把它放在发送缓冲器中。[4]当应答到达客户边时,在从接收缓冲器中读出了应答信息后,ORB访问返回。随后客户存根不对返回值进行整理并把它们返回到客户以便完成访问。
如图26c示例了底层的对象活动包括(1)依据收到的请求,客户边的ORB选择一个支持对象的机器并经过TCP/IP发送一个请求到服务器边的ORB。(2)当服务器被服务器边的ORB启动时,一个对象被服务器所示例,ORB构造符被调用,并且生成函数被调用。在生成函数内部生成一个插口端点,对象被分配一个对象身份,生成一个包含接口和实现名,参考身份,和端点地址的参考对象。参考对象向ORB登记。(3)当参考对象被返回到客户边,客户存根抽取端点地址和建立一个到服务器的插口连接。然后调用方法如下进行[1]依据收到的调用,客户存根整理公用数据表示(CDR)格式中的参数。[2]请求通过建立的插口连接被发送到目标服务器。[3]目标框架通过参考身份或借口示例识别符被识别。和[4]在对服务器对象的实际方法进行调用之后,框架整理CDR格式中的返回值。
CORBA的实时扩充典型的提供服务(QoS)方面的质量,比如可预测的性能,安全操作,和资源配置。例如,Gill等人,为下一代分布式应用程序,应用自适应中间设备管理端到端的QoS。
已经介绍了作为元类型的CORBA元件,并且对于描述的实现过程,可以得到相关的实现定义语言的元件。图27示例了编程步骤。
DCOM同样具有三层并且与CORBA的体系结构有点相似。
Notenboom USP 5,748,468和Equator Technologies PCT发表的申请WO99/12097都描述了给处理器的资源分配多任务的方法。Notenboom按照早先的系统考虑,用一个主处理器加上带有分配任务的协处理器资源的协处理器。Equator Technologies按照任务时间消耗调度处理器资源,由于存在于至少一个被支持的服务级(处理器资源消耗率)上,并且如果存在足够的资源用于一个被支持的服务级,资源管理器允许接受一个任务。
带有两个或更多处理器的系统,每个处理器有它自己的造作系统或BIOS,包括有分开很远的多个处理器的系统,多个处理器经因特网相连,还有两个或多个处理器集成在相同的半导体电路小片上的系统,比如一个RISC CPU加上一个或多个DSPs。
XDAIS标准规定了在DSPs上的接口算法;这提供了可再次使用的对象。XDAIS需要实现IALG接口标准的一种算法加上用于运行这种算法的一个扩充。XDAIS也需要依照某种灵活的规则,比如浮动代码和命名约定。通过到一个函数指针表中访问,一个客户应用程序能够管理一个算法的示例。有了XDAIS的标准/准则,算法开发者能够开发或转换算法以便把它容易地插到一个DSP应用程序框架中,比如iDSP媒体平台DSP框架。
因为需要服务质量,在一个网络节点内的管理程序明确地源自所有基于应用程序的流媒体的实时服务需求。流媒体应用程序必须处理多机种编译码器(编码器/译码器)和带有唯一翻译最后期限的过滤器。对于在服务质量中的故障弱化,这些应用程序也应该能够开发和翻译人感性的特征。他们应能够合理地处理进程中和翻译周期的抖动量。例如,,在视频应用程序中,翻译的帧率必须维持在30帧/sec(fps),即33ms翻译一个帧周期。然而,应用程序应该能够经得起与服务器协商时有限的瞬时变化。而且,在30fps,人的视觉感官能经受住大约6帧/sec的丢帧。客户应用程序还应能够支撑住性能的故障弱化和在与服务器协商的特殊容许的范围内维持翻译的稳定状态。一个QoS管理器是为实现这样一种实时系统提供所需的功能和能力的机制。
作为宽带通信,比如DSL和电缆调制解调器融入新的市场,并且把空前的数据容量传送到用于数据处理和消费的消费者设备上,将需要保持更有效的数据处理,路由安排,和处理技术。
图20显示了通过当前多机种系统处理部件的数据信息流。每个数据处理被编号以显示时间顺序。每个数据处理必须经过由中心控制处理器(CCP)控制下的系统总线。经过系统中的控制路径到各个处理部件,CCP通过发送信息或触发来初始数据处理。
图20中的处理部件显示了分离的能够运行一组定义的任务的处理器(例如,DSPs,ASICs,GPPs,等等)。这就是为什磨每个处理器带有自己的存储器。在同一处理器上的处理部件也能单独运行任务。
在一些情况下,相同的数据必须多次经过系统总线(例如,1和2,3和4,5和6)。在这样的系统中,数据必须经过系统总线的次数总共为2+(2×n),或者在这种情况下是6次。每次经过系统总线要由CCP介绍附加数据流的介入,降低了整个系统的吞吐量。
附加数据流对给定的时间帧中通过系统的数据量起到负面影响并因此限制了系统所能够处理的数据量。这样一个系统很可能执行的有用的任务比它全部的部件所显示出的能力要少。
本发明提供一种带有一个或多个特征的客户-服务器系统,包括两个阶段服务器的任务调度,一个用于客户-服务器系统的对象请求代理,该客户-服务器系统带有服务器DSPs上的任务链接,多任务处理器的内存通过把内存划分成处理器的总开销加一个任务工作空间进行管理,该任务工作空间属于每次一个单独执行的任务,多种机系统包括一个中心控制处理器加总线。连接的处理部件加一个用于处理部件的共享存储器,避免了多种机系统中的数据流经过中心控制处理器的总线。
为了清楚附图是启发式的。
图1显示DSPORB结构的优选实施例。
图2示例了IDL编译。
图3-13是QoS随时间的图。
图14-19显示分解存储器的优选实施例。
图20显示在一个多种机系统中的已知数据流。
图21-23显示数据流的优选实施例。
图24-27示例了CORBA。
描述实施例优选实施例的系统典型的具有一个运行客户应用程序的主处理器加一个或多个运行服务器算法的服务器处理器,以及包括用于算法对象的对象请求代理,用于对象请求代理的服务质量控制,用于算法对象的内存分页,和用于算法对象的数据流。一个称为iDSPOrb的优选实施例应用到带有一个主处理器和一个或多个DSP协处理器的系统上。
iDSPOrb是一个高性能的DSP对象请求代理(DSPORB),它支持在多处理器环境中从一个通用处理器(GPP)或DSP到DSP对象的创建和访问。iDSPOrb具有一个普通的体系结构和类似于CORBA的操作。iDSPOrb具有下列DSPORB的特征(1)iDSPOrb支持对象汇集和调用(DSP对象调用程序)穿过处理器边界。
(2)iDSPOrb在GPP边提供一个由用于静态调用的编译期首标及存根和一个运行期动态调用接口组成的代理接口。
(3)iDSPOrb为DSP边提供一个用于建立一个iDSP服务器的算法接口(存根和首标)。
(4)iDSPOrb提供调用的同步和异步。
(5)iDSPOrb提供保证实时的QoS。
(6)iDSPOrb提供基帧和基流的处理。
(7)iDSPOrb提供链接数据流对象(中间结果停留在DSP存储器中)。
(8)iDSPOrb在一个高带宽多通道GPP/DSP的I/O接口上实现。
图1显示了一个双处理器配置的iDSPOrb的体系结构,其中GPP担当“客户”,DSP作为“服务器”。
因而,在iDSP系统中的服务质量(QoS)管理器,被认为是iDSP-QoSM,是一个提供协商的服务级到客户应用程序的机制(在一个服务器内)。它提供一个带有预定的降级策略的有保证的服务质量与客户通信。iDSP-QoSM具有下列特性(1)它被定义在网络上一个被限定的节点范围内(内节点的)。它假定存在一个合适的QoS管理器控制内部节点(网络)的通信。(2)它被定义用于具有负荷共享能力的多处理器环境。
由优选实施例的iDSP-QoSM执行功能包括(1)监视系统中在服务器上处理负载的稳定状态。(2)从过载的服务器分配负载到它同级的服务器上。(3)用客户应用程序协商服务需求,登记一些附加的负载到服务器上。(4)基于通过服务程序正在服务的各个对象的特殊特性,预测未来服务器上的负载。(5)基于处理器循环的时间而不是处理的时间,预测算法所运行的时间这种预测算法运行时间的方法不依靠处理器的工作频率。
在Texas Instruments中,TMS320C62XX DSPs有一个限定了数量的内部(芯片内)数据存储器。除TMS320C6211外(和它的变型),TMS320C62XXDSPs不具有外部存储器(远离芯片)进行有效存取的数据高速缓冲存储器。内存位于一个TMS320C62XX DSP的数据存储器分级体系的最高级。因此所有运行在一个TMS320C62XX DSP上的算法需要使用内存用于它们的数据工作空间,因为这是存取数据存储器的最高级的效率。
典型的,被开发的DSPs算法假定它们拥有全部DSP处理器,因此拥有所有的DSP内存。这样就集成了几种不同的算法,它们是相同的(同族的)或不同的(异类的),集成起来非常困难。对于算法开发者需要一套规则用一种公用的方法存取和使用系统的资源,比如像内存。
优选实施例提供了一种提高处理器利用率的方法,当在缺少数据高速缓冲存储器的DSPs上运行多算法时,可以通过对DSP内存使用一种数据内存分页的体系结构。用Texas Instruments XDAIS的标准,依照数据内存分页的体系结构能完成对DSP算法的开发或转换。这个标准要求算法开发者规定至少一个或多个支持用于算法的所有存储器的存储区。在这些用户规定区域中,一个或全部由算法开发者选择用来在一个TMS320C62X DSP的内存中运行。在DSP系统内应用内存的软件部分被分成系统支援和一个数据工作区(页面)。在执行时间,DSP内所有的算法应用共享的工作区和自己全部的工作区。对于在两种算法间的上下文交换,DSP系统软件将分别处理每个算法的工作区和影象存储器之间的传送。优选实施例提供(1)在两个或多个DSP算法之间共享缺少了数据高速缓冲存储器的DSP中的内部数据存储器,提高处理器的利用率。
(2)从相同的共享内存中运行多种算法,当存取数据存储器以支援所需的堆栈和算法内部的变量时,在TMS320C62X DSP环境中允许每种算法享受最大的效率。
(3)这种体系结构运行于一些带有内存的单一处理器和一种必须访问处理器内存的DMA实用程序。
(4)仅在数据输入帧边界执行上下文交换,提供最有效的数据内存分页结构。
支持只读算法数据的异步分页传输。
一个应用程序中的数据流可以从算法到算法,并且为了每种算法的执行,优选实施例提供把数据保留在一个或多个DSPs中而不是转移到一个GPP。
1.在双处理器配置中的DSP ORB图1显示了双处理器配置的一个优选实施例的ORB体系结构,包括一个通用处理器(GPP)和一个数字信号处理器(DSP),其中GPP被当作“客户”,DSP作为“服务器”。注意iDSPOrb包括一个服务质量(QoS)管理器。图1显示了一个客户应用程序调用了两种DSP算法对象“A”和“B”。iDSPOrb首先提供GPP上代理对象“a”和“b”的对象汇集。例如,“A”和“B”能是DSPIDL接口的扩充,用如下的一个译码器(DEC)<pre listing-type="program-listing"><![CDATA[module DEC{interface IDecoder{…int process([in]BUFFER input,[out]BUFFER output);…}interface AIDecoder{}interface BIDecoder{}}]]></pre>使用由DSPIDL编译器提供的算法接口建立一个DSP边的应用程序(称做iDSP服务器)DEC_A_Handle DEC_A_create(IALG_params*p);Int DEC_A_decode(BUF_Handle in,BUF_Handle out)使用也是由DSPIDL编译器提供的代理接口建立一个GPP边的应用程序DEC_A*DEC_A_create(DSPORB_Params*p);int DEC_A_decode(DSPORB_Buffer*in,DSPORB_Buffer*out);或者使用iDSPOrb动态调用接口。在运行时,从GPP边的客户应用程序到处理一个缓冲器“a”能被调用。这种数据经过了DSP边的实际对象“A”。使用对象链接数据流,输出的“A”能被连接到输入的“B”,以便缓冲器的中间数据不用传送回到GPP。“b”调用“B”导致在另一处理阶段中把数据返回到GPP。iDSPOrb的动态调用接口支持调用的同步和异步。
在一个GPP和一个单一的DSP之间,iDSPOrb不必被划分。它也能运行在带有多个DSPs的配置中。在这种情况下,QoS管理器(服务器边)在现有的DSPs中执行DSP算法的负载均衡。其他的配置能由一个ASIC(作为固定函数的DSP)组成,或者由ASIC加RISC组成,其中算法接口被提供到客户应用程序。2a.DSPIDL编译器iDSPOrb支持DSPIDL,一种IDL(接口定义语言)具有如下关键字模块一个接口规格的集合。
例如,H263模块能包含译码器和编码器接口。
interface一个接口规格。
in指示一个输入变元out指示一个输出变元BUFFER指示一个缓冲器类型STREAM指示一个流类型RESULT指示一个函数的返回类型其他的用于存储器的利用,实时一个DSPIDL文件的一般形式是<pre listing-type="program-listing"><![CDATA[module modulename{ interface algorithm_1[alg1,alg2,…]{ algorithm_1(PARAMS)//constructor method_1 method_2 method_3 … } … }]]></pre>其中method是
RESULT function([direction]TYPE,…)和direction是in,out,或[in,out]以及TYPE是BUFFER或STREAM。例如,一个H263 IDL可以产生算法和代理接口,如图2所示。
2b.帧和流的处理帧相对于流的处理有以下区别。
关键字BUFFER缓冲器函数作为变元类型通过帧基处理一个帧。
STREAM流函数作为变元类型处理帧的一个流,典型的通过分散一个任务。
函数调用DSPORB_Buffer_connect(DSPORB_Buffe*out,DSPORB_Buffe*in)和DSPORB_Stream_connect(DSPORB_Stream*out,DSPORB_Stream*in)提供连接对象的输出到输入(帧或流分别的)。对于缓冲器,连接操作符将引起DSPORB在DSP上生成一个存储缓冲器,其中为了另一方法调用(对象链接)的输入,一个方法调用的输出被存储。例如DSPORB_Buffe_connect(yuvframe_out,yuvframe_in);H263_TIDEC_decode(h263frame_in,yuvframe_out);YUV_TI_toRGB(yuvframe_in,rgbframe_out);对于流处理,一个代理调用像这样H263_TIDEC_decodeStream(in_stream,out_stream);将典型的导致在DSP边生成一个任务,处理两个流SIO流(H263_TIDEC_decodeStream的实现将分散一个任务)。没有连接的流在客户代理和服务器之间提供I/O。2c.实时QoS管理器通过DSPORB_System_setTimeConstraint和DSPORB_System_setPriority()接口,在一设置的时间约束内,iDSPOrb能通过对一给定的操作执行分配所需的资源而提供硬实时QoS。GPP/DSP通道的I/O驱动程序允许多线平行操作。
QoS管理器是DSP边iDSPOrb的一部分(1)例示客户需要的算法,(2)更新客户应用程序的约束和管理资源以满足约束(或者返回报告约束不能满足),和(3)更多。
2d.iDSPOrb登记服务iDSPOrb提供一种类别登记服务以便服务器对象能登记它们的服务。例如,一个服务器能用iDSPOrb登记译码MP3音频。通过所提供的期望服务的名称,客户对象例示服务器对象。iDSPOrb登记服务能用于任何类型的DSP对象服务,但它应是通过标准标记设置的用于音频和视频服务的已知的媒体范围音频服务视频服务MP3 Audio Decode MPEG 1 Video DecodeMP3 Audio Decode MPEG 1 Video EecodeMPEG1 L2 Audio Decode MPEG2 Video DecodeMPEG1 L2 Aideo Eecode MPEG2 Video EecodeG.723 Decode MPEG4 Video DecodeG.723 Encode MPEG4 Video EecodeG.729 Decode H.263 DecodeG.729 Encode H.263 Encode在运行时间,iDSPOrb登记服务允许iDSPOrb动态的例示服务对象。当例示一个服务对象时,iDSPOrb动态地给微处理器和DSP之间分配低级I/O通道。客户对象经过iDSPOrb流接口能直接访问这些低级通道(看DSPORB_Stream Interface)。iDSPOrb登记服务也提供信息,让iDSPOrb指定一个DSP提供一种特别的服务,并让QoS管理器作负载均衡和调度计划(看实时QoS管理器)。例如,使用动态调用模块,调用DSPORB_ALG_create(“MP3Audio Decode”,NULL)将例示一个MP3音频译码的例子。iDSPOrb均衡了系统的负载并且客户的DSP实际正在执行译码的细节被遮盖,且分配低级流通过数据。通过询问iDSPOrb,一个客户还能列举当前已登记的服务类别的清单。函数DSPORB_Alg*DSPORB_System_getServices()能用于获得一个当前登记的服务计数器。然后字符*DSPORB_System_next(DSPORB_Alg*enum)能被调用以得到每个已登记服务的名称。通过调用DSPORB_System_reset(DSPORB_Handle*enum)列举能被复位开始。
2e.媒体框架支持通过为特别的媒体框架提供元件,iDSPOrb能用于支援媒体的加速处理,比如DirectShow(窗口媒体)滤波器对象能实现缠绕iDSPOrb客户对象编译码器并插入DirectShow框架。
RealMedia体系结构(RealSystem G2)移交插入能实现缠绕iDSPOrb客户对象编译码器并插入RealSystem G2框架。
使用相同方法DSPOrb也能插入JMF和QuickTime。
iDSPOrb的API被封装进DSPORB模块中。客户(GPP)边DSPORB的数据类型和函数具体如下。
2f.数据类型DSPORB_Alg一个用于DSP算法对象的客户代理。
DSPORB_Fxn一个函数对象用于动态调用。
DSPORB_Arg 一个函数变元用于动态调用。
DSPORB_Buffer and DSPORB_Stream are’subclasses’ofDSPORB_ArgDSPORB_Params为一个算法提供参数匹配在DSP边IALG_Params的算法参数结构。
DSPORB_Buffer一个缓冲器对象。
DSPORB_Stream一个流对象。
2g.DSPORB_Buffer接口-DSPORB_Buffer*DSPORB_Buffer_create(int size,int direction);生成一个能够参考数据长度size、direction的缓冲器对象,它是DSPBUFFER_INPUT或DSPBUFFER_OUTPUT的其中之一。缓冲器方向必须匹配函数调用标记否则将出现iDSPOrb运行时间误差。可代替的,DSPORB_Buffer*DSPORB_Buffer_create(DSP ORB_Alg*,int,int);缓冲器被一个对象利用。
-unsigned char*DSPORB_Buffer_getData();由缓冲器对象得到参考数据。如果这个缓冲器被连接到另一个缓冲器,则NULL返回。
-Void DSPORB_Buffer_setData(unsigned char*data)
设置缓冲器数据指针。如果这个缓冲器被连接到另一个缓冲器,则操作失败,因为用于缓冲器数据的存储空间是在DSP存储空间中。
-void DSPORB_Buffer_setSize(int)设置实际数据的大小。
-int DSPORB_Buffer_getSize()得到实际数据的大小。
-void DSPORB_Buffer_delete(DSPORB_Buffer*buffer)-int DSPORB_Buffer_connect(DSPORB_Buffer*output,DSPORB_Buffer*input)在DSP上连接一个输入缓冲器到一个输出缓冲器。当这些缓冲器对象被连接时,数据保持在DSP上并且不传回到GPP(一个缓冲器由DSP上的iDSPOrb生成以保持中间结果)。
2h.DSPORB_Stream接口流接口具有下列方法。
-DSPORB_Stream*DSPORB_Stream_create(int n,int direction);生成一个流能保持n个缓冲器。direction是DSPSTREAM_INPUT或DSPSTREAM_OUTPUT中的其中之一。
-int DSPORB_Stream_Issue(DSPORB_Buffer*buf);有一个输入缓冲器buf发送一输入流,或者一个放在队列上的空缓冲器被填入一输出流。对于被连接的流,这种操作没有作用,因为流被直接连接在算法之间。
-DSPORB_Buffer*DSPORB_Stream_reclaim();从一输出流得到一个输出缓冲器;或者一个输入缓冲器,能在一输入流上被再发送。对于被连接的流,这种操作没有作用。
-DSPORB_Stream_select(DSPORB_Stream array int n_stream,int*mask,long millis);阻塞直到一个流准备I/O。
-DSPORB_Stream_idle(DSPORB_Stream*str);空闲一个流。
-DSPORB_Stream_close(DSPORB_Stream*str);关闭一个流。
-DSPORB_Stream_connect(DSPORB_Stream*out,DSPORB_Stream*in);连接一输出流到一输入流。两个流在DSP处理器空间平分现在的操作并且不访问GPP。
2i.DSPORB动态调用接口动态调用接口具有下列方法。
-int DSPORB_System_init();必须首先调用起始DSPOrb。-DSPORB_Alg*DSPORB_Alg_create(const char*name,DSPORB_Params*params);通过符号'名称生成参考算法的一个示例。
-void DSPORB_Alg_delete(DSPORB_Handle alg);删除算法示例。
-DSPORB_Fxn*DSPORB_Alg_getFxn(DSPORB_Alg*alg,constchar*fxn_name);返回与符号‘fxn_name’有关的函数对象。
-DSPORB_Fxn_setTimeConstraint(DSPORB_Fxn*fxn);设置执行fxn的时间界限。DSPOrb将分配足够的资源以满足这个约束,否则返回0。
-int DSPORB_Fxn_setPriority(DSPORB_Fxn*fxn);设置优先级从1到15。
-int DSPORB_Fxn_invoke(DSPORB_Fxn*fxn,DSPORB_Arg*args);调用输入和输出的一个函数。直到获得所有未连接的输出的数据这种调用才阻塞。对于用′DSPORB_Buffer_connect′而使输入和输出被连接,′NULL′能通过。
-int DSPORB_Fxn_invokeAsync(DSPORB_Fxn*fxn,DSPORB_Arg*args);-调用输入输出的一个函数。这个调用立即返回;使用′DSPORB_getData′应用程序从输出变元对象检索数据。
-unsigned char*DSPORB_Arg_getData(DSPORB_Arg*utput,longtimeout);从一输出变元对象上得到数据。直到超时出现纳秒时才阻塞;否则如果′超时=-1′则是无限的。
-空白DSPORB_Arg_setCallback(DSPORB_Arg*output,unsigned char*(*getData)(DSPORB_Arg*));在一输出变元上设置调回函数;当数据获得时,得到数据被调用。
-void DSPORB_System_close()关闭DSPOrb。
2j.iDSPOrb的一个例子第一个例子显示通过使用动态调用接口,如何使用iDSPOrb连接到C6×××上的TIH.263译码器。第二个例子显示带有代理存根所写的相同的程序。
<pre listing-type="program-listing"><![CDATA[/**testH263-dii.opp Program to test DSPOrb**Read a raw H.263 file,parse,decode frames using DSPOrb,and*write out YUV file.**UsagetestH263 in_file out_file*/#include#include#include"dsporb.h"#include"h263.h"const int MEMSIZE=4*176*144*3;*/enough for CIF*/static DSPORB_Alg*h263decoder;static DSPORB_Fxn*h263decoderFxn;static DSPORB-Buffer*h263inputArg;static DSPORB_Buffer*h263outputArg;static DSPORB_Arg h263decoderFxnArgs[2];int main(int argc,char**argv)/*frame is encoded H.263;buffer is YUV data*/unsigned char*frame=(unsigned char*)malloc(MEMSIZE);unsigned char*buffer=(unsigned char*)malloc(MEMSIZE);DSPORB_System_init();h263decoder=DSPORB_Alg_create("H263D_TIDEC",NULL);h263decoderFxn=DSPORB_Fxn_getFxn(h263decoder,"decode");h263inputArg=DSPORB_Buffer_Create();h263outputArg=DSPORB_Buffer_create();h263decoderFxnArgs
=(DSPORB_arg*)h263inputArg;h263decoderFxnArgs[1]=(DSPORB_arg*)h263outputArg;*/in is H.263 file;out is YUV file*/FILE*in=fopen(argv[1],"rb");FILE*out=fopen(argv[2],"wb");int_n_bytes_in-frame; H263_initReader(in); while((n_bytes_in_frame=H263_readFrame(frame,MEMSIZE))>0){DSPORB_Buffer_SetSize(h263inputArg,n_bytes_in_frame); DSPORB_Buffer_setData(h263inputArg,frame); DSPORB_Buffer_setSize(h263outputArg,MEMSIZE); DSPORB_Buffer_SetData(h263outputArg,buffer); DSPORB_Fxn_invoke(h263decoderFxn,h263decoderFxnArgs); ints=DSPORB_Buffer_getSize(h263outputArg)); printf("%d->%d\n',n_bytes_in_frame,s); if(s>0) fwrite((const void*)buffer,l,s,out); } fclose(in), fclose(out); DSPORB_System_close() } Now the stubs version /* *testH263-stubs.cpp Program to test DSPOrb * *Read a raw H.263 file,parse,decode frames using DSPOrb,and *write out YUV file. * *UsagetestH263 in_file out_file */ #include #include #include"dsporb.h"#include"h263.h"#include"H263-TIDEC.h"const int MEMSIZE=4*176*144*3;/*enough for CIF*/static H263 TIDEC*h263decoder;static DSPORB_Buffer*h263inputArg;static DSPORB-Buffer*h263outputArg;int main(int argc,char**argv)*/frame is encoded H.263;buffer is YUV data*/unsigned char*frame=(unsigned char*)malloc(MEMSIZE);unsigned char*buffer=(unsigned char*)malloc(MEMSIZE);DSPORB_init()h263decoder=H263_TIDEC_create(NULL);/*in is H.263 file;out is YUV file*/FILE*in=fopen(argv[1],"rb");FILE*out=fopen(argv[2],"wb");int n_bytes_in_frame;H263_initReader(in);while((n_bytes_in_frame=H263_readFrame(frame,DSPORB_Buffer_setSize(h263inputArg,n_bytes_in_frame);DSPORB_Buffer_setData(h263inputArg,frarme);DSPORB_Buffer_setSize(h263outputArg,MEMSIZE);DSPORB_Buffer_setData(h263outputArg,buffer);H263_TIDEC_decode(h263inputArg,h263outputArg);int s=DSPORB_Buffer_getSize(h263outputArg));printf("%d->%d\n",n_bytes_in-frame,s);if(s>0)fwrite((const void*)buffer,l,s,out);}fclose(in)fclose(out) DSPORB_close() }]]></pre>2.服务质量(QoS)在优选实施例的配置中,iDSPOrb的服务质量管理器(iDSP-QoS)被定义由作为同级服务器的一个主处理器和一个数字信号处理器(DSPs)相组合而组成。一个伞形QoS-管理器为了维护一指定的服务质量而执行所有需要的功能,管理DSP服务器的组合。主处理器通常是一个通用处理器(GPP),它通过硬件接口连接到DSPs,比如像共享存储器和总线类型的接口。QoS管理器可以是iDSPOrb的一部分,或者一般来说,是DSPs上的一个分离的管理器。系统被硬件和软件中断所驱动。优选的实现方法是,基于负载共享,让主要的用户(客户)应用程序在GPP上运行和特殊服务在DSPs上运行。QoS管理器同时运行,所有的处理器可以是一种框架,比如像iDSP媒体框架一样。iDSP-QoS管理器执行三个主要功能(1)对象的分类,(2)对象的调度,和(3)预测对象的执行时间。
这些功能将在下面描述,在一个GPP/多DSP的环境中,使用一个媒体的具体例子。
3a.对象的分类在一媒体的具体环境中,对象翻译到媒体的编译码器/滤波器(算法)。基于它们的流的类型,应用程序的类型或算法类型,媒体对象能被分类。依靠算法的类型,QoS管理器定义所说的编译码器-周期,滤波器-周期等等的规格。
3b.对象的调度(硬截止时间)iDSP-QoSM基于两个阶段的调度程序调度算法对象。第一阶段是一种高级调度程序,确定是否一新的媒体流在DSP上是可调度的并为编译码器-周期设置硬实时截止时间。第二阶段调度个别的媒体帧和利用第一阶段的硬实时截止时间。第一阶段运行于对象的协商时间上并且典型的是运行在主机上(GPP)。第二阶段应运行在DSPs(服务器)上并且基于每帧运行。
第一调度阶段是这样一个时期,即QoS管理器平均确定是否对象能被已经同时运行的对象所支持。作为第一阶段部分的还需要有,依照存储器为对象考虑足够的支援。用于内部使用,输入和输出的对象存储缓冲器在它的示例移去了分配的不确定动态存储的时候,必须是固定静态的。iDSP平台只运行符合XDAIS的算法。开发者需要为算法在不同条件下定义处理时间。用于与服务器传输数据所需的近似时间在初始化的时候被确定,当QoS管理器为每个对象设置截止时间时,它分解初始化。
每个DSP对象需要提供下列信息到QoS管理器n 编译码器-周期和帧的数(缺省帧/秒)Tacc总共目标服务器(DSP)循环的计算一个编译码器-周期的平均数间。
Tacd显示总共目标服务器(DSP)循环的一个编译码器-周期的时间。
对于视频编译码器,n通常是连续的I-帧中的帧数(例如15帧)。Tacc通常是一个I-帧所需的最大时间加上P和B帧所需的平均时间的总和。QoS管理器保持跟踪所有媒体对象的Tccd。这个时间(依照DSP循环)基于当前的帧率。例如,对于一个30fps的视频流和n=15,让Tccd=125M周。
QoS管理器现在可按下述方法确定一新的流是否是可被调度的。让S等于所有被调度的当前流的编译码器-周期(Tacc)总和。如果新流的(S+Tacc)少于新流的Tccd,这个流是可调度的,否则不能。例如,假设有一个对象A,n=15,Taxc=39.5M周(158ms),和Tccd=125M周(500ms),并且在DSP上没有任务调度(因此S=0)。被通知为对象A新的流调度所需的资源。因为S+39.5=39.5M周<125M周(500ms),我们能调度这个流。当对象A需要的第二个流到来时,它也被调度,因为S+39.5=79M周(316ms)<125M周(500ms)。第三个流也能被调度。然而,第四个流不能被调度,因为需要158M周(632ms),以致我们不能满足500ms的硬截止时间。这时QoS管理器协商减少流的帧率,如果失败,将拒绝所有的流。
一种修改的方法允许调度程序处理带有不同编译码器-周期时间的不同种类的媒体对象。较长Tccd的对象被按比例分配到最少的Tccd。例如,假设有一对象B,n=30,Taxc=40M周(160ms),和Tccd=169M周(675ms),并且有两个对象A(如上所定义的)在DSP上被调度(因而S=79M周/316ms)。我们能调度对象B的新流因为S+40*(125/158)=110.45M周(S+160*500/675=435ms)。这可证明是正确的,因为(79+40<125)M周/(316+160<500)ms,因此我们能实际保证所有的流在较短的500ms的编译码-周期之内。当对象B需要的第二个流需要调度时会怎样?110.45+40*125/158=139<125M周/435+160*(500/675)=554ms>500ms。因此,调度程序拒绝这个流并且开始上面提到的协商。
iDSP-QoS将与应用程序或它的代理协商,基于编译码器-周期为媒体对象保留足够的处理带宽。这种协商将与其他同时运行的DSP应用程序考虑一个对象所需的存储器,所请求的QoS级别和获得的DSP的MIPS。当对象的选择变化,QoS管理器将执行DSP处理器带宽的重新协商。把参数输入到QoS管理器的协商程序,应用程序为一个对象需要定义下列内容(1)DSP需要的存储器(输入/输出缓冲器的数量和大小)(2)期望的QoS级别(一般表示在帧每秒中)(3)启动对象的最坏情况的运行时间(4)具有用于媒体帧序列的硬实时截止时间,调用编译码器-周期(帧数和平均执行时间)。
在iDSP-QoS管理器中对象的第二调度阶段是基于两个方面,谁的截止时间先到来则谁有较高的优先权。考虑下面的例子,如果对象A有截止时间时10ms和对象D有截止时间时3ms,iDSP-QoS管理器将调度对象D首先运行,尽管对象A有较高的优先权。因为我们知道,当对象的运行时间接近时,我们能决定“不迟”的时间,对象必须被启动以便它始终符合它的截止时间。在图3中,预计对象D将在对象A的“不迟”开始点之前完成。在这种方案中,在较高优先权的对象A和对象D之间没有截止时间冲突。因此,对象A在较低优先权的对象D后面运行。
在另一个调度的例子中,权衡在第一截止时间上的优先权,是否较高优先权的对象A的“不迟”时间是在预计的对象D预计完成的时间之前。在这种情况下,对象A将首先运行,因为它有较高的优先权,且对象D应在其后运行,另外,只有在对象示例时间对象D符合它规定的丢帧参数的时候;参看图4。
为使iDSP-QoS对截止时间做最可能有效地管理,GPP必须尽快让数据输入帧到达DSP子系统以允许在对象的到达时间和截止时间之间有最大量的时间。在到达和截止时间之间用于数据帧的时间越多的话,iDSP-QoS就可以更灵活地用其他同时运行的对象来调度各个对象。
3c.预测对象的运行时间(软-截止时间)
iDSP-QoS的中心功能是为所有被调度对象的下一输入帧预测所需的处理时间。这种预测是重要的且只针对一个对象。QoS管理器通过统计早先的运行时间来计算下一输入帧的预期运行时间。对象的预期运行时间是早期运行时间的一个函数(唯一对应一个对象),最可能有正变化(每个对象被唯一地确定)。例如,在视频对象的情况下,I,P和B帧的周期性是可确定的。因此,基于当前帧的类型和它在视频帧的周期性中的位置,将来的处理时间能被预测。基于预测的处理时间和近似的硬截止时间,这种在所有共同存在的算法上执行的预测直接帮助了动态的优先权再分配。
这些预测是管理软-截止时间和处理时间抖动的关键。iDSP-QoS基于预测,将立即重新安排处理对象。这种重新的调度出现在个别对象的编译码器-周期截止时间(定义的平均硬截止时间)的期间内。在上面的例子中,当我们均分工作量时,我们假设对象B中的所有帧需要相同的时间,与对象A的500ms相一致。这可以不是真实的,因为在整个实际重叠过程中对象B的帧可以要求更多的时间或者可以不给对象B平均的时间量。因此,最接近于编译码器-周期截止时间的帧得到较高的优先权。
如果预测的运行时间为放了用户定义的所需时间,QoS管理器将采取几种可能的行动中的一种。在一个单一DSP配置中(级别1)一种简单的二进制截止这导致自动丢帧。所述对象应还能够表示如果丢帧将引起不幸的后果。
(级别2)一种通用的减少较低优先权对象分配的运行时间,在被分配时间的末端抢先占有对象。这可以或不可以导致丢帧。
(级别3)对象需要具有接受QoS命令的能力,比如按比例还原输出数据的质量。在一个多DSP配置中(1)在每个QoS时间片的末端,装入数据的信息从每个DSP被发送到GPP。
(2)仅在估计的截止时间错过时,GPP求助于对象的再分配。从正在服务的DSPs上接收“装入数据”之后,由GPP执行任务的再分配。然而,为减少任务的转接时间,所有DSPs工作于一个外部存储空间的公共簇是很值得的。
所有在iDSP中执行的对象必须是可确定执行时间的。DSP对象能被分成三类,压缩数据(编码),解压缩数据(译码)和数据转换(前期或后期对象数据的处理)。对象把数据按块处理;这些块被调用输入数据帧。对象处理以输入数据帧和产生一输出数据帧。如同任何计算的数据,输入和输出数据帧被按照大小和处理量进行约束。基于任意所给输入帧的大小,能精确地确定DSP处理的最大量,在这方面,任何其他的计算机,必须在输入帧上执行。
每个对象,在它被集成iDSP系统以前,需要表明对象的一帧在最坏情况的运行时间。这个最坏情况的运行时间被用于计算第一输入帧的运行时间以便能启动对象。由于编码器和译码器对象很少在最坏情况下运行,第一输入帧将是高代价的(因为它必须预测最坏情况)。这种最坏情况的安排可能引起第一帧的运行时间要长于实际的运行时间。
入早先所述,在输入帧中一个算法对象的处理时间将变化。在最初,iDSP-QoS开始对第一数据输入帧用最坏情况值。在第一帧之后,基于算法的特征和测量的第一帧处理时间,QoS管理器将预测下一输入帧的处理时间。对于每个序列帧,基于算法对象的语义和历史记录,它预测近似的处理时间。例如,编码器对象使用了对象语义(例如,I,P,和B帧的类型)连同早期相同输入帧的平均编码时间,这可以用于预测将来编码所需的时间。编码器对象每次产生相同大小输入帧时,它们被安排执行。处理时间的变化来自许多因素,象帧的活动水平,在帧之间移动的程度等等。然而,这些变化是有限制。因此,在两个帧之间处理时间的最大差别是有限的,该最大差别能被加到预测的处理时间上,以便为下一帧确定最坏情况的处理时间。参看图5-6。
译码对象一般给出可变大小的输入帧。输入数据帧的处理时间与它的大小直接成比例。为确定下一帧的处理时间是否会增加,QoS管理器将核查当前的和下一数据输入帧大小的区别。如同编码器所论述的,对译码器也成立,即在两个语义相同的帧之间,处理上的区别是有限的。对象的最大或最坏情况的处理时间对应了用于对象而被定义的最大可能的缓冲器。参看图7。
转换对象的运行与编码器对象的相同,它们总是产生相同大小的输入帧。每帧总是用掉相同数量的处理时间并且是单一通过输入帧。因此,每输入帧的处理时间总是保持不变。
每个对象将从用户应用程序接收一相对时间,其中通过的帧必须被对象完成。一个例子是这样的,应用程序规定这个帧必须在下一个7mS被处理。由于在主机GPP和DSP之间没有公共软件时钟,截止时间仅能由相对时期所限定。我们假设在主机和DSP之间的数据帧的传输时间是可确定的。iDSP系统保持一个内部时钟,它相对于数据帧到达后接收的一个时标,因而可以计算预期的处理时间。在计算了预期的处理时间之后,QoS管理器开始调度数据帧执行。
在一个对象能被调度之前,QoS管理器把这个对象与其他共同存在的对象相比较,确定这个对象执行的适当的指令。如果没有其它的对象处理输入帧,这个对象的帧被立即安排执行。如果有其它的对象运行,QoS管理器通过考虑每个请求对象的优先权,预期的截止时间和硬或软需要的实际时间,确定执行的指令。参看图8。
当多对象时,有不同的运行时间优先级,一起连接于相同的DSP,QoS管理器将根据对象的具体的运行时间计算每个对象预计的运行时间。然后基于处于调度的对象(TBD)安排不同的任务。下列三种可能的调度情况(1)所有对象运行,完成给出的输入数据帧并且在应用程序规定的截止时间内完成。这种情况在图9中表示,注意图中所有对象是在每个对象的截止时间之前完成的。如果所有对象在它们各自的截止时间之前完成,QoS管理器的工作量是最小的。
(2)一个或多个对象(例如对象B)的处理负载增加,但没有引起后面对象的预计截止时间错过。一个或多个对象的负载增加时可能的,比如像对象B。取决于对象,如果相同对象的帧数据序列在它们的截止时间限制内被处理,错过一个截止时间是可以接受的。一个例子,在一个H263编码器中,一个“I”帧用了很长时间计算。跟在“I”帧后面的总是一个“p”帧并且典型的具有较少的处理需求。这就允许“I”帧挪用后面“P”帧的处理周期。这样,如果有足够的处理空间用于下一帧,一个帧的截止时间错过不会出现很大的麻烦。
由于对象B的截止时间已经被超过,必须确定整个系统的效果。如果由对象B引起的截止时间的错过没有引起后面对象的预计截止时间出错,则整个系统的危险是最小的。参看图10-11。
(3)一个或多个对象(例如对象B)的处理负载增加,而且引起了后面对象的预计截止时间出错。看图12。在这种情况下,对象B的截止时间的错过引起了引起后面对象的预计截止时间出错。尽管出现这种情况,整个系统的危险可能或不可能是最小的。每个共同运行的对象可以挪用序列帧的周期并因此避免了截止时间错误的多米诺(骨牌)效应。
iDSP-QoS提出了一组用于软截止时间管理的规则。这组规则的设计限制了由一个单一的决定性的错误截止时间所引起的截止时间错误的雪球效应。(1)每个算法对象提供给QoS管理器允许的丢帧/秒的最大数。(2)在每次处理周期之后,每个对象更新运行中‘截止时间错过’的计数作为移动平均值。(3)当一个对象超出了出错截止时间的限制,把这个对象的优先级改成最高值。一旦计数下降到低于限制时,恢复原来的优先级。(4)所有的序列帧在限制之后没有达到它们的截止时间,则被丢弃。这导致QoS暂时下降到紧接着的下一级。QoS的这种瞬时下降(很少有)随后被报告给客户。(5)只有当已经通过了截止时间DSP还没有启动对象时,照例,帧被丢弃。
3d.节流控制周期的媒体翻译对于一个给出的算法对象,iDSP-QoS假设在任意瞬间仅有一个准备排队的请求,通常,有规定服务质量的周期性的截止时间来约束QoS管理器。媒体系统中的音频和视频翻译元件能缓冲帧以处理到达时间的变化,允许帧稍微提前于调度到达。但是这些缓冲器是有限的,因而在帧被处理时媒体系统的上行流比特元件必须谨慎地压制相对速度。
通过iDSP-QoSM提供两种机制,用于压制算法对象的处理速度。
(1)DSP算法对象的客户控制它调用算法对象处理功能(服务器)的速度。这能导致QoS管理器的调度算法的次优的性能,如果请求是在时间周期内产生的,它们必须被完成。例如,上面考虑的算法对象A,其中缓冲器A1必须在时间周期T1内被处理和缓冲器A2必须在时间周期T2内被处理。图。
其中T1和T2是两个连续的周期,[x]表示到达的缓冲器x,{x}表示完成处理的缓冲器x。看图13a。
(2)QoS管理器控制媒体流的节流。这种机制允许客户一有可能就用一个输入缓冲器调用一个算法对象的处理功能。QoS管理器随后将对输入缓冲器附加‘开始-截止时间’。直到它的当前缓冲器的处理被完成时客户才阻塞。看图13b.这样,在两种情况下,在任意瞬间,QoS管理器中准备排队的每个算法对象最多有一个请求。
3.存储器分页为了在一个DSP上更好地运行多算法,或者有关这方面的任意的处理器,必须建立一套规则以便系统资源在算法中公平的共享。这些规则规定了对处理器外围设备的访问,比如DMA,内存,和算法的调度方法。一旦接受了一套规则,一个系统接口能被开发用于插入算法,以便它们能访问系统资源。一个公共接口提供给算法开发者明确的范围,其中不久要开发算法,因为他们能单独地集中于算法开发而没有系统支持的问题。例如一个接口是Texas InstrumentsiDSP Medis PLatform DSP框架。在一个算法和一个TMS320C62XXDSP之间出现的所有访问经过这个框架。
Texas Instruments XDAIS标准需要建立规则,允许插入多于一个算法到iDSP媒体平台中,通过一个或多个算法让系统的积分器快速汇编产品质量系统。XDAIS标准要求算法要符合称为Alg接口的需要的公共接口。有几个被XDAIS标准强加的规则,最重要是算法不能直接定义存储器或直接访问硬件外部设备。通过用于所有算法的单一公共接口提供系统服务。因此系统积分器仅提供一个支持所有算法的Alg接口的DSP框架,。Alg接口也提供算法开发者一个访问系统服务的装置并调用它们的算法。
一个算法必须精确地定义它所需的内存。这需要一种内存分页结构来支持多算法在内存中对相同空间的访问。XDAIS依据算法需要规定它们所需的的内部和外部存储器。
内(芯片内)存必须被分成两个区域。第一是系统的内务操作区,支持一个特殊DSP系统配置的OS数据。第二区是为算法使用的,但必须是在它们已经被调度而执行的时候。两个存储区的大小必须是固定的。第二存储区被称为算法芯片内工作区;换句话说这个工作区也能描述为一种数据覆盖或数据存储页面。参看图14。
为了确定可得到多大的算法芯片内工作区,系统开发者用得到的内部数据存储器空间的总量减去支援系统软件所需的量,比如OS支持和用于分页结构的数据支持。OS的配置,比如任务量,信号量等等,应该由系统DSP设计者设置成最大以支持全部的算法量,设计者希望同时运行这些算法。保持最少量的OS支援内务操作和增加算法工作区。
为使一个算法运行于这样的环境,它需要的内存必须少于工作区的大小。否则系统积分器不能积分算法;有一种限制,即每算法仅有一个分页。这种体系结构不支持算法的多分页。
算法工作区被分成三部分,堆栈(必须遵循的),持久存储器和不持久存储器。有时有一第四部分,这将在以后讨论,它处理持久存储器的只读部分。参看图15。
一个算法当它正在执行时仅使用芯片内的工作区。当一个算法被调度执行时,DSP系统软件将把算法的工作区从它的内部存储单元(阴影存储)传送到芯片内的内部工作区。当算法服从控制,DSP系统软件将确定下面该运行哪个算法,如果它是相同的算法则不需要传送工作区。如果下一个算法是一个不同的算法则当前的工作区被存储在内部存储器的它的阴影单元中,并且下一个算法的工作区被传送。参看图16。
用于算法的整个工作区在前后转换时不传送。仅仅传送堆栈的使用部分和持久数据存储器。当一个算法在它的调用堆栈中是在它的最高级时,算法的堆栈是在它的最高级(最少使用)。换句话说,算法是在它的入口点。
理想的前后算法的转换出现于它的堆栈位于最高级,因为那意味着芯片外有少量的数据传送到阴影存储。参看图17。
优选实施例的数据分页体系结构要求前后转换应是最有效率的。处理前后转换花费的额外时间,对DSP能用于执行算法。因为前后转换的最好时间是在它的调用分界线上,应该绝对最小化算法的先占。当算法的堆栈大于它的最小值时,算法的先占将降低整个系统。这应该是一种要求,但在很有限的基础上可以接受先占。参看图18-19。
一种算法工作区的特殊情况是,如果算法需要只读持久存储器。这种类型的存储器被算法用于查表。由于这种存储器从未被修改过则只需要读入且不能被写。这种非对称的分页传送减少了算法前后转换的额外开销。
用这种数据分页结构,一个单一算法能被不止一次示例。由于算法已经定义了它需要的内存,DSP系统积分器能多于一个相同算法的示例。DSP系统软件保持跟踪多个实例并且同时调度算法的每个实例。为保留算法实例的阴影版本,示例的数量限制对应于在DSP系统中有多少内存。
DSP系统软件必须管理每个实例以便它能对调度的算法正确的匹配算法数据。由于多数DSP算法由于任务被示例,DSP系统软件能使用任务环境指针作为一个装置来管理算法实例。
4.数据流链接优选实施例的数据流依靠集成处理单元,供给他们一个共享的存储空间,并且在处理单元中直接路由选择数据,不受GPP的干涉。这样一个系统显示在图21中。
当处理单元PEa完成了大量的数据处理,它把结果数据写到共享存储器中的一个预定的输出缓冲器。PEa随后通知下一个经过适当的控制路径在连接中的处理单元PEb。PEb然后从输入缓冲器读数据用于另外的处理。在这样的方式中,数据经过所有需要的处理单元直到所有数据已经被用完。
如上面所说的,一组缓冲器用于在两个处理单元之间的通信并且在这些单元之间构成了一个I/O通道。多个I/O通道可以存在于任意两个处理单元之间,允许系统同时(例如平行的)处理多个数据流。图22显示了平行处理多数据流s1,s2的例子。
由I/O通道连接的一系列处理单元组成了一个通道链。几个通道链能被定义在一个特殊的系统中。在这种情况下,一个处理单元的中间链的每个输入通道具有一个相关的输出通道。处理单元的两端仅有一个输入或输出通道。
一个处理单元的输入通道规定从哪个缓冲器读数据。一个处理单元的输出通道规定把数据写到哪个缓冲器以及通知后面的处理单元。在数据处理单元和中心控制处理器(CCP)之间的控制信息的类型是。
(1)状态信息数据流的处理开始,停止,异常终止,暂停,恢复,等等...
(2)服务质量信息时间标记,系统负荷,资源的空闲/忙等等...
(3)数据流控制信息开始,暂停,恢复,反绕等等...
(4)系统负荷信息任务运行,工作信道数,每个处理单元的信道等...
在一个优选实施例中,经过一个配置文件处理单元I/O通道的创建和结合被静态的定义,该配置文件能在系统初始化的时候被读入。对于每种被处理的比特流的类型,配置文件定义一个与适当的处理单元相连接的通道链(也就是数据路径)。在一个通道中所有处理单元的集中处理导致数据消耗的完成。
在多数据路径存在一个给定的比特流的情况下,能定义替换或备份通道链。比特流能被路由到没有利用的任意处理单元的一个最初的通道链。确定运行时比特流的类型和通过被路由的数据动态OoS分析选择通道链。在运行时间所有系统中合法的通道是固定的和不可改变的。
在另一个优选实施例中,当一新比特流到达通信的处理器时,不同比特流的通道链能被动态地构造。派生的比特流信息在运行时能经过控制信息被发送到CCP,CCP将确定所需的处理单元和在它们之间动态地分配I/O通道。这种方法将允许资源由服务提取或者在运行时间的联机允许系统自适应。
在共享存储器的非均匀系统中,处理单元中的数据流经过内部共享存储器而不受CCP的干涉。数据不会在总线上出现,因而数据处理的速度由共享存储器的访问时间所决定而不是总线的传输时间。由于CCP的干涉成为最小化,整个数据流时间的CCP响应和处理延时被排除。通过在处理单元中最小化数据传输的时间,可以提高系统的吞吐量。
5a.一个例子在这里技术讨论的一个典型的数据流的应用程序将用于媒体处理系统。这样一个系统将启动和控制用于处理像译码,编码,翻译,转换,定标等这样的宽带媒体的流。通过像电缆调制解调器,DSL,或无线这样的通信媒体,它能够处理来自本地盘和一个远程计算机/服务器的媒体流。图23显示了这样一个系统的例子。
图23中的媒体处理系统包含5个处理单元(1)DSL或电缆调制解调器I/O前端的DSP(2)媒体处理DSP(3)视频/图形覆盖处理器(4)H.263译码器任务(5)彩色空间转换器任务H.263数据流进入前端的I/O DSP,I/O DSP跟随着一个由标号1-3定义的通道链。每个通道连接2处理单元并组成一组用于在单元之间通过数据的缓冲器。控制流经过阴影线显示。
H.263数据流从前端DSP的I/O进到通道1在总的共享存储器中被定义的缓冲器I/O。前端DSP的I/O通知目标处理单元与通道1有关,也就是在媒体处理DSP上的H.263译码器任务,它的输入缓冲器是满的并准备被读。H.263译码器任务从通道1缓冲器I/O读出数据,译码数据并把结果YUV数据写到局部共享存储器中的通道2缓冲器的I/O。
应注意通道可以在处理器之间或在处理器内。经过总的共享存储器(在处理器之间)或经过指定处理器(在处理器内)的“局部”共享存储器,数据能在处理器之间通过。在图4中,通道1和3是在处理器之间的,通道2是在处理器内部的。
5.修改在保留所述特征的同时优选实施例能用各种方法进行修改。
权利要求
1.一种客户-服务器调度的方法,包括(a)一个在一个客户上调度的第一阶段,为耦合到所述客户的服务器的任务设置实时截止时间;和(b)一个在所述任务的子任务的服务器上调度的第二阶段,所述调度的第二阶段使用步骤(a)的实时截止时间。
2.权利要求1的调度方法,其中(a)所述任务包括一个媒体流译码;和(b)所述子任务包括一个用于所述媒体流的帧的帧译码。
3.用于一个客户-服务器系统的一种对象请求代理的方法,包括(a)破坏一个第一客户请求返回和一个第二客户请求调用;和(b)链接一个第一服务器对象的一个输出到一个第二服务器对象的一个输入,其中所述第一服务器和所述第二服务器分别对应第一和第二客户请求。
4.权利要求3的方法,其中(a)所述链接是通过在所述服务器中创建一个用于中间结果(所述第一对象的输出和所述第二对象的输入)的缓冲器来实现。
5.一种在一个客户-服务器系统中服务器处理器存储器管理的方法,包括;(a)为处理器的开销分配一个处理器存储器的一个第一部分;和(b)为任务工作区分配所述处理器存储器的一个第二部分,其中所述的第二部分每次能被仅仅一个单一的任务占用。
6.权利要求5的方法,其中(a)所述存储器的第二部分包括一个堆栈元件,一个持久存储元件,和一个非持久存储元件。
7.在一个非均匀系统中数据流动的方法,该系统带有一个总线连接到一个控制处理器和连接到多个处理单元的每个处理单元,包括(a)通过使用从所述总线中分离出的一个公共存储器,在所述的处理单元中进行传输数据。
全文摘要
一个客户-服务器系统具有把服务器任务调度分成两个阶段,把客户截止时间的阶段信息用于服务器子任务调度的一个第二阶段。还有,用于系统的一个对象代理,使用破坏客户的请求调用和返回,以维护协处理器中的数据,以及通过使用多个协处理器的一个共享存储器,管理用于多任务的服务器存储器和数据流动,以避免主处理器拥挤。
文档编号G06F9/46GK1405679SQ0111961
公开日2003年3月26日 申请日期2001年4月26日 优先权日2001年4月26日
发明者R·T·基利安, A·纳拉扬, R·米诺瓦诺维奇, J·M·奥弗特夫, S·T·巴顿, P·R·思里弗特 申请人:德克萨斯仪器股份有限公司