• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

WinCE中OEM适配层编程点滴之创建OAL

发布: 2008-2-03 10:26 | 作者: 付林林 | 来源: 天极网 | 查看: 35次 | 进入软件测试论坛讨论

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

  3. 中断注册步骤

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

  1) 用SETUP_INTERRUPT_MAP宏关联SYSINTR和IRQ。以“SYSINTR_”为前缀的常量由内核使用,用于唯一标识发生中断的硬件。在Nkintr.h文件中预定义了一些SYSINTR,OEM可以在Oalintr.h文件中自定义SYSINTR。

  2) 用HookInterrupt函数关联硬件中断号和ISR。这里的硬件中断号为物理中断号,而非逻辑中断号IRQ。在InitPICs函数(和上述ISR位于同一文件)的最后调用了HookInterrupt函数,如下:

for (i = 64; i < 80; i++)
 HookInterrupt(i, (void *)PeRPISR); ///用ISR关联16个中断号

  4. 中断处理步骤

  1) 调用InterruptInitialize函数关联SYSINTR和IST,具体是关联IST等待的事件。一般在驱动程序中按如下编写:

  hEvent = CreateEvent(...) ///创建一个事件对象
  InterruptInitialize(SYSINTR_SERIAL, hEvent, ...) ///关联一个串口中断ID和这个事件
  hThd = CreateThread(..., MyISTRoutine, hEvent, ...) ///创建一个线程(IST)
  CeSetThreadPriority(hThd, 152); ///提高此线程的优先级

  2) IST执行I/O操作,一般IST按如下编写:

  for(;;) ///驱动程序一直处于服务状态
  {
   WaitForSingleObject(hEvent, INFINITE); ////无限等待事件
   ...... //// I/O操作
   InterruptDone(InterruptId); ///结束当前中断处理
  }

  3) ISR和IST之间数据传输

  假如我们要从一个设备频繁的读取数据而每次读取量非常少,那么每次读取都要调用IST会降低性能。作为解决方案,ISR可以做读取工作(存放到缓冲区),并在缓冲区存放满后由IST到缓冲区读取。因为ISR运行在内核模式而IST运行在用户模式,IST不能轻易地访问ISR的缓冲区,为此CE提供了一个办法(参见标题为“Passing Data between an ISR and an IST”的帮助文档),您也可以到天极网嵌入式开发论坛询问。

  二、实现系统时钟

  1. 系统时钟(system tick)概念

  系统时钟是内核需要的唯一中断(IRQ0),系统时钟每毫秒产生一个中断,当发生中断时内核在ISR中累计,到1000的倍数就是过了一秒钟。在处理系统时钟的ISR中不仅要累计计数,还要决定是否通知内核开始重新调度当前所有的线程。要实现一个OAL,系统时钟是第一个必须做的事。

文章来源于领测软件测试网 https://www.ltesting.net/

32/3<123>

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网