IST:
IST (Interrupt service thread), 中断服务线程。
在 ARM 的结构中,ISR 一般不会用来进行任何实际的操作,而只是返回一个 SYSINTR,
实际的操作全部在IST中完成,IST一般是在Device Manager 的一个线程中运行的一段
高优先级的应用程序代码,用来服务实际的中断请求。
SYSINTR:
在 WinCE中,SYSINTR 就是 system interrupt,就是一个操作系统的逻辑中断。
一般对于中断的处理方式都是将一个IRQ映射为一个或者多个(中断共享)SYSINTR,而后,
在实际的ISR中根据IRQ返回一个对应的SYSINTR用来告诉操作系统需要服务的逻辑对
象。
c) 上一步在GIISR中通过CreateInstance把这个新的中断处理程序加入GIISR自
己的管理。GIISR 的主要作用就是判断当中断来的时候,是不是其内部数组中的某
个成员需要服务中断。所以需要更多的信息用来判断中断是否匹配当前的中断服务
程序,所以我们需要把信息传递进去,这里就是调用KernelLibIoControl。
具体的方法为:
KernelLibIoControl(hIsrHandler,IOCTL_GIISR_INFO,&giisr_info,
sizeof(GIISR_INFO), NULL, 0, NULL);
这里就是把 giisr_info 的内容传递给刚才注册的中断,giisr_info 是一个
GIISR_INFO的结构体,其内容如下:
typedef struct _GIISR_INFO {
DWORD SysIntr; // SYSINTR for ISR handler to return
(if associated device is asserting IRQ)
BOOL CheckPort; // If true, check port to see if device is
asserting IRQ
BOOL PortIsIO; // Port is IO port (possibly true only for
x86)
BOOL UseMaskReg; // If true, read from MaskAddr to
obtain mask
DWORD PortAddr; // Port Address
DWORD PortSize; // Port data width in bytes
DWORD Mask; // Mask to use on data port to
determine if device is asserting IRQ
DWORD MaskAddr; // Address of register to use as
mask
} GIISR_INFO, *PGIISR_INFO;
重新看图 1。这里画出了从硬件中断发生,到 IST 运行的全部过程,中间就是
我们要研究的延时部分。
图中的”IST 延迟”标志,实际上就是我们所说的中断延时。但是将 IST 延时细
分,可以分为如下几部分延时:
a) ISR 延时
这部分延时是指从硬件触发中断到进入OEM的 ISR程序的时间,在 ARM 体系
下,就是进入OEMInterruptHandler 的时间。
b) ISR 执行时间
在 OEMInterruptHandler 中判断 IRQ,并且返回相应的 SYSINTR 的时间,
也是OEM最主要把握的时间。
c) 从ISR 返回到 IST运行的时间
主要就是系统根据ISR 返回的SYSINTR激活相应的Event,系统调度运行,
到 IST执行的这段时间
参考文献:
1. Microsoft WindowsCE .NET 中的中断体系结构 , Nat Frampton
2. Platform Builder for Microsoft WindowsCE 5.0 Help, Microsoft
3. Microsoft Windows Embedded CE 5.0 source code, Microsoft