WinCE中中断的处理过程(驱动开发人员角度)
中断是硬件与软件打交道的重要方法,因此,大多数驱动程序都涉及到对中断的处理,本文就驱动程序的开发人员以及BSP的开发人员的角度,来谈谈Windows CE中中断的处理过程。
如果一个驱动程序要处理一个中断,那么驱动程序需要首先建立一个事件,可以使用CreateEvent函数,然后调用InterruptInitialize将该事件与中断号绑定,这一步就会使能该中断,OAL中的OEMInerrupteEnable就会被调用,如果该函数不返回true的话,InterruptInitialize就会失败。然后驱动程序中的IST就可以使用WaitForSingleObject函数来等待中断的发生。
当一个硬件中断发生之后,操作系统陷入异常,中断向量指示进入CE的异常处理程序,该异常处理程序然后调用OAL的OEMInterruptHandler函数,该函数检测硬件之后,将硬件中断转换为软件的中断号,返回给系统。该中断号就是上面提到的InterruptInitialize中使用的那个中断号。系统得到该中断号之后,就会找到该中断号对应的事件,并唤醒等待相应事件的线程(IST),然后IST就可以在用户态进行中断处理。处理完成之后,IST需要调用InterruptDone来告诉操作系统中断处理结束,操作系统再次调用OAL中的OEMInterruptDone函数,最后完成中断的处理。
在上面的描述中,驱动程序需要使用的是InterruptInitialize,WaitForSingleObject和InterruptDone三个函数,而BSP开发者需要主要考虑的是OEMInerrupteEnable,OEMInterruptHandler,OEMInterruptDone三个函数。当然,这是上面提到的一些函数,实际上BSP开发者在中断部分还需要考虑Init以及Disable等等函数,这里就不再讨论了。
第一次修改wince的驱动
    我们有个产品要求在客户关机的时候,取得控制权.叫客户输入密码才可以关机.开始以为很简单截获一下WM_QUERYENDSESSION或者PBT_APMQUERYSUSPEND消息就行了,但是一试不行,查了好久得出wince不支持这两个消息那只好自己想办法了.那就是在EINT0的复位按钮的驱动下手了.
默认pcienum.exe的结果输出到串口或者其它输出设备,可以更改代码让输出信息到本地。代码如下:
#include <stdio.h>
FILE  *stream;
DebugPrintf(PTCHAR pszFormat, ...)
{
    static  TCHAR  szString[256];
    static  UCHAR  szAnsiString[256];
    static  int    hConsole;
    va_list        args;
    va_start(args, pszFormat);
    wvsprintf(szString, pszFormat, args);
    ///OutputDebugString(szString);
    stream = _wfopen(L"\\windows\\pci.txt", L"a+");
    fseek(stream, 0L, SEEK_END);
    fputws(szString, stream);
    fclose(stream);
    va_end(args);
}

posted on 2010-05-31 10:23  xilentz  阅读(346)  评论(0编辑  收藏  举报