您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:26 来源:vckbase.com

本文章共3477字,分3页,当前第1页,快速翻页:
 

OAL点点滴滴(二)

作者:付林林

  正如CE的帮助文档所言,创建OAL是一个非常复杂的任务,而通常的办法是复制原有的相同平台的OAL代码,然后修改来适应平台的特殊要求。也就是说对于没有特殊要求的平台,复制原有相同平台的OAL代码就足够了。由于OAL的复杂性在这篇文章中我只讲解常用的部分。
逆风者

一、实现ISR

1.ISR的概念

  ISR(interrupt service routine)是处理IRQs(interrupt request line)的程序。Windows CE用一个ISR来处理所有的IRQ请求。当一个中断发生时,内核的异常处理程序先调用内核ISR,内核ISR禁用所有具有相同优先级和较低优先级的中断,然后调用已经注册的OAL ISR程序,一般ISR有下列特征:

  • 执行最小的中断处理,最小的中断处理指能够检验、答复产生中断的硬件,而把更多的处理工作留给IST(interrupt service thread)。
  • 当ISR完成时返回中断ID(中断ID大部分是预定义的)。

2. X86平台的ISR结构

  X86平台的ISR保存在%_WINCEROOT%\PUBLIC\COMMON\OAK\CSP\I486\OAL\fwpc.c中,函数名为PeRPISR。下面分析一下此函数的主要代码:

ULONG PeRPISR(void)

{

  ULONG ulRet = SYSINTR_NOP; ///返回值,既中断ID(以SYSINTR_为前缀)

  UCHAR ucCurrentInterrupt; ///当前中断号



  if (fIntrTime) ////// fIntrTime 用于测试SR和IST的延时时间,测试工具为ILTiming.exe。

    ......

  ucCurrentInterrupt = PICGetCurrentInterrupt(); ////返回当前中断IRQ



  ///IRQ0,IRQ0为系统时钟(system tick)中断,具体见“二、实现系统时钟”

  if (ucCurrentInterrupt == INTR_TIMER0) 

  ......



  if (dwRebootAddress) ////是否需要重启动

  RebootHandler(); 

  ......



  if(ucCurrentInterrupt == INTR_RTC) ////IRQ8,real-time clock的中断

  ......

  else if (ucCurrentInterrupt <= INTR_MAXIMUM) ///如果中断小于 INTR_MAXIMUM

  {

    ulRet = NKCallIntChain(ucCurrentInterrupt); ////调用中断链



    if (ulRet == SYSINTR_CHAIN) ///如果中断链未包含中断



      ////在IRQ 和SYSINTR之间转换,此函数返回IRQ对应的SYSINTR

      ulRet = OEMTranslateIrq(ucCurrentInterrupt); 

    ......



    PICEnableInterrupt(ucCurrentInterrupt, FALSE); ///启用除当前中断以外的所有中断

  } ///else if

  OEMIndicateIntSource(ulRet); ///通知内核已经发生SYSINTR中断

}

  从以上代码不难看出ISR的任务就是返回以“SYSINTR_”为前缀的中断ID,如果不需要进一步执行IST,那么就返回SYSINTR_NOP。

3.中断注册步骤

参考X86平台的代码,中断注册步骤如下:
 

  • 用SETUP_INTERRUPT_MAP宏关联SYSINTR和IRQ。以“SYSINTR_”为前缀的常量由内核使用,用于唯一标识发生中断的硬件。在Nkintr.h文件中预定义了一些SYSINTR,OEM可以在Oalintr.h文件中自定义SYSINTR。
  • 用HookInterrupt函数关联硬件中断号和ISR。这里的硬件中断号为物理中断号,而非逻辑中断号IRQ。在InitPICs函数(和上述ISR位于同一文件)的最后调用了HookInterrupt函数,如下:
            for (i = 64; i < 80; i  )
    HookInterrupt(i, (void *)PeRPISR); ///用ISR关联16个中断号

4. 中断处理步骤

  • 调用InterruptInitialize函数关联SYSINTR和IST,具体是关联IST等待的事件。一般在驱动程序中按如下编写:
     
    本文章更多内容1 - 2 - 3 - 下一页>>
相关文章

WTL字体类
介绍一个控制并行端口的MFC类
.NET Remoting与分布式应用开发——初识 Re
浅析三线程程序开发思路与实现
带光圈文字输出的实现
WinCE4.2 下轻松调用 Windows Media Player
C 类对象的拷贝构造函数
VC Oracle 开发入门
MFC Activex 录音机控件
VC.NET简单实现GIF动画
如何获取网页中的密码和文本输入框的内容
深入 CSocket 编程之阻塞和非阻塞模式
如何获取其它进程中窗口的窗口过程
OAL点点滴滴(一)
精通VC与MATLAB联合编程<十>——综合举例二
如何播放 WAV 文件?
一个原创的仪表控件
WHO AM I?看定自己的耕垦区域
使用MFC的数组类
乱砍设计模式之零

相关评论


本文章所属分类:首页 VC++

  热门关键字: