WINCE 驱动中断机制

02:30:23

在WINCE的流驱动里面,要处理的中断一般是外部设备物理来的中断请求。

 

以arm体系结构为例:为(IRQ或FIQ),其中断机制完全算是由软件编程控制的。这是看bootloader时得出的结论。

 

Windows CE下的中断处理分为两个阶段,处于内核模式的中断服务例程(ISR,Interrupt Service Routine)和处于用户模式的中断服务线程(IST,Interrupt Service Thread)

发生的物理中断首先经过OAL层ISR转换为逻辑中断,在这他们是多对一的关系。ISR通常会向内核返回一个值,如果中断与已注册ISR相关联,将会返回一个SYSINTR_XXX,逻辑中断号,内核将重新开启处理器上除已识别的中断之外的所有中断。然后,内核将引发与SYSINTR_XXX值关联的事件。驱动程序中的IST将开始运行,驱动程序里面通过等待事件函数WaitForSingleObject(), 其原型如下:

DWORD WaitForSingleObject(
HANDLE hHandle, // 事件的句柄
DWORD dwMilliseconds // 超时的毫秒数,如果超过此参数的时间,函数也会返回。
);

WaitForSingleObject()函数会阻塞当前的线程,等待某个Event内核对象标识的事件发生。函数在两种情况下会返回:事件发生或者超过第二个参数指定的时间。在IST中,通常把第二个参数标识为INFINITE,表示在此事件上等待无穷长的时间。

 

然后在用户态执行相应的中断处理,最后调用InterruptDone()通知内核已完成对中断的处理。内核在接收到SYSINTR_XXX值的InterruptDone()时,将重新开启指定的中断。只有从这时开始,才能接收该设备的其它中断。至此,一次中断处理结束。

 

下面介绍ISR的具体实现:

其工作流程如下:

1. 调用PICGetCurrentInterrupt中获取当前硬件中断
2. 如果该中断是 INTR_TIMER0(系统计时器),更新CurMSec保持时间,检查并确认是否已经注册了重新启动地址RebootHandler
3. 如果中断是 INTR_RTC,ISR检查并确认闹钟是否已到期SYSINTR_RTC_ALARM。
4. 如果中断小于INTR_MAXIMUM调用中断链NKCallIntrChain,并将NKCallIntrChain的返回值设置为临时返回值。
5. 如果中断链未包含中断,则通过OEMTranslateIRQ映射当前硬件中断,并得到从OEMTranslateIRQ返回的SYINTR值。通常,如果在OEMInit函数中注册过该中断,则OEMTranslateIRQ会返回逻辑中断号,否则会返回SYSINTR_NOP。
6. 调用PICEnableInterrupt启用除当前中断以外的所有中断
7. 完成恰当的中断结束工作以通知PIC中断已完成

 

从第5步可以知道,要完成一个物理到逻辑中断的转换,有两种方法:

1.直接修改OAL层下面的OEM函数,增加相应的中断号相关的实现。

2.动态生成IISR注册进内核

 

 

IST的实现:

在IST开始时,通常我们可以用CeSetThreadPriority函数为IST线程设置合适的优先级。

接着IST需要做的是使用CreateEvent()函数创建一个Event内核对象,

然后使用InterruptInitialize()函数负责把某个逻辑中断号与一个Event内核对象关联起来,当中断发生时,操作系统会负责引发这个事件,函数的原形如下:
BOOL InterruptInitialize(
DWORD idInt, // SYSINTR中断号
HANDLE hEvent, // 与该中断相关联的事件句柄
LPVOID pvData, // 传给OEMInterruptEnable函数的缓冲区指针
DWORD cbData // 缓冲区的大小
);

然后,IST通常在前面创建的Event对象上使用WaitForSingleObject来等待。这样,当中断产生时WaitForSingleObject就会返回,IST可以对中断进行处理,例如对设备进行必要的I/O操作来得到外设中的数据。当中断处理结束之后,需要调用InterruptDone来完成本次中断处理。

 

中断的延迟:

1. ISR延迟时间
2. ISR执行时间
3. OS执行系统调用的时间
4. 调度IST时间

 

 

呵呵,终于还算搞完了,这是我的第一篇博客,虽然大多都是看书上来的。还请多多支持!

睡个好觉,晚安!! 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值