none
关于WinCE5.0中断的疑惑 RRS feed

  • 问题

  • 我开始使用MIPS 的AU1250cpu移植WinCE5.0,也是第一次接触WinCE,在中断这里有点疑惑,就是当CPU产生硬件中断的时候,那么CPU会执行完当前指令后就会跳转到一个特定的地址去执行中断任务,我在BSP里面只有看到OEMInterruptInit,OEMInterruptEnable等中断相关函数,但是CPU真正跳到特定的地址去执行中断任务处理的代码怎么也找不到,是不是在WinCE内核里面,WinCE内核能够捕获CPU所有的中断吗,还是OEM层去捕获这些物理中断在交给Kernel层,这个问题困扰我好久了,书和资料都没找到相关说明
    2008年8月26日 9:26

答案

  • 这篇文章很久没看了,也忘得差不多了。

     

    问题1:我没有研究过"内核ISR",当产生中断的时候,从硬件上讲,这个中断会送给CPU,举个例子,比如ARM,有很多的ARM处理器,但是无论产生的是Uart中断还是其他的,最终都是一个IRQ中断送给ARM,然后ARM会处理IRQ中断,这部分工作应该是WinCE做的,因该就是"内核ISR"处理的,然后内核ISR会调用OEMInterruptHandler函数,这个函数是在OAL层中实现的,由用户自己实现的,你可以在这个函数里面读取你的CPU里面的中断标记位,看看产生了哪个中断,然后作处理。所以,应该说“内核ISR”能够捕获所有的中断,然后调用用户的OAL层中的OemInterruptHandler函数,用户在该函数中判断是哪个中断,然后进行处理。至于物理中断号,作用无非就是要和硬件中断对应,因该由用户在OAL中定义。看你程序怎么写了,不用也可以。

     

    上述是我的个人看法,至于后面的问题,太累了,不想说了。楼主能不能自己去看看PB的文档,结合代码理解啊,有助于个人能力的提高,什么问题都问也不太好吧。

    2008年8月28日 8:46

全部回复

  •  

    你可以在BSP中搜索armint.c,这个文件有OEMInterruptHandler()函数,相当于ISR,IST都是你自己写的,当然有固定的模式。
    2008年8月26日 15:20
  • 十分感谢以上两位老师的解答,我还是不是十分明白

    Microsoft Windows CE .NET 中的中断体系结构 说明如下
    WinCE的中断开始。生成了一个异常,导致内核 ISR 向量被加载到处理器中。内核 ISR 与硬件交互,禁用所有处理器上的所有具有相同和较低优先级的中断(ARM 和 Strong ARM 体系结构除外)。然后,内核推进到已为该特定中断注册的 OAL ISR去处理

    问题1:这个“内核ISR”是已经包含在内里面了,不是OEM层的代码,问题是不同的CPU中断是不一样的,比如UART中断  就有好几个中断来代表发生不同事,还I/O中断,有些CPU有10个外部中断,有些CPU只几个外部中断,还有缓存,TBL表,SPI口,AC97控制器,DMA等,那么“内核ISR”能完全捕获相应CPU所有的中断吗(当然是把这中断都打开了),如果能捕获的情况下就有个物理中断号的问题,这个物理中断号代表了是那个中断发生了,那么这个物理中断号是谁分配的,内核?OEM层?定义在那个地方?某个物理中断号对于某个中断的问题?


    Microsoft Windows CE .NET 中的中断体系结构 说明如下
    活动从该图最左侧部分以直线表示的中断开始。生成了一个异常,导致内核 ISR 向量被加载到处理器中。内核 ISR 与硬件交互,禁用所有处理器上的所有具有相同和较低优先级的中断(ARM 和 Strong ARM 体系结构除外)。然后,内核推进到已为该特定中断注册的 OAL ISR。此后,OAL ISR 既可以直接处理中断,也可以使用 NKCallIntChain 遍历已安装的 ISR 列表。主 ISR 或任何已安装的 ISR 随后执行任意工作,并且为该设备返回名为 SYSINTR 的映射中断。如果该 ISR 确定其相关设备没有导致该中断,该 ISR 将返回 SYSINTR_CHAIN,这会使 NKCallIntChain( ) 遍历 ISR 列表以到达链中的下一个中断。ISR 按照它们的安装顺序调用(它们在安装时会在调用列表上创建一个优先级)。

    问题2:特定中断注册的 OAL ISR 这个ISR是在OEMInterruptInit中注册的吗,还是一定义个OEMInterruptHandler函数名的中断函数供内核调用,主 ISR怎么理解啊
     问题3:HookInterrupt函数用于关联硬件中断号和ISR,请问下硬件中断号怎么得来的,这个函数是用于可安装OAL ISR的吗

    呵呵,菜鸟问的低级问题,还请大师们能够指点一下
    2008年8月28日 3:35
  • 这篇文章很久没看了,也忘得差不多了。

     

    问题1:我没有研究过"内核ISR",当产生中断的时候,从硬件上讲,这个中断会送给CPU,举个例子,比如ARM,有很多的ARM处理器,但是无论产生的是Uart中断还是其他的,最终都是一个IRQ中断送给ARM,然后ARM会处理IRQ中断,这部分工作应该是WinCE做的,因该就是"内核ISR"处理的,然后内核ISR会调用OEMInterruptHandler函数,这个函数是在OAL层中实现的,由用户自己实现的,你可以在这个函数里面读取你的CPU里面的中断标记位,看看产生了哪个中断,然后作处理。所以,应该说“内核ISR”能够捕获所有的中断,然后调用用户的OAL层中的OemInterruptHandler函数,用户在该函数中判断是哪个中断,然后进行处理。至于物理中断号,作用无非就是要和硬件中断对应,因该由用户在OAL中定义。看你程序怎么写了,不用也可以。

     

    上述是我的个人看法,至于后面的问题,太累了,不想说了。楼主能不能自己去看看PB的文档,结合代码理解啊,有助于个人能力的提高,什么问题都问也不太好吧。

    2008年8月28日 8:46
  • 十分感谢WinCE_Studying热心的解答,我基本明白了,其它问题我多看下PB的文档,刚开始学CE,不知从何入手,呵呵!
    2008年8月29日 3:21
  • 哈哈,理论的可以从何宗健老师的那本书开始,实践的可以从周立功的2410开始(有很多例子,网上有源文件)。

    2008年8月29日 23:51
  • 哦?MIPS架构,还是读研究生的时候接触过的。好久没玩了,差不多忘光了。

     

    第一、内核ISR是操作系统内核的代码,不在OEM层里。所有的中断,操作系统都抓得到。在Windows CE里面,内核代码为四种不同架构的CPU写了四份抓中断的代码,如果楼主熟悉mips,可以看一下PB的\PRIVATE\WINCEOS\COREOS\NK\KERNEL\MIPS目录下的except.s文件。抓到中断之后,再调用OEM的代码,判断到底是哪个中断,例如是AC97还是串口。

     

    第二、说实话这段中文翻译的真是不咋地。我觉得这段话是在讲Installable ISR。就是可安装的ISR,在x86架构上用的多,ARM架构基本上用不到。

     

    第三,HookInterrupt这个函数不是对所有处理器都有用的。ARM就没有,对于MIPS架构,我已经记不清CPU中断处理流程了。不过这个函数的实现,你可以在PRIVATE\WINCEOS\COREOS\NK\KERNEL\MIPS\mdsched.c文件中找到,再配合前面的except.s,就可以知道它到底在干吗了。

     

     

    2008年8月31日 16:08
    版主
  • 呵呵,十分 感谢“何宗键”及上面几位老师的解答,通过几位老师的解答我基本上对CE的中断有了个初步的认识,我先在开发板上调试下,加深下认识,希望以上信息也能给我一样的菜鸟一些提示 ,呵呵
    2008年9月5日 2:27
  • 另外PB的\PRIVATE\WINCEOS\COREOS\NK\KERNEL\MIPS目录下好像没有的except.s文件,只有个Mdsched.c文件,我是CE5.0
    2008年9月5日 2:35
  • 在Mdsched.c文件里有HandleException和ExceptionDispatch这两个函数,应该是这个来处理,呵呵,请指正,谢谢!
    2008年9月5日 2:42