240 likes | 376 Views
中断处理. Windows CE 中断的基本概念 中断架构 中断处理过程 中断服务例程 ISR 中断服务线程 IST 中断延迟及实时性. Windows CE 中断的基本概念. 大多数的外部设备会产生中断来请求操作系统的服务。一般情况下,外部设备并不占用 CPU ,只有当外设工作时,才会通过中断来打断 CPU 的当前执行,请求 CPU 处理外部设备的数据。 因为外设会产生中断,所以外设相对应得驱动程序就要处理这些中断。 物理中断请求 (Interrupt ReQuest,IRQ) :是外部设备通过 CPU 的中断引脚向 CPU 发送的中断信号。
E N D
中断处理 • Windows CE中断的基本概念 • 中断架构 • 中断处理过程 • 中断服务例程ISR • 中断服务线程IST • 中断延迟及实时性
Windows CE中断的基本概念 • 大多数的外部设备会产生中断来请求操作系统的服务。一般情况下,外部设备并不占用CPU,只有当外设工作时,才会通过中断来打断CPU的当前执行,请求CPU处理外部设备的数据。 • 因为外设会产生中断,所以外设相对应得驱动程序就要处理这些中断。 • 物理中断请求(Interrupt ReQuest,IRQ):是外部设备通过CPU的中断引脚向CPU发送的中断信号。 • 逻辑中断SYSINTR:对物理中断的抽象(ISR) 例如:不同开发板上的键盘产生的IRQSYSINTR_KEYBOARD
中断架构 • 中断只是异常处理的一部分 • 在内核代码中被获取 • 在恢复到用户态之间进行处理 • 但是硬件是独立于操作系统的 • CE使用二阶段中断服务模式 • 少量的代码进行中断的记录 • 调度中断服务程序代码进行处理 • 操作系统提供API来使能IRQ信号,设置中断的优先级,等等。 • 与硬件有关的操作在OAL,以及设备驱动代码中进行。
中断处理过程 • Windows CE的一次中断处理起始于硬件中断产生,终止于IST调用InterruptDone()函数。 • 体系结构 • 硬件和中断控制器的状态 • OAL层,OEM厂商应该实现的部分 • 内核,微软提供的部分 • 可安装的ISR与用户态驱动程序(IST)
SYSINTR_CHAIN IISR1 IISR2 IISRn 异常处函数 SYSINTR_xx SYSINTR_NOP ISR NKCallIntChain(IRQ) ISR 更高优先级的中断 关中断 中断处理过程 驱动 IST IISR 内核 设置事件 SYSINTR_ID OAL ISR 硬件 被屏蔽的IRQ
中断处理过程 • ISR可能的返回值 • SYSINTR_NOP 中断不与设备的任何已注册 ISR 关联。内核启用所有其他中断。 • SYSINTR_XXX(逻辑中断号) 中断与已知的已注册 ISR 和设备关联。 • SYSINTR_RESCHED 中断是由请求 OS 重新调度的计时器到期引起的。 • SYSINTR_RTC_ALARM 闹钟已到期
中断服务例程ISR • The ISR is the core of the OAL and is responsible for locating an interrupt source, masking it, and returning a unique identifier to the Windows CE kernel to indicate which driver needs to be used to handle the event. ——MSDN • ISR检查中断并决定如何处理该中断。 • 如果中断需要被内核和IST进一步处理,那么ISR会返回一个逻辑的中断号SYSINTR_XXX; • 如果该中断不需要进一步的处理,那么ISR只需返回SYSINTR_NOP给内核。
中断服务例程ISR • 从Windows CE 3.0开始,引入了可嵌套的中断。进入ISR时,所有具有较高优先级别中断都已被打开,因此,ISR可能被抢占。 • 从Windows CE 4.0开始,引入了IISR(Installabel Interrupt Service Routine),应用程序开发商可以安装自己的ISR处理外设的中断。 • 有了IISR,多个设备可共享同一个硬件IRQ • 安装ISR到平台的两个步骤: • 调用LoadIntChainHandler()函数以加载包含ISR代码的DLL • 该ISR须把IRQ转化为某个SYSINTR_XXX并返回。
中断服务例程ISR • IISR的特性: • DLL 代码,在运行时进行绑定 • 一般用C编写 • 有一些限制 • 不能调用CRT, Windows API, 或其它的DLL • 支持硬件共IRQ共享 • 从同一个IRQ关联的不同SYSINTR ID
中断服务例程ISR • 创建可安装的 ISR 的基本外壳程序 • DLLEntry — 接收进程和线程附加消息 • InfoCopy — 在进行任何结构赋值时使用的复制例程 • IOControl — 任何使用 KernelLibIOControl 的 IST 调用的处理程序 • ISRHandler — 实际的 ISR
中断服务线程IST • The interrupt service thread (IST) is a thread that does most of the interrupt processing. The OS wakes the IST when the OS has an interrupt to process. ——MSDN • IST线程大多数时候是空闲的,只有操作系统通知IST有中断发生时,IST才开始工作。 • 这是通过把一个逻辑中断号与一个Win32的同步对象事件相关联实现的。当中断发生时候,操作系统会引发与该逻辑中断相关联的事件。
中断服务线程IST • 是内置设备的驱动程序的作户态线程 • 进行实际的中断处理 • 调用CreateEvent 创建一个与逻辑中断相关联的事件对象 • IST在大多数时间里都是处于空闲状态,以内核用信号通知事件对象时被唤醒 • IST通常运行的优先级高于普通优先级,其优先级由 CeSetThreadPriority函数设定
中断服务线程IST • 初始化中断的关键步骤包括: • 创建事件 • 获取 IRQ的系统中断号 • 创建挂起的中断线程 (IST) • 调用 InterruptInitialize 以创建 IRQ 与事件之间的关联 • 创建未挂起的 IST 可能会导致 InterruptInitialize 失败 • 因为该事件已经处于被等待状态 • 将线程优先级设置为相应的优先级 • 恢复 IST
中断服务线程IST • InterruptInitialize • 负责把某个逻辑中断号与一个Event内核对象关联起来 • BOOL InterruptInitialize ( DWORD idInt, //SYSINTR中断号 HANDLE hEvent, //与该中断相关联的事件句柄 LPVOID pvData,//传给OEMInterruptEnable函数的缓冲区指针 DWORD cbData //缓冲区的大小 );
中断服务线程IST • WaitForSingleObject • 阻塞当前的线程,等待某个Event内核对象标识的事件发生。 • 这一调用通常放在一个循环中,以使和中断处理时,IST可以回到这一个调用等待下一个要处理的中断 • DWORD WINAPI WaitForSingleObject ( HANDLE hHandle, //事件的句柄 DWORD dwMilliseconds //超时的ms数,如果超过此参数设定的时间,那么函数也会返回 );
中断服务线程IST • InterruptDone • 用来告诉操作系统,对该中断的处理已完成,操作系统可重新开启该中断。 • 中断数据处理完以后,IST必须调用 InterruptDone函数使内核使能与这一个线程相关的中断 • VOID InterruptDone ( DWORD idInt //SYSINTR逻辑中断号 );
中断服务线程IST • 处理来自应用程序或驱动程序的中断需要进行两个步骤的处理。 • 首先,必须使用关联的事件初始化中断。 • 其次,IST 必须等待中断事件以响应内核中的中断。
典型的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);
设置一个会导致IST退出的标志 典型的IST结束 // set abort flag to true to let thread know // that it should exit g_KeypadISTData.abort =TRUE; //disconnect event from logical ID //this 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);
中断延迟及实时性 • 对中断处理的效率是衡量一个嵌入式操作系统实时性优劣的重要指标。 • 在Windows CE的中断处理中,主要存在两类延迟:ISR延迟和IST延迟。
中断延迟及实时性 • ISR 延迟 • 定义为从发生中断到 OAL ISR 首次执行之间的时间。 • 因为当中断被关闭时,中断不会在处理器中引发异常,所以第一个导致延迟的因素是系统中的中断被关闭的总时间。 • CPU在每个机器指令开始执行时都将检查是否有处理器中断。如果调用了长字符串移动指令,则会锁定中断,从而造成第二个延迟源,即总线访问锁定处理器的时间量。 • 第三个因素是内核导向 OAL ISR 处理程序所花费的时间量。这是一个进程上下文切换。
中断延迟及实时性 • 总之,导致 ISR 延迟的因素包括: • 中断被关闭的时间。 • 总线指令锁定处理器的时间。 • 内核 ISR 的执行时间加上导向 OAL ISR 的时间。
中断延迟及实时性 • IST 延迟 • IST 延迟是从中断发生到执行 IST 中的第一行代码之间的时间量。 • Microsoft 工具将 IST 延迟定义为从 OAL ISR 执行结束到 IST 开始之间的时间。
中断延迟及实时性 • 导致 IST 延迟 • 第一个因素是本文前面定义的 ISR 延迟。 • 第二个因素是 ISR 执行时间。根据共享中断调用链的长度的不同,此时间是可变的。对于延迟较小的情况,没有必要对永远不会被共享的中断调用 NKCallIntChain。 • Windows CE 中的内核函数(如计划程序)被称为 KCALL。在这些 KCALL 执行期间,将设置一个软件标志,以便让计划程序知道它此时不能被中断。仍然将调用 ISR,但用于重新调度 OS 或调度 IST 的返回值将被延迟,直至 KCALL 完成为止。这一不可占先的时间是导致 IST 延迟的第三个因素。 • 最后,内核必须调度 IST。这一上下文切换是导致延迟的最后一个因素。