WEB开发网
开发学院软件开发VC OAL点点滴滴(二) 阅读

OAL点点滴滴(二)

 2007-03-18 21:26:03 来源:WEB开发网   
核心提示: 3.中断注册步骤参考X86平台的代码,中断注册步骤如下:用SETUP_INTERRUPT_MAP宏关联SYSINTR和IRQ,OAL点点滴滴(二)(2),以“SYSINTR_”为前缀的常量由内核使用,用于唯一标识发生中断的硬件,IST不能轻易地访问ISR的缓冲区,为

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等待的事件。一般在驱动程序中按如下编写:

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

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

ISR和IST之间数据传输

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

Tags:OAL 点点滴滴

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接