本发明一般涉及数字计算机系统,更具体地涉及用于以串行通信线路与宿主计算机系统进行接口的子系统。 对于现代计算机系统,与外部世界的通信是至关重要的。某些系统具有若干同时操作的串行通信链路。控制多条同时操作的链路能增加系统处理器的需求而降低总的系统性能。
对这一性能问题的一种解决方法是采用“聪明”的通信适配器。这些适配器处理一次通信对话的所有低级细节。适配器在与它们的宿主系统通信时以相对大的块传送数据。无论接收的数据还是要发送的数据都是采用块传送方式在适配器与宿主系统之间传送的。直接存储器存取(DMA)可用于这种传送以进一步减轻加在宿主中央处理器上的处理负担。
为了在仅有有限数量适配器的一个系统中提供多个通信端口,若干个端口可以设置在单个适配器上。然而,这一方法可能导致明显的问题。对若干独立端口的数据与命令处理可能变得相当复杂,尤其是在高通信率时。当不同的速度与协议使用在不同地通信端口上时,这一问题便大为恶化。使得适配器难于保证所有的通信端口都能以适时方式处理。
提供一种能够处理多个独立端口而不丢失数据的适合于用作通信端口适配器的系统将是令人满意的。
因而,本发明的目的之一便是提供一种适合于在一台宿主计算机系统中用作一个通信端口适配器的系统。
本发明的另一个目的是提供这样一种系统,其中在单个适配器上支持多个通信端口,以及其中各端口互相独立地操作。
本发明的又一目的是提供这样一种系统,其中的通信端口是以这样一种方式被处理的,使得在任何端口上都保证不丢失数据。
所以,根据本发明,一种串行通信适配器提供对物理通信端口的一个接口。在适配器上执行的一个调度程序调度不同优先级的任务,使得时间性要求高的任务得到足够快速的执行以防止数据丢失。通过一个通信端口将要发送的或已经接收到的数据是存储在适配器上的缓冲器中的,而适配器与宿主系统之间的数据与命令通信则是较佳地通过一条DMA通道完成的。
本发明据信为新颖特征的性质在所附的权利要求书中列举。然而,发明本身,以及作为一种较佳的使用方式及其其它的目的和优点则可以结合附图参照对一个示例性实施例的以下详细说明得到最好的了解,附图中:
图1是一台宿主计算机系统的块图;
图2是用于图1中的系统的一个较佳串行通信适配器的块图;
图3示出了按照本发明的一个较佳调度程序工作表;
图4是一组展示在一个较佳适配器系统上执行任务与中断的流程图;
图5示出了包含在一个较佳适配器上的一个存储器的内容;以及
图6至图12为展示按照本发明所能调度的被选中的功能的操作的流程图。
参见图1,参考号10指示一台一般称为宿主系统的计算机系统。系统10包含连接在一条系统总线16上的一个中央处理器12及一个主存储器14。一个或多个用户接口输入/输出设备18也连接在总线16上。这些用户接口设备18中典型地包括一台显示器与键盘,且通常包含一个指示设备诸如一个鼠标。
一个大容量存储器输入/输出设备20也最好连接在总线16上,並将一个或多个大容量存储器设备与系统10接口。这些设备典型地包括磁盘或光盘驱动器。某些系统並不包含这些大容量存储器设备20,而依靠连接在一个网络上的远程大容量存储器。用于串行输入/输出设备的一个适配器22最好连接在系统总线16上。在一个较佳实施例中,这一适配器22提供系统10与多个串行通信端口之间的通信。如本技术领域内所知,各种其它设备也可包括在系统10中。
图1中的系统示出了所有的输入/输出设备为连接在主系统总线16上的。许多高性能系统在中央处理器12与主存储器14之间提供一条高速总线。在这种系统中,一个输入/输出控制器(未示出)连接在高速总线上,並且再通过一独立的输入/输出总线(未示出)连接到各种输入/输出设备18、20、22。在这些系统中,主存储器14与各种输入/输出设备之间的数据传送是经由並受控于该输入/输出控制器的。下述多端口串行适配器在两种系统中都能工作得一样好。只需要向适配器与总线之间提供一个容许在许多不同类型的计算机系统中使用的适当的接口便可。
参见图2,其中示出了一个较佳串行输入/输出适配器22。适配器22是通过一个系统总线接口24与系统总线16相连的。接口24连接到一条适配器总线26上,这是一条高速总线。同时连接到适配器总线26上的有一台中央处理器26与一个适配器存储器30。中央处理器28可以是市场供应的微处理器,诸如英特尔(INTEL)80186处理器。适配器存储器30是本领域内已知的计算机系统存储器,並使其容量足以支持下述功能。在正常的应用中,512K字节的适配器存储器30足供四个通信端口使用。中央处理器28用存储在存储器30中的程序执行适配器22的功能。
同时连接在适配器总线26上的有四个串行端口接口32、34、36和38。虽然在图2中只示出了四个端口,需要时在一个适配器上可包括更多的端口。一个适配器卡22上所能包含的端口数只受服务于端口所能利用的处理能力以及适配器卡22上所能设置的物理端口引线数的限制。
在适配器总线26上连有一个串行端口DMA控制器40,用于控制端口32、34、36、38与适配器存储器30之间的DMA传送。每一端口有两条直接与DMA控制器40相连的信号线用于指示什么时候在一个接受缓冲器中已经有了数据以及什么时候一个发送缓冲器已可用于接收数据。DMA控制器40使用这些信号来确定什么时候在一个通信端口与适配器存储器30之间启动一次DMA传送。
为了实行DMA传送,DMA控制器40与系统总线接口24两者都能作为适配器总线26的总线主。系统总线接口24与DMA控制器40采用DMA向适配器存储器30传送数据和接收来自适配器存储器30的数据。此外,接口24也能成为系统总线16的一个总线主,並使用一条DMA通道向主存储器14传送数据和接受来自主存储器14的数据。在这里所描述的实施例中,系统总线接口24使用单一的DMA通道来为所有的通信端口32、34、36和38传送数据。
为了控制适配器22的操作,中央处理器28执行若干下面将要说明的不同例行程序。具有显著重要作用的是一个任务调度程序,它确定下一个要执行的是哪一个任务。中央处理器28执行各种例行程序来建立通过系统总线接口24去往和来自系统总线16的DMA传送,建立适配器存储器30与通信端口之间的发送与接收操作,以及处理各种错误状态。
图3示出了能很好地用于在适配器上调度任务的一个调度程序工作表50。不同的任务在不同的优先级上操作,图3中示出了优先级0-6。实际使用的优先级数可根据满足特定实现的需要而变化。优先级0为最高优先级,而优先级6为最低优先级。
每一个优先级有一个表项用来指示等待执行的那些任务。优先级1-6各由一个位示图组成,位示图中每一项对应于在适配器上的每一个通信端口。如果任一特定位为1,对应的端口调度对应任务。
调度程序工作表50中的位是由各中断处理程序或执行中的任务设置的,如下面将详细说明的。当出现一个硬件中断时,适当的处理程序确定需要调用哪一个例行程序来处理它,並以在调度程序工作表50中设置一位来调度这一例行程序。当一个例行程序执行时,它能以在表50中设置位来调度其它例行程序,而一般将以复位其本身的位来解除调度它自己。
最高优先级,级0,用作指示该优先级的当前受调度的任务的数目的一个计数器。这一操作上的差别将在下面详细说明。在某些实现中,可能要求以这一方式使用其它的优先级或者根本不用这种方式。
最高优先级是执行系统总线DMA传送的任务。每当一个任务要求执行系统总线DMA时,便将级0计数器增加1並在存储器30中的一张表中放置必要的标识信息。由于只有单一的系统总线DMA通道可资利用,在任何给定的时刻只能有一个系统DMA任务能够操作。任何剩下的任务在它们能够被执行以前只能等待当前执行中的系统DMA任务完成后才能执行,当一个系统总线DMA任务在执行时,其它任务可以在适配器上执行,下面将对此进行说明。
当从一个通信端口上接收到一帧时便调用级1的任务,並必须采用各种步骤来检验所接收的帧的有效性。接收数据任务使被接收的帧受到检验,並标明一切错误。接收数据任务也调度一次系统总线DMA传送将接收到的帧传送给宿主机。
下一优先级任务,级2,是发送数据任务。这一任务启动从适配器存储器30到适当通信端口的数据传送。当组合成了一帧用于通过一个端口进行通信的数据时或前一帧完成发送时便调度一次发送数据任务。
级3任务是一个错误/状态任务,每当在一个通信端口上出现一个错误时被调用。在这一任务所处理的错误类型中最好包括线路错误,诸如控制信号的意外改变以及数据传输错误。
在下面将要描述的环境中,正在发送或接收数据的一个端口所生成的各种事件必须进行排队等待以后处理。级4是一个处理端口应答队列中的项的任务。以同样的方式,级5是一个任务,它处理已经在排队等待着处理的发往一个端口的命令。利用端口应答队列与端口命令队列使得各种处理不必等待通信端口完成其当前操作便得以执行。例如,命令可以在宿主系统方便时送往一个端口,而它们将位于队列中直到它们能够作用在端口上。进来的事件被存放在端口应答队列中直到它们能被适配器22上的中央处理器28处理为止。
最低优先级,级6,用于唤醒休眠中的任务。有时,有必要将一个任务的操作挂起直到一个予定的事件出现。可以令这一任务休眠,如下面将要描述的,並将保持在挂起中。当予定的事件出现时,与该事件相关的一个中断处理程序调度端口应答队列任务,后者又将调度程序工作表50级6的适当位设置为1。当唤醒任务被选中为该端口执行时,被挂起的任务恢复执行。
图4(a)、4(b)与4(c)示出调度与执行任务的方式。参见图4(a),可以看到调度程序是在一个无穷循环中执行。一个当前选中的任务,或进程,在60中执行到完成。当该任务的执行完成时,调度程序在62选择具有任何被调度的任务的最高优先级。然后,在该优先级中,调度程序选择一个任务去执行。如果在被选中的优先级中具有一个以上要调度执行的任务,则采用轮转法来确定下一个要执行的任务。这便保证了所有端口都是平行对待的,使在任何给定的优先级上没有一个端口一直要等到所有其它端口上同一优先级的被调度的任务受到服务以后才会有一个任务被执行。任务一经选定,控制便返回步骤60去执行选定的任务。
步骤62与64操作得非常快,並最好是使其不能被中断的。这是因为各种可能出现的中断通常通过更新调度程序工作表50来调度任务,而这一操作将会干扰步骤62与64中的选择过程。步骤60中的进程执行是可中断的,而系统及通信端口生成的各种硬件中断则被用于调度调度程序工作表50中的其它任务。
图4(b)示出了处理一个中断的总的方法。当在适配器22上出现一个硬件中断时,中央处理器28的控制被矢量指向一个总的中断例行程序。这一例行程序标识在66出现的中断的性质,並使适当的中断处理程序在68执行。在步骤68中执行的中断处理程序最好是非常短的,並且是不允许被中断的。它一般要清除中断的原因,将一个或两个数据项复制到能够被一个正常地被调度的任务所寻访到的一个适当区域中,並在70更新调度程序工作表使得该适当的任务受到调度。从而,当一个任务正在步骤60中执行时,附加的任务在工作表50中被执行的各种中断处理程序所调度。
当各种任务是不可剥夺优先权的时,便使用图4(b)中的方法。换言之,一个执行中的任务在其它任务被调度程序初始化以前完成。由于绝大多数任务相当短,这在大多数系统中不存在问题。然而,如果需要,可以使各种任务成为 可剥夺优先权的。如果这样做的话,由一个中断调度一个较高优先级的任务导致当前任务的执行被挂起而立即执行该较高优级的任务。在这一情况中的中断处理的流程图出在图4(c)中。
当出现一个硬件中断时,该中断的性质在72被标识並在74执行一个适当的中断处理程序。和前面一样,执行中断处理程序使得调度程序工作表50在76被更新。然后在78检验是否已经调度了比当前正在执行的任务更高优先级的工作。如果在80判定未曾调度一个较高优先级的任务,恢复执行当前任务。如果在74执行中断处理程序的过程中调度了一个较高优先级的任务,则当前正执行的进程在82被剥夺並再度调用调度程序以启动该较高优先级进程的执行。
参见图5,其中示出了存储在适配器存储器30中的某些重要数据结构。存储器30的大部分最好由发送/接收缓冲器90占用。这些缓冲器90是从存储器30中可利用的自由空间中动态地分配的。如本领域技术所知,维护了一个可用作发送/接收缓冲器90的自由空间表。
分配了一张供各种任务与中断使用的矢量表91。为每一端口独立地分配了用作临时数据存储器的栈92。因而,当在适配器上提供有四个通信端口时在存储器30中分配了四个栈。调度程序使用一个单独的栈93,各端口还有一个端口控制块94其中包含指向由对应的端口所访问的各种数据结构的指针。端口命令队列96为每一端口提供一个FIFO(先进先出)队列其中包含送到该端口的命令。送至一个端口的命令被置于一个称为一个端口命令单元的标准大小的数据结构,每一个队列的命令是放置在一个环形缓冲区中的。
当一条要求向宿主机或从宿主机传输数据的端口命令被执行时,在数据传输进程完成以前这一端口的其它命令不能执行。在某些系统中,不可能使用往复转换缓冲器通过端口传输数据。在这种情况中,如果一个端口的一条通道是活跃的,其它通道可为下一次传输建立。为了准备其它缓冲器,可以执行在端口命令队列96中等待的端口命令。
每一端口还有一个对应的端口应答队列98,它是由和端口命令队列96相同的环形缓冲器构成的。端口应答队列98中包含由对应的端口生成而必须由系统处理的项。如果一次系统总线DMA传输正在为一个端口执行,由该端口正在生成的这些应答都必须确定路由到该端口应答队列98。同时,如果一个端口正在休眠,将由一个予定的事件的出现所唤醒,则所有该端口生成的应答都确定路由到适当的应答队列98中。
在适配器存储器30中还有调度程序的可执行代码100,各种已调度的任务,以及中断处理程序。在适配器存储器30中分配了用于本技术领域所知的临时变量存储的各种其他单元,但並未具体地示出在图5中,存储器30中还包括调度程序工作表50。
参见图6,其中示出了系统总线DMA任务的操作。如上所述,系统总线DMA任务与其他级别不同地使用调度程序工作表50,即使用调度程序工作表次指示被调度的任务的编号而不是标识具有一个被调度的任务的端口。当一个系统总线DMA任务被调度时,对被请求的任务的一个指示被存储在一个单独的数据结构中(未示出),並且根据任何要求的赋优先级方案从被调度的系统总线DMA任务中选择一个。
一旦启动了一个系统总线DMA任务,在传输正在进行时,可以执行其它的适配器处理。由于只要有可能调度程序将试图调度一个级0任务,所以在系统总线DMA传输期间有必要将级0表次设置为0。从而,参见图6,一个选中的系统总线DMA任务所执行的第一步便是在108保存调度程序工作表50中级0所反映的当前DMA计数。然后在110为调度程序工作表的级0制造一个0表次,並在112启动系统总线DMA任务。一旦在112启动了DMA,控制可以返回给调度程序去选择另一个任务去执行。
在将来某一时刻,在114系统总线DMA传输将会完成。这时,在116必须调度另外一个任务,並且在118恢复调度程序工作表的级0表次。最好在恢复以前将放回表50的级0中的值先减去1。
如果已经发生的是一个将数据从宿主系大移动到适配器22上的发送DMA,必须将已经置于端口命令队列上的任务封锁解除(下面要说明)。此外,调度一个端口命令队列任务。当一个将数据从适配器22传送到宿主系统的接收DMA完成时,调度一个端口应答队列任务。此外,将导致对该端口的应答事件确定路由到该端口应答队列中的一个全程标志清除以允许正常地处理端口应答。所有这些操作都发生在步骤116中。
图7示出发送数据任务的操作。当一个帧结束中断指示完成了通过一个端口的一次发送操作时调度这一任务。该任务首先在120将有关信息放置在端口控制块94中发出完成信号。然后在122清並释放发送缓冲器。在124以设置调度程序工作表50中的适当位来调度端口命令队列任务。如果在126判定另一帧已准备好发送,则在128启动发送而任务完成。如果在126判定没有准备好发送的帧,则该任务简单地返回。
图8示出接收数据任务所执行的步骤。首先在130调用一个专门为用于处理正使用在通信端口上的通信协议而编码的过程。在一个通信端口上所使用的协议是用在对应端口控制块94中所包含的适当值来指示的。框132中所示的步骤是由该协议专用过程实际执行的。接收到的帧在134被处理並且在136在应答队列中加入任何适当的表项。如果在接收到的数据帧中出现错误,则可以调度一个错误/状态任务。
图9示出了错误/状态任务所执行的步骤。中断处理程序在140将一个错误标识符复制到该端口的端口控制块,用于向以后访问该端口的任务指示已经出现了一个错误。错误标识符指示所出现的错误的类型並在142检验对应的可能错误源。一旦标定了错误源,在144中将适当的表项加入到该端口的应答队列中。当这些表项最终被处理时,该端口错误将被指示给系统10。
端口应答队列任务的操作示出在图10中。首先在150检验队列是否是空的。如果是,则在152清用于自动重新确定端口应答路由到该队列的标志,使得端口应答以正常方式进行处理。然后该任务在154从调度工作表50中解除对自己的调度而完成。如果在150判定队列中有表项,则在156选择下一个项。在158检验判定是否下一个表项是一个要求向宿主系统10进行DMA传送的应答。如果是,则在160调度总线主DMA任务並在154解除对当前任务的调度。如果下一个表项不是一个DMA传送,则在162检验判定是否该端口的一个任务正在休眠。如果不是,则在164将应答送给宿主机。如果一个任务在休眼,则在166调度休眠/唤醒任务並在154解除对当前任务的调度。
图11示出端口命令队列任务所执行的步骤。总的说来,这一任务在端口命令队列96中选择下一个表项並使之被执行。各种事件的发生可能阻止执行下一个端口命令项的发生。第一步是在170从端口命令队列中选取下一个表项。如果在172判定下一个表项没有被封锁,则在174进行检验是否要求一次系统总线DMA操作。如果不是,而且在176判定该端口是可用的,则在177建立下一个数据块的发送並在178调度传送数据任务。如上所述,如果为每一个端口提供了两个往复转换工作的缓冲器,则可以予处理两次传输。
在许多情况中,有必要在数据能够被发送以前执行一次系统总线DMA传送将数据传送到适配器22上。如果步骤174的测试结果为一个“是”答复,有必要在180调度一次适当的系统DMA活动並在182封锁端口命令队列中当前选中的表项。然后在184解除这一端口的级5任务的调度。如以上结合图6所说明的,系统总线DMA任务的完成使得在步骤182中设置的封锁被清除,並重新调度这一端口的端口命令队列任务。在下一次通过图11中的进程时,在步骤174的系统DMA测试结果将是一个“否”回答。如果在步骤172判定下一表项是封锁的,或者在步骤176判定端口是不可用的,则控制传递到步骤184而在调度程序工作表50中这一端口的级5表项在184被解除调度。
图12示出了当一个任务将自己置于休眠並随后被唤醒时所执行的步骤。在190首先为该端口设置一个SLEEP-ENABLE(休眠-启动)变量。在191该任务进入休眠並在192将当前上下文保存在该端口的栈中。在步骤190中设置SLEEP-ENABLE变量导致由该端口生成的任务应答被确定路由到端口应答队列98。退出将要休眠的任务並在194发生其它处理,在步骤192中保存的上下文在端口栈92上保持不受触动。
当在端口应答队列上加上新的事件时,端口应答队列任务唤醒休眠的任务並在196从栈中恢复上下文。在198进行检验以判定该唤醒事件是否是该任务所等待的一个最终条件。如果不是,则该任务返回到191去休眠。如果该事件的确使该任务醒来,则在200恢复执行。当任务完成时,复位SLEEP-ENABLE变量。在任务执行中的一个后面的阶段中该任务可将自己置回到休眠中去,这便导致上述事件序列重复进行。
由于唤醒一个休眠任务是所能调度的最低级任务,在接受唤醒时系统得到保证在步骤192中保存在栈上的上下文必定是栈上的栈顶帧,一次唤醒是由另一个任务或中断调度的,它设置调度程序工作表50级6上的适当位。
以上所描述的系统提供优先调度在适配器上的各种通信子任务。不必改动作为基础的调度程序便可容易地扩充优先级的数目以及所能支持的通信端口的数目。较佳实施例的适配器支持两个独立的DMA传送级别。一个级别是在适配器总线26上执行的DMA传输,而第二个级别是由系统总线接口24执行的在系统总线16上的DMA传输。
较佳的调度程序工作表50已经赋予了任务优先级使得时间性最关键的任务具有最高优先级。必须以及时的方式执行以避免通过通信端口数据丢失的发送数据与接收数据任务比较放置在队列96与98上的各种命令与应答的处理具有较高的优先级。将自己置于休眠的任务,意味着时间不是一个关键性因素,在所有任务中具有最低的优先级。由于一个资源是所有端口之间共享的,系统总线DMA有成为瓶颈的趋向,所以赋予系统总线DMA任务以最高优先级。提供了一种机制,使得当一次系统总线DMA正在进行时其他任务可在适配器22上执行。由于在各优先级上采用了一种轮转的策略,所以没有一个端口会受到冷遇。
虽然本发明只以其形式中的一种示出,它並不局限于此而且容许不脱离其精神而作各种变化与修改。