CN100511153C - 异步输入输出信号处理方法 - Google Patents

异步输入输出信号处理方法 Download PDF

Info

Publication number
CN100511153C
CN100511153C CNB2006101168984A CN200610116898A CN100511153C CN 100511153 C CN100511153 C CN 100511153C CN B2006101168984 A CNB2006101168984 A CN B2006101168984A CN 200610116898 A CN200610116898 A CN 200610116898A CN 100511153 C CN100511153 C CN 100511153C
Authority
CN
China
Prior art keywords
event object
asynchronous
user
input
thread
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CNB2006101168984A
Other languages
English (en)
Other versions
CN101158912A (zh
Inventor
王晨辉
苏翼鹏
张毅
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
KETAI CENTURY SCIENCE AND TECHNOLOGY Co Ltd SHANGHAI
Original Assignee
KETAI CENTURY SCIENCE AND TECHNOLOGY Co Ltd SHANGHAI
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by KETAI CENTURY SCIENCE AND TECHNOLOGY Co Ltd SHANGHAI filed Critical KETAI CENTURY SCIENCE AND TECHNOLOGY Co Ltd SHANGHAI
Priority to CNB2006101168984A priority Critical patent/CN100511153C/zh
Publication of CN101158912A publication Critical patent/CN101158912A/zh
Application granted granted Critical
Publication of CN100511153C publication Critical patent/CN100511153C/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)

Abstract

本发明公开了一种异步输入输出信号处理方法,提供一套基于事件的信号处理机制,并在驱动程序的接口上做特殊设计以配合这套信号处理,包括以下步骤:步骤一,作为驱动程序的使用者的用户线程通过驱动程序接口提出进行输入输出信号处理的需要;步骤二,驱动程序创建事件对象,并将其导出给用户线程;步骤三,用户线程通过事件对象获取输入输出处理信号,并根据驱动程序对信号的定义来完成相应操作;驱动程序完成设备的输入输出操作,通过事件对象来通告用户线程处理信号。将一些高级同步机制简化,提供给驱动程序设计者使用;一个用户线程可以同时与多个设备进行异步I/O的操作;驱动程序可自定义异步I/O的信号语义,提供更丰富的功能。

Description

异步输入输出信号处理方法
技术领域
本发明涉及一种信号传送方法,特别涉及一种应用程序使用驱动程序访问外部设备时的输入输出方法。
背景技术
应用程序一般通过使用驱动程序实现对外部设备的访问,而目前驱动程序可以提供两种操作方式:同步输入输出方式(以下简称同步I/O)和异步输入输出方式(以下简称异步I/O)。
在同步I/O中,线程启动一个I/O操作然后就立即进入等待状态,直到I/O操作完成后才继续执行。而在异步I/O方式中,线程发送一个I/O请求到内核,然后继续处理其他的事情,内核完成I/O请求后,将会通知线程I/O操作完成了。这个过程如图1所示。
同步I/O中,等待I/O操作完成的线程有两种选择:第一,不停的查询I/O操作是否完成,这将会使CPU时间全部浪费在等待上,当前线程的工作没有向前推进;第二,可以将自己的CPU时间转让给其他线程使用,以提高整个系统对CPU的使用效率。但是后者带来了线程切换,休眠与唤醒的额外执行开销。如果I/O操作的时间很短,那么这种方法可能得不偿失。
另一方面,如果I/O请求需要大量时间执行的话,异步I/O方式可以显著提高效率,因为同步I/O中在线程等待的这段时间内,CPU虽然会调度其他线程进行执行,但是如果系统中没有其他线程需要执行,这段时间将会浪费掉(可能会调度操作系统的IDLE线程)。而异步I/O可以将等待I/O操作的时间留给当前线程使用,使编程者能够自行安排工作利用这段CPU时间,并在必需要确定I/O操作完成情况时才进行相关操作。如果I/O请求操作很快,用异步I/O方式反而还低效,还不如使用同步I/O方式。异步I/O方式如图2所示。
同步I/O在同一时刻只允许一个I/O操作,也就是说对于同一个设备驱动的使用是序列化的,即使使用两个线程也不能同时对同一个设备发出读写操作。异步I/O允许多个线程同时发出I/O请求。
异步I/O在请求完成时,通过将事件对象设为已通知状态来通知应用程序。应用程序将通过判断对应的事件对象来进行确认。
本质上异步I/O就是在设备准备好进行I/O时,用一个信号通知相关的线程。在Windows系统中,异步I/O操作是作为文件系统的功能实现的,可以使用Windows中的多种同步机制,这是一种高阶信号处理行为,但是在开发驱动时并没有提出合适的异步信号处理模型。另一方面,在传统的UNIX系统中,虽然提供基于驱动程序一级的异步I/O,并为其提供一个特殊的信号,然而却对此作出诸多限制,例如,只有流设备才能使用异步I/O,每个进程只有一个这种信号。所以,为了弥补UNIX的不足,又能提供全面的异步I/O支持,需要为驱动程序开发一套全面的异步I/O信号的处理模型。
发明内容
本发明要解决的技术问题是提供一种驱动程序级别的异步输入输出信号处理方法,能提供全面的异步I/O支持。
为解决上述技术问题,本发明异步输入输出信号处理方法,提供一套基于事件的信号处理机制,并在驱动程序的接口上做特殊设计以配合这套信号处理,包括以下步骤:
步骤一,作为驱动程序的使用者的用户线程通过驱动程序接口提出进行输入输出信号处理的需要;
步骤二,驱动程序创建事件对象,并将其导出给用户线程;
步骤三,用户线程通过事件对象获取输入输出处理信号,并根据驱动程序对信号的定义来完成相应操作;驱动程序完成设备的输入输出操作,通过事件对象来通告用户线程处理信号。
本发明在系统仅提供一套简单的同步机制——事件,就从两个方面解决了异步输入输出的难题:首先,不需要将异步输入输出操作像Windows编程一样提高到文件系统的高度,并使用各种复杂的同步机制和丰富的系统API;其次,也克服了UNIX系统对驱动层的异步输入输出的各种限制;另一方面,还将事件所导出的信号的语义定义留给驱动设计者,使驱动程序可以提供更加丰富的功能。
附图说明
图1是公知技术中同步输入输出方式的进程示意图;
图2是公知技术中异步输入输出方式的进程示意图;
图3是本发明应用于向设备写数据时的流程示意图;
图4是本发明应用于中断服务程序时的流程示意图。
具体实施方式
下面结合附图对本发明作进一步详细的说明。
首先,从内核对异步输入输出(异步I/O)的事件支持上看,内核提供创建事件和通过事件来通告线程的功能。对于一个事件,线程可以对其进行等待或者尝试等待。然后,在驱动接口层的所有接口都支持一个事件的输出参数(见驱动的接口定义)。当应用程序线程需要进行异步I/O时,它通过驱动程序的接口方法从内核中获取一个事件,并可以在任何时候通过该事件来等待或者尝试等待事件对应设备完成相应的工作。当事件发生时,等待线程还能从事件上获取信号信息。这个信号可以由驱动程序定义其语义,应用线程根据语义做相关处理。
这样,有可能仅提供一套简单的事件同步机制和接口上的特殊设计解决异步I/O的问题,同时克服Windows和UNIX的不足;另外,还可以给驱动程序设计者提供丰富的语义能力。
基于以上分析,本发明的设计方案可用以下表1、表2、表3来解释,其描述均基于C++语言。
其一,在系统内核中实现事件创建功能,事件通告功能,如下表1:
 
EXTERN ECODE CreateEventObj(/*[in]*/BOOL bManualReset,/*[in]*/DWORD dwInitialState,/*[out]*/IEvent**ppEvent);参数说明:bManualReset,[in]如果指向TRUE,表示需要手动重置事件,否则一直为已通知状态;指向FALSE,则表示会自动重置事件;dwInitialState,
 
[in]指定所创建的事件同步对象的初始状态。为零表示未通知状态,否则为已通知状态。返回值(32位枚举类型)说明:返回值                描述S_OK                  程序执行成功E_INVALIDARG          指定的参数无效E_OUTOFMEMORY         内存不足备注:驱动程序可以使用本函数创建出一个事件对象,并通过IDriver的三个方法的最后一个参数([out]IEvent **ppCompletionEvent)将其接口引用返回给用户,由此可以实现驱动程序的异步I/O操作。
EXTERN void NotifyEventObjByIsr(/*[in]*/IEvent*pEvent,/*[in]*/DWORD dwState);参数说明:pEvent,[in]指定一个需要设置的事件对象;dwState,[in]指定一个已通知状态,可由用户自定义的一个非零无符号整数来表示。在默认情况下,uState将被设置为SIGNALED。返回值说明:此函数无返回值。备注:本函数用于设置事件对象为一个指定的已通知状态,从而唤醒等待着的线
 
程。如果事件对象是自动重置的,则仅唤醒一个等待线程,并且事件对象将被重置为未通知状态;如果事件对象是手动重置的,则唤醒所有等待线程,并且事件对象将保持此已通知状态,直到被IEvent::Clear成员函数重置为未通知状态为止。如果没有任何线程在事件对象上等待,此函数仅仅将事件对象设置为指定的已通知状态。
其二,实现事件相关的等待和尝试等待的方法成员如下表2:
 
IEvent方法 描述
Wait 等待事件对象变成已通知状态
TryWait 尝试在指定时间间隔内等待事件对象变成已通知状态
Notify 设置事件对象为一个指定的已通知状态
Clear 将事件对象重新设置为未通知状态
在表2中,一个事件对象代表一个“事件”(一种同步对象),一个线程可以通过它来通知其他线程一个事件已经发生了。事件对象通过暴露出IEvent接口来提供服务。
事件对象在某个时刻将处于未通知状态或已通知状态。当事件对象处于未通知状态时,所有等待此事件对象的线程将全部进入等待状态;当事件对象处于已通知状态时,等待此事件对象的线程则不会进入等待状态。
事件对象有两种类型:手动重置和自动重置。事件对象的类型是在创建时由传入的类型参数指定的。手动重置的事件对象可以通过调用IEvent::Notify方法设置为已通知状态,或是通过调用IEvent::Clear方法设置为未通知状态。手动重置的事件对象会保持已通知状态,直到通过调用IEvent::Clear方法重置为未通知状态为止。而自动重置的事件对象也可以通过调用IEvent::Notify方法或IEvent::Clear方法设置为已通知状态或未通知状态,并且自动重置的事件对象会在一个线程被唤醒后自动重置为未通知状态。
事件对象只有一个预定义的未通知状态,而已通知状态则允许有任意多个,由用户自行定义的一个非零无符号整数来表示。调用IEvent::Notify方法时将指定事件对象的已通知状态。被唤醒线程可以从IEvent::Wait或IEvent::TryWait方法中取得事件对象被指定的已通知状态。
其三,在驱动接口设计上为每个接口方法都添加相关的事件导出参数,如下表3:
 
IDriver定义:
   interface IDriver{Read([in]UINT64 u64Offset,[in]UINT uNumberOfBytesToRead,[out]EzByteBuf ebbData,[out]IEvent **ppCompletionEvent);参数说明:u64Offset,要读的数据在设备的偏移值,此参数对于存储类设备(如硬盘)来说,跟扇区相关;uNumberOfBytesToRead,要读的数据的大小;ebbData,读出数据的缓冲区;ppCompletionEvent指向一个IEvent接口指针变量,用来存放所获取的操作同步事件对象的接口指针。参见IEvent接
 
口。当本方法被实现为异步调用时,此操作同步事件对象可以被用来进行调用间同步。返回值说明:返回值         描述S_OK          方法调用成功E_FAIL         未知错误备注:此方法将设备内偏移值为u64Offset,大小为uNumberOfBytesToRead字节的数据读入ebbData中。调用成功,返回S_OK,调用失败,返回E_FAIL。
       Write([in]UINT64u64Offset,[in]EzByteBuf ebbData,[out]UINT*puNumberOfBytesWritten,[out]IEvent**ppCompletionEvent);参数说明:u64Offset写入设备的偏移值,此参数对于存储类设备(如硬盘)来说,跟扇区相关;ebbData要写入设备的数据缓冲区;puNumberOfBytesWritten实际写入设备的数据的大小的指针;ppCompletionEvent指向一个IEvent接口指针变量,用来存放所获取的操作同步事件对象的接口指针。参见IEvent接口。当本方法被实现为异步调用时,此操作同步事件对象可以被用来进行调用间同步。
 
返回值说明:返回值          描述S_OK           方法调用成功E_FAIL          未知错误备注:此方法将ebbData中的数据写进设备偏移值为u64Offset的地方。调用成功,返回S_OK,调用失败,返回E_FAIL。
     Control([in]INT nControlCode,[in]EzByteBuf ebbInData,[out]EzByteBuf ebbOutData,[out]IEvent**ppCompletionEvent);}参数说明:nControlCode向设备发送的控制命令码;ebbInData向设备发送的命令数据;ebbOutData从设备返回的结果状态等数据;ppCompletionEvent指向一个IEvent接口指针变量,用来存放所获取的操作同步事件对象的接口指针。参见IEvent接口。当本方法被实现为异步调用时,此操作同步事件对象可以被用来进行调用间同步。返回值说明:返回值        描述S_OK          方法调用成功
 
E_FAIL         未知错误备注:此方法向设备发送命令nControlCode,返回结果状态等数据在ebbOutData内。调用成功,返回S_OK,调用失败,返回E_FAIL。
异步I/O的信号处理流程包含以下步骤:
步骤一,用户线程(驱动程序的使用者)通过驱动程序接口提出进行异步I/O处理的需要;
步骤二,驱动程序创建事件对象,并将其导出给用户线程;
步骤三,用户线程通过事件对象获取I/O处理信号,并根据驱动程序对信号的定义来完成相应操作;驱动程序完成设备的I/O操作,通过事件对象来通告用户线程处理信号。
在步骤三中,第一部分,即,用户线程通过事件对象获取I/O处理信号并根据驱动程序对信号的定义来完成相应操作,和第二部分,即,驱动程序完成设备的I/O操作,通过事件对象来通告用户线程处理信号,这两部分的发生顺序没有固定。
这种异步I/O处理方法的优点是:将一些高级同步机制简化,提供给驱动程序设计者使用;一个用户线程可以同时与多个设备进行异步I/O的操作;驱动程序可自定义异步I/O的信号语义,提供更丰富的功能。
在某些系统中,设备驱动程序本质上就是一类存在于内核之中的特殊CAR(Component Assembly Runtime,零部件动态装配)构件,必须通过暴露出一个统一的CAR接口IDriver来提供服务。所有的内核驱动程序都提供了一致的IDriver接口,但是一各自特定于设备的方式来解释IDriver接口的精确语义。IDriver接口定义三个标准方法Read,Write和Control,见表3。
通常,IDriver接口的Read()方法用于从设备中读入数据;Write()方法用于向设备写数据;而Control()方法则用于向设备发送命令、获取状态信息等等。在这些方法中,本发明定义了一个输出参数IEvent**ppCompletionEvent。如果用户设置该参数为非空,则表示其请求一个异步I/O操作。如果此设备驱动实现了异步I/O,就可以通过此参数返回一个事件对象给用户。当设备完成此异步I/O操作时,通过设置此事件对象为已通知状态来通知用户此次I/O操作的结果。而用户可以在正常启动异步操作之后某个时刻,通过事件对象的Wait或者TryWait方法进行同步。
在异步I/O操作过程中,用户调用驱动程序,后者向外部设备发出一次I/O命令后,返回一个事件对象到用户程序。此时用户可以继续进行其它处理,外部设备与CPU并行工作。当设备完成指定的操作时,它会通过中断方式来通知内核作进一步处理。内核会使用对应驱动的中断服务程序(ISR)来完成这个操作:若是用户指定的操作尚未完成,驱动ISR对外部设备进行设置之后让设备继续工作;若用户指定操作已经全部完成,则通过设置对应的事件对象为已通知状态来通知用户,并将表示执行结果的状态标志信息传给用户。用户在某个时刻可以使用从驱动中得到的事件对象进行同步:若此时事件对象为已通知状态,则其可以继续执行,并从获得的执行结果的状态标志信息中作进一步的判断与处理;若此时事件对象为未通知状态,当前用户线程将进入等待状态,直到事件对象变成已通知状态后被唤醒。当其被唤醒后就意味着I/O操作已完成,并且可以通过传出的状态参数来判断I/O操作的执行情况。本发明应用于ISR时的流程如图4所示。
在以上过程中,可以看到在异步I/O的过程中,当驱动ISR工作时,对用户线程的情况是不明确的,即不能确定该用户线程此时的状态,甚至不能假定其仍然存在。所以,如果在ISR中使用到用户线程提供的空间,就可能出现意外。因为一方面(数据空间的存在性),ISR不能确定这段用户空间依然可用,用户线程可能遭遇异常而夭折或者恶意释放这个空间;另一方面(数据的一致性),由于ISR与用户线程都可以使用到这个空间,而这二者是异步执行的,那么这个共用的空间就相当于一个竞争资源,可能产生数据不一致。要避免这个问题,可以在驱动中锁定这个特定用户线程的一段空间。但是这种技术比较复杂,驱动会影响用户线程执行,不适合在驱动程序中采用,仅考虑简单的情况——ISR过程不使用用户空间,即Read,Write,Control方法除了ppCompletionEvent参数之外不使用输出类型的参数。那么对于RWC的参数使用上,做一些改变:Read方法就不能采用异步I/O的策略(除非用两次读,即ISR将从设备读出的数据暂时存在驱动缓冲区中,用户线程被唤醒后,判断I/O操作是否成功,若成功则再次调用驱动的Read方法将驱动缓冲区的数据读到用户空间)。而对于Write方法,则可以按图3所示的流程,将用户数据拷贝到驱动缓冲区,然后异步发送到设备。对Control方法也使用同样的改变,对于用户到设备的数据,使用驱动缓冲区作为跳板,现将用户数据保存在驱动缓冲区,然后由ISR逐步送到设备;对于设备到用户的数据,除了在I/O完成之后再进行一次驱动缓冲区到用户空间的拷贝之外,尚无其它解决方案。
本发明所提供的方法可应用于诸如将用户数据输出到外部设备(典型的就是Write操作),或者使外部设备执行某些不涉及数据传输的操作,例如格式化磁盘,在显存中移动数据等操作中。
下面以串口驱动的Write方法为例,在系统中实现异步I/O的操作。
首先,来实现用户程序部分:
#include<elastos.h>
#include<stdio.h>
#define MAXLEN 256
int__cdecl main()
{
    char c;
    char strSend[MAXLEN];
    HRESULT hr;
    IDriver*pDriver=NULL;
    EzByteBuf_<MAXLEN>ebbSend;
    IEvent*pEvent=NULL;
    UINT uSend;
    int i;
    DWORD dwStat=0;
    //获取串口驱动的服务对象
    hr=EzFindService(EZCSTR(″device:aserial1″),
(IObject**)&pDriver);
    if(FAILED(hr)){
       printf(″Err:No serial driver\n″);
       return -1;
    }
    //读取键盘输入,以$作为结束符,长度不超过MAXLEN:
    for(i=0;i<MAXLEN;i++){
       if(’$’!=(c=getchar())){
          strSend[i]=c;
          strSend[i+1]=0;
       }
       else
           break;
    }
    //如果有键盘输入,将其发到串口:
    if(i>0){
       //将待发送数据拷贝到EzByteStr中
       ebbSend.Copy(strSend,i);
       //调用驱动接口的Write方法:
     hr=pDriver->Write(0,ebbSend,&uSend,&pEvent);
     if(FAILED(hr)){
         printf(″transmit failed\n″);
         goto Exit;
     }
     //从驱动正常返回之后可以继续执行一些其它操作,例如:
     {
          printf(″%d:%s\n″,ebbSend.Used(),(char*)ebbSend);
     }
     //与IO操作进行同步:
     printf(″Wait for event!\n″);
     hr=pEvent->Wait(&dwStat);
     if(FAILED(hr)){
          printf(″wait event failed\n″);
          goto Exit;
     }
  //对IO操作结果作相应处理:
     printf(″IO operation finished.Send Bytes:%d\n″,dwStat);
}
Exit:
if(pDriver)pDriver->Release();
if(pEvent)pEvent->Release();
     return hr;
}
     if(pDriver)pDriver->Release();
     if(pEvent)pEvent->Release();
     return 0;
}
用户程序首先获得串口驱动对象,然后从键盘读数据,并将这些数据通过串口驱动的Write方法发送到串口输出,接着做一些其它处理后,与I/o操作进行同步,并作相应处理,最后退出。
驱动的实现部分仅仅关注串口的Write方法和其Isr。
Write方法进行异步操作过程如下:
HRESULT CASerial::Write(
     /*[in]*/UINT64 u640ffset,
     /*[in]*/EzByteBuf ebbData,
     /*[out]*/UINT*puNumberOfBytesWritten,
     /*[out]*/IEvent**ppCompletionEvent)
{
     if(ebbData.IsNull()
         ||0==ebbData.Used()){
         return E_INVALIDARG;
     }
     HRESULT hr;
m_writeLock.Lock();
if(!ppCompletionEvent){
   //同步IO操作
   //……
}
else{//异步IO操作
   //检测驱动缓冲区是否还有足够大的空间
   if((UINT)ebbData.Used()>(TXASYNQUEUE-
m_uUsedTxAsyncQueue)){
       hr=E_FAIL;
       goto Exit;
  }
  //将数据拷贝到驱动缓冲中:
  if(!ByteCpy(ebbData)){
     hr=E_FAIL;
     goto Exit;
}
//将驱动创建的事件对象输出给用户:
if(m_pTxAsynEvent){
    //正在进行异步操作
    hr=E_FAIL;
    goto Exit;
      }
      else{
          hr=CreateEventObj(FALSE,0,&m_pTxAsynEvent);
          if(FAILED(hr)){
             kprintf(″Can’t create AsynTX Event\n″);
             m_pTxAsynEvent=NULL;
             goto Exit;
        }
    }
    m_pTxAsynEvent->AddRef();
    *ppCompletionEvent=m_pTxAsynEvent;
    //设置当前输出数据为0:
    if(!puNumberOfBytesWritten)*puNumberOfBytesWritten=0;
    //设置IO状态信息(用于记录传送字节数目):
    m_dwError=0;
    //打开发送寄存器为空时的中断:
    UART_ENABLE_TX_INTS(m_iobase);
    hr=S_OK;
}
Exit:
m_writeLock.Unlock();
return hr;
}
Write方法在进行异步操作的过程中主要完成:检测驱动缓冲区是否能容纳用户数据;将用户数据拷贝到驱动缓冲区中;创建并导出事件对象;开启传送缓冲为空时的中断。
驱动ISR过程如下:
void CASerial::Isr()
{
    //获取串口控制器状态:
    UINT uIntStat=UART_READ_INT_STAT(m_iobase);
    //判断是否为传送寄存器为空,且执行异步IO:
    if(UART_IS_TX_INT(uIntStat)&& m_pTxAsynEvent){
       if(m_uUsedTxAsyncQueue){//驱动缓冲中是否还有数据待发送
          //将一个字节数据传到发送寄存器
       while(UART_READ_LS_ETHR(m_iobase))//m_uUsedTxAsyncQueue
                UART_WRITE_TX_BUF(m_iobase,FetchByte());
                m_dwError++;
       }else{//数据传送完毕
           //关闭传送中断:
           UART_DISABLE_INTS(m_iobase);
           UART_DISABLE_INTS(m_iobase);
           UART_DISABLE_INTS(m_iobase);
           //通知用户线程,返回IO执行状态:
           NotifyEventObjByIsr(m_pTxAsynEvent,m_dwError);
           m_dwError=0;
           m_pTxAsynEvent->Release();
           m_pTxAsynEvent=NULL;
       }
    }
    else{
        //处理其它中断情况:
    }
}
驱动ISR所作的工作主要是:判断驱动缓冲区是否还有数据待发送,若有就将一个字节传送到串口发送寄存器上;若没有,就关闭中断通知用户程序。
运行结果,启动用户程序ComAsynIOTest后,首先输入一组数据,以$作为结束,可以看见提示信息:“Wait for event!”,然后过一会儿会继续出现:“IO operation finished.Send Bytes:XX”。例如:
[D:/]ComAsynIOTest
012345678901234567890123456789.$
Wait for event!
IO operation finished.Send Bytes:31
与微软的异步I/O相比,本发明所提供的方法要求用户提供一个事件对象后传递给文件对象,而不是仅仅针对驱动。并且通过GetOverlappedResult操作来查看执行结果,相对比较复杂。而本发明的事件对象比微软的多返回一个附加的DWORD参数,可以借此获知异步I/O的完成情况,比微软的异步I/O要更简洁。

Claims (5)

1、一种异步输入输出信号处理方法,包括以下步骤:
步骤一,作为驱动程序的使用者的用户线程通过驱动程序接口提出进行输入输出信号处理的需要;
步骤二,驱动程序创建事件对象,并将其导出给用户线程;
步骤三,用户线程通过事件对象获取输入输出处理信号,并根据驱动程序对信号的定义来完成相应操作,驱动程序完成设备的输入输出操作,通过事件对象来通告用户线程处理信号。
2、根据权利要求1所述的异步输入输出信号处理方法,其特征是,所述事件对象包括已通知和未通知两种状态;当事件对象处于未通知状态时,所有等待此事件对象的用户线程将全部进入等待状态;当事件对象处于已通知状态时,等待此事件对象的用户线程则不会进入等待状态。
3、根据权利要求2所述的异步输入输出信号处理方法,其特征是,所述事件对象包括手动重置和自动重置两种类型,事件对象的类型是在创建时由传入的类型参数指定的;手动重置的事件对象设置为所述已通知状态或所述未通知状态,手动重置的事件对象保持已通知状态,直到被重置为未通知状态为止;自动重置的事件对象设置为所述已通知状态或所述未通知状态,自动重置的事件对象在一个用户线程被唤醒后自动重置为未通知状态。
4、根据权利要求3所述的异步输入输出信号处理方法,其特征是,所述事件对象的未通知状态只有一个预定义的状态,已通知状态有一个或者任意多个。
5、根据权利要求4所述的异步输入输出信号处理方法,其特征是,所述事件对象的已通知状态由用户自行定义的一个非零无符号整数表示。
CNB2006101168984A 2006-10-08 2006-10-08 异步输入输出信号处理方法 Expired - Fee Related CN100511153C (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CNB2006101168984A CN100511153C (zh) 2006-10-08 2006-10-08 异步输入输出信号处理方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CNB2006101168984A CN100511153C (zh) 2006-10-08 2006-10-08 异步输入输出信号处理方法

Publications (2)

Publication Number Publication Date
CN101158912A CN101158912A (zh) 2008-04-09
CN100511153C true CN100511153C (zh) 2009-07-08

Family

ID=39307021

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB2006101168984A Expired - Fee Related CN100511153C (zh) 2006-10-08 2006-10-08 异步输入输出信号处理方法

Country Status (1)

Country Link
CN (1) CN100511153C (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112000480B (zh) * 2020-08-25 2023-12-05 深圳忆联信息系统有限公司 提升ssd全盘扫描效率的方法、装置、设备及介质

Also Published As

Publication number Publication date
CN101158912A (zh) 2008-04-09

Similar Documents

Publication Publication Date Title
JP3929554B2 (ja) ファイル・オブジェクトの生成をバリデーションし、ファイル・オブジェクトへのメッセージをルーチングする方法
JP4684376B2 (ja) カーネル・モードにおけるソフトウェア・ドライバを相互接続する方法,コンピュータ・プログラム・プロダクト、システムおよび記録媒体
JP3929551B2 (ja) セパレート・プロセッシング・コンポーネント間のバッファ間データ転送を減らす方法およびコンピュータ読取り可能媒体
US8078768B2 (en) Universal Serial Bus (USB) remote wakeup
CN101292226B (zh) 用于线程通信和同步的设备、系统和方法
JP2009532782A (ja) マルチポート・メモリ・デバイスにおけるインターポート通信
JP2003515221A (ja) 低電力システムにおけるバス裁定
CN103729329A (zh) 核间通信装置及方法
CN101154202B (zh) 管理多处理器计算机系统中的系统管理中断的系统和方法
WO2023221753A1 (zh) 串口通信方法及相关装置
CN116472512A (zh) 片上系统(soc)的增强的耐久性
Wenban et al. Codesign of communication protocols
US6412018B1 (en) System for handling asynchronous message packet in a multi-node threaded computing environment
JP2014523584A (ja) Usbデバイスのための電力管理モジュール
CN100511153C (zh) 异步输入输出信号处理方法
JPH09507938A (ja) 処理装置からクロックへのインターフェース
CN116225995B (zh) 一种总线系统及芯片
WO2024016864A1 (zh) 处理器、获取信息的方法、单板及网络设备
US20040216136A1 (en) Method and apparatus for implementing distributed event management in an embedded support processor computer system
US7043565B1 (en) System and method for transferring data over an external transmission medium
US12112042B2 (en) Cache mirroring method
EP4373038A1 (en) Processing system, related integrated circuit, device and method
Wu et al. Development of Battery Management Unit Driver Based on AUTOSAR
KR20070063124A (ko) 시스템 버스와 아이피간 인터페이싱 장치와 방법 및 컴퓨터프로그램을 저장하는 컴퓨터로 읽을 수 있는 기록 매체
Pearson et al. Transparent connectivity for embedded system design

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20090708

Termination date: 20181008

CF01 Termination of patent right due to non-payment of annual fee