WinCE之旅——驱动编程学习笔记3

来源:互联网 发布:织梦gbk和utf 8 编辑:程序博客网 时间:2024/05/18 02:30

       今天背毛邓了,头有点肿,呵呵。最令我气愤的是,当我背到第三题时,竟然把第一题忘了,这还怎么背?无语了,怎么记忆越来越差!不能怪中国的教育,只怪自己不是那块料!!伤心事不提也罢,继续WinCE吧!

       中断架构:  中断只是异常处理的一部分
                                1.在内核代码中被获取
                                2.在恢复到用户态之间进行处理
                                3.但是硬件是独立于操作系统的
                        CE使用二阶段中断服务模式
                                1.少量的代码进行中断的记录
                                2.调度中断服务程序代码进行处理
                        操作系统提供API来使能IRQ信号,设置中断的优先级,等等。
                        与硬件有关的操作在OAL,以及设备驱动代码中进行。


                        IST是老的用户模式代码
                                 1.有完整的CE .NET API与CRT库
                                 2.CE .NET调度程序根据线程的优先级控制IST的执行
                                 3.运行态绑定到SYSINTR
                         从异常处理函数调用ISR
                                 1.没有操作系统服务
                                 2.堆栈空间大小有限
                                 3.可设置为可重入的 (在OAL进行设置)
                                 4.MIPS, SHx汇编语言

 

                          IRQ 优先级的设定依赖于不同CPU的系统架构
                                 1.在x86上由PIC硬件进行设置
                                 2.在MIPS上用OAL的IntrPriority, IntrMask 进行设置
                          通过让IST进程推断ISR服务,OAL能够增加实时性。
                          在CE 3.0中,所有的ISR代码都是OAL的一部分
                                 1.没有特殊的扩展
                                 2.IRQ绑定到OEMInit的事件ID
                                 3.没有支持PNP, 共享IRQ  (PCI总线)
                          CE .NET 通过IRS(IISR)链解决了这些限制。
              

                  CE .NET 可安装ISR
                          CE 3.0 ISR 架构的首选扩展
                          DLL 代码,在运行时进行绑定
                          源代码可以是独立于CPU的
                                 1.一般用C编写
                                 2.有一些限制(不能调用CRT, Windows API, 或其它的DLL)
                           不可推断的ISR,或 IST发布
                           支持硬件共IRQ共享(从同一个IRQ关联的不同SYSINTR ID)

                   中断服务线程:
                           是内置设备的驱动程序的作户态线程
                           进行实际的中断处理
                           调用CreateEvent 创建一个与逻辑中断相关联的事件对象
                           IST在大多数时间里都是处于空闲状态,以内核用信号通知事件对象时被唤醒
                           IST通常运行的优先级高于普通优先级,其优先级由 CeSetThreadPriority函数设定

                           InterruptInitialize(调用InterruptInitialize将事件与ISR的中断标识符关联起来)
                           WaitForSingleObject(用来等待一个用信号通知的事件,这一调用通常放在一个循环中,以使和中断处理时,IST可

                                                              以回到这一个调用等待下一个要处理的中断)
                           InterruptDone(中断数据处理完以后,IST必须调用 InterruptDone函数使内核使能与这一个线程相关的中断)

              典型的IST启动:

struct ISTData     // Declare the Strucure to pass to the IST
{
   HANDLE hThread; // IST Handle
   DWORD sysIntr;  // Logical ID
   HANDLE hEvent;  // handle to the event to wait for interrupt
   volatile BOOL abort;     // flag to test to exit the IST
};

ISTData g_KeypadISTData;
// Create event to link to IST
g_KeypadISTData.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// Translate IRQ to an logical ID (x86 CEPC)
g_KeypadISTData.sysIntr =Mapirq2Sysintr(5);
// start the thread
g_KeypadISTData.hThread = CreateThread(NULL,0,&KeypadIST,&g_KeypadISTData, 0, NULL);

//Change the threads priority
CeSetThreadPriority(g_KeypadISTData.hThread,0);

//disconnect any previous event from logical ID
InterruptDisable(g_KeypadISTData.sysIntr);

// Connect Logical ID with Event
InterruptInitialize(g_KeypadISTData.sysIntr, g_KeypadISTData.hEvent,NULL,0);

 

    步骤: 1.设置IST的优先级

              2.与以前的事件断开

              3.与ISR关联

                   

                   典型的IST结束:

DWORD KeypadIST(void *dat)

   ISTData* pData= (ISTData*)dat;
   // loop until told to stop
   While(!pData->abort)
   {   // wait for the interrupt event...
       WaitForSingleObject(pData->hEvent, INFINITE)
       if(pData->abort)
         break;
           // Handle the interrupt...
       // Let OS know the interrupt processing is done
       InterruptDone(pData->sysIntr);
   }
   Return 0;
}
// set abort flag to true to let thread know that it should exit
g_KeypadISTData.abort =TRUE;

//disconnect event from logical IDthis internally sets g_KeypadISTData.sysIntr which in turn
//sets g_KeypadISTData.hEvent through the kernel
InterruptDisable(g_KeypadISTData.sysIntr);

//wait for thread to exit
WaitForSingleObject(g_KeypadISTData.hEvent,INFINITE);

CloseHandle(g_KeypadISTData.hEvent);
CloseHandle(g_KeypadISTData.hThread);
        主要是设置一个会导致IST退出的标志!

 

    今天就先到这吧,我要背毛邓!!春哥,保佑我!