从以上代码不难看出ISR的任务就是返回以SYSINTR_为前缀的中断ID如果不需要进一步执行IST那么就返回SYSINTR_NOP 中断注册步骤 参考X平台的代码中断注册步骤如下 ) 用SETUP_INTERRUPT_MAP宏关联SYSINTR和IRQ以SYSINTR_为前缀的常量由内核使用用于唯一标识发生中断的硬件在Nkintrh文件中预定义了一些SYSINTROEM可以在Oalintrh文件中自定义SYSINTR ) 用HookInterrupt函数关联硬件中断号和ISR这里的硬件中断号为物理中断号而非逻辑中断号IRQ在InitPICs函数(和上述ISR位于同一文件)的最后调用了HookInterrupt函数如下 for (i = ; i < ; i++) HookInterrupt(i (void *)PeRPISR); ///用ISR关联个中断号 中断处理步骤 ) 调用InterruptInitialize函数关联SYSINTR和IST具体是关联IST等待的事件一般在驱动程序中按如下编写 hEvent = CreateEvent() ///创建一个事件对象 InterruptInitialize(SYSINTR_SERIAL hEvent ) ///关联一个串口中断ID和这个事件 hThd = CreateThread( MyISTRoutine hEvent ) ///创建一个线程(IST) CeSetThreadPriority(hThd ); ///提高此线程的优先级 ) 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的帮助文档)您也可以到天极网嵌入式开发论坛询问 二实现系统时钟 系统时钟(system tick)概念 系统时钟是内核需要的唯一中断(IRQ)系统时钟每毫秒产生一个中断当发生中断时内核在ISR中累计到的倍数就是过了一秒钟在处理系统时钟的ISR中不仅要累计计数还要决定是否通知内核开始重新调度当前所有的线程要实现一个OAL系统时钟是第一个必须做的事 [] [] [] |