none
Windows CE 5.0之IRQ和SysIntr???静态和动态 RRS feed

  • 问题

  • ????
    在OALIntrInit这个函数里会调用
    // Initialize interrupt mapping
    OALIntrMapInit();
    // Mask and clear interrupts in INTC
    OALIntrStaticTranslate(SYSINTR_USBH,IRQ_PHY_UHC);
    这两个函数。
    OALIntrMapInit();是微软的代码,做了irq2sysintr[]和sysintr2irq[]的初始化,初始化值都是未定义标志。
    OALIntrStaticTranslate也是微软的代码,这里应该是静态分配了usb host的sysintr值了。
    那么除了usb host外的中断是不是通过KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&Irq, sizeof(UINT32),&SysIntr, sizeof(UINT32), NULL))这样的方式得到Windows CE动态分配的SysIntr值呢?当然Irq是某个已知确定合法值。

    2008年11月28日 10:08

答案

  • http://topic.csdn.net/u/20080627/17/5EC7E28A-D4FC-4304-91FA-CE1419586A90.html

    找到如下一段话。

    调用这个函数KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR...) 系统会分配一个sysintr,并且将这个sysintr和irq联系起来,实际上就是放在两个数组里,一个数组的序号是irq,数组元素是sysintr,一个数组的序号是sysintr,元素是irq,这样系统就可以方便的找到irq和sysintr的对应关系了.这是所谓的动态映射,静态映射就是自己调用函数把irq和自己定义的sysintr添加到数组里. 这样在oal层处理中断的时候可以用一个循环语句来处理. 这些都是ce5.0采用的处理方式.ce4.2就没有这样的数组,所以中断处理的时候有大量的if else语句,或者 swicth case语句.
    2008年11月28日 10:12