3710|9

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

新手请教关于WINCE5.0中断的问题 [复制链接]

这两天照着ZLG的2410的WINCE中断按键驱动源码,在自己的2440开发板上也搞鼓成功了,但是有如下的问题不甚了解,盼各位高手指导一下:

1,WINCE中断的具体流程,也就是从中断触发,到中断处理结束,依次调用了那些函数(OAL、BSP、OEM)?

2,物理中断和wince的逻辑中断的映射表在什么地方定义的?

谢谢了!:)
此帖出自WindowsCE论坛

最新回复

呵呵,谢谢GUOPEIXIN这么热心:D, 在各位的指导下,今天上午仔细看了OAL的一些源码, 在头文件nkintr.h中: #define SYSINTR_UNDEFINED  (-1) // SysIntr not defined for IRQ SYSINTR mapping #define SYSINTR_NOP         0   /* no processing required */ #define SYSINTR_RESCHED     1   /* set "reschedule flag" */ #define SYSINTR_BREAK       2   /* break into debugger */ #define SYSINTR_CHAIN       3   /* continue to next handler */ // SYSINTR_DEVICES is the base for any non-OAL system interrupts #define SYSINTR_DEVICES     8 #define SYSINTR_PROFILE             (SYSINTR_DEVICES+1)     // System Profiling #define SYSINTR_TIMING              (SYSINTR_DEVICES+2)     // Latency Analysis #define SYSINTR_RTC_ALARM           (SYSINTR_DEVICES+5)            // real-time clock alarm #define SYSINTR_NETWORK_SHARED      (SYSINTR_DEVICES+6)     // Combined interrupts for network #define SYSINTR_VMINI               (SYSINTR_DEVICES+7)     // VMini RX interrupt. // SYSINTR_FIRMWARE is the base for any interrupts defined in the OAL #define SYSINTR_FIRMWARE    (SYSINTR_DEVICES+8) #define SYSINTR_MAX_DEVICES 64 #define SYSINTR_MAXIMUM     (SYSINTR_DEVICES+SYSINTR_MAX_DEVICES) 红色这句就是定义了在OAL中的中断起始逻辑终端号,而在MAP.C文件中: //  Function:  OALIntrRequestSysIntr // //  This function allocate new SYSINTR for given IRQ and it there isn't //  static mapping for this IRQ it will create it. // UINT32 OALIntrRequestSysIntr(UINT32 count, const UINT32 *pIrqs, UINT32 flags) {     UINT32 irq, sysIntr;     OALMSG(OAL_INTR&&OAL_FUNC, (         L"+OALIntrRequestSysIntr(%d, 0x%08x, 0x%08x)\r\n", count, pIrqs, flags     ));         // Valid IRQ?     if (count != 1 || pIrqs[0] >= OAL_INTR_IRQ_MAXIMUM) {         sysIntr = SYSINTR_UNDEFINED;                     goto cleanUp;     }     irq = pIrqs[0];     // If there is mapping for given irq check for special cases     if (g_oalIrq2SysIntr[irq] != SYSINTR_UNDEFINED) {         // If static mapping is requested we fail         if ((flags & OAL_INTR_STATIC) != 0) {             OALMSG(OAL_ERROR, (L"ERROR: OALIntrRequestSysIntr: "                L"Static mapping for IRQ %d already assigned\r\n", irq             ));             sysIntr = SYSINTR_UNDEFINED;                         goto cleanUp;         }         // If we should translate, return existing SYSINTR         if ((flags & OAL_INTR_TRANSLATE) != 0) {             sysIntr = g_oalIrq2SysIntr[irq];             goto cleanUp;         }     }     // Find next available SYSINTR value...     for (sysIntr = SYSINTR_FIRMWARE; sysIntr < SYSINTR_MAXIMUM; sysIntr++) {         if (g_oalSysIntr2Irq[sysIntr] == OAL_INTR_IRQ_UNDEFINED) break;    }         // Any available SYSINTRs left?     if (sysIntr >= SYSINTR_MAXIMUM) {         OALMSG(OAL_ERROR, (L"ERROR: OALIntrRequestSysIntr: "             L"No avaiable SYSINTR found\r\n"         ));                     sysIntr = SYSINTR_UNDEFINED;         goto cleanUp;     }         // Make SYSINTR -> IRQ association.     g_oalSysIntr2Irq[sysIntr] = irq;         // Make IRQ -> SYSINTR association if required     if ((flags & OAL_INTR_DYNAMIC) != 0) goto cleanUp;     if (         g_oalIrq2SysIntr[irq] == SYSINTR_UNDEFINED ||         (flags & OAL_INTR_FORCE_STATIC) != 0     ) {         g_oalIrq2SysIntr[irq] = sysIntr;     } cleanUp:     OALMSG(OAL_INTR&&OAL_FUNC, (         L"-OALIntrRequestSysIntr(sysIntr = %d)\r\n", sysIntr     ));     return sysIntr; } 这个函数就是为物理中断指派相应的逻辑中断号,而红色那句就是指派一个空的逻辑中断号! 呵呵,谢谢大家的热心帮助,结贴啦:D  详情 回复 发表于 2009-11-26 11:47
点赞 关注
 

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
借花献佛
第一个问题:
参照
http://blog.eeworld.net/chenyt2007/archive/2008/04/16/2297481.aspx
第二个问题:
5.0及以后的版本要分动态和静态映射的

沙发,哈哈
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
1、申请系统中断号:KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(UINT32), &m_dwSysintrEINT12, sizeof(UINT32), NULL)
2、创建事件:g_keyevtSignal =CreateEvent(NULL, FALSE, FALSE, NULL);
3、将事件与系统中断关联:InterruptInitialize(m_dwSysintrEINT12, g_keyevtSignal, NULL, 0))
4、创建中断线程:CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,        (LPTHREAD_START_ROUTINE)InterruptThreadKey,0,0,        NULL);
5、线程中等待中断事件:WaitForSingleObject(g_keyevtSignal, INFINITE);


KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR会调用OAL中的OALIoCtlHalRequestSysIntr
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
wince500\PLATFORM\COMMON\SRC\COMMON\INTR
/*硬件IRQ与系统中断号sysyintr是一对一的,是用如下两张表记录对应关系,*/
static UINT32 g_oalSysIntr2Irq[SYSINTR_MAXIMUM];
static UINT32 g_oalIrq2SysIntr[OAL_INTR_IRQ_MAXIMUM];
主要是map.c里面,有静态及动态的映射
此帖出自WindowsCE论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 veabol 的回复:
1、申请系统中断号:KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(UINT32), &m_dwSysintrEINT12, sizeof(UINT32), NULL)
2、创建事件:g_keyevtSignal =CreateEvent(NULL, FALSE, FALSE, NULL);
3、将事件与系统中断关联:InterruptInitialize(m_dwSysintrEINT12, g_keyevtSignal, NULL, 0))
4、创建中断线程:CreateThread((LPSECURITY_ATTRIBUTES)NULL,0, (LPTHREAD_START_ROUTINE)InterruptThreadKey,0,0, NULL);
5、线程中等待中断事件:WaitForSingleObject(g_keyevtSignal, INFINITE);


KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR会调用OAL中的OALIoCtlHalRequestSysIntr


比较详细。

楼主请看我的博客收藏http://so.eeworld.net/BlogSearchResult.aspx?q=%E4%B8%AD%E6%96%AD%20username:gooogleman
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
呵呵,谢谢各位热心的回复,我还有一个小小的疑问,就是WINCE中的中断静态映射和静态映射的区别。

是否静态映射表示物理中断和逻辑中断是一一对应的,比如 物理5号中断对应逻辑5号中断?

而动态映射的话是使用时动态申请,比如 物理5号中断可以对应5号逻辑中断,也可以对应6号中断,关键看申
请到的逻辑中断序号?



此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
其实无论动态映射和静态映射,逻辑与物理中断号都是一一对应的,你可以参照common csp里面的代码分析一下
静态映射是以前版本的ce遗留下来的一种映射方法,动态映射为软件系统了更好的移植性
此帖出自WindowsCE论坛
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

8
 
to:而动态映射的话是使用时动态申请,比如 物理5号中断可以对应5号逻辑中断,也可以对应6号中断,关键看申
请到的逻辑中断序号?
对 ,就是这样
此帖出自WindowsCE论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

9
 
高深啊
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

10
 
呵呵,谢谢GUOPEIXIN这么热心:D,
在各位的指导下,今天上午仔细看了OAL的一些源码,
在头文件nkintr.h中:
#define SYSINTR_UNDEFINED  (-1) // SysIntr not defined for IRQ <-> SYSINTR mapping

#define SYSINTR_NOP         0   /* no processing required */
#define SYSINTR_RESCHED     1   /* set "reschedule flag" */
#define SYSINTR_BREAK       2   /* break into debugger */
#define SYSINTR_CHAIN       3   /* continue to next handler */


// SYSINTR_DEVICES is the base for any non-OAL system interrupts
#define SYSINTR_DEVICES     8

#define SYSINTR_PROFILE             (SYSINTR_DEVICES+1)     // System Profiling
#define SYSINTR_TIMING              (SYSINTR_DEVICES+2)     // Latency Analysis
#define SYSINTR_RTC_ALARM           (SYSINTR_DEVICES+5)            // real-time clock alarm
#define SYSINTR_NETWORK_SHARED      (SYSINTR_DEVICES+6)     // Combined interrupts for network
#define SYSINTR_VMINI               (SYSINTR_DEVICES+7)     // VMini RX interrupt.

// SYSINTR_FIRMWARE is the base for any interrupts defined in the OAL
#define SYSINTR_FIRMWARE    (SYSINTR_DEVICES+8)

#define SYSINTR_MAX_DEVICES 64
#define SYSINTR_MAXIMUM     (SYSINTR_DEVICES+SYSINTR_MAX_DEVICES)

红色这句就是定义了在OAL中的中断起始逻辑终端号,而在MAP.C文件中:
//  Function:  OALIntrRequestSysIntr
//
//  This function allocate new SYSINTR for given IRQ and it there isn't
//  static mapping for this IRQ it will create it.
//
UINT32 OALIntrRequestSysIntr(UINT32 count, const UINT32 *pIrqs, UINT32 flags)
{
    UINT32 irq, sysIntr;

    OALMSG(OAL_INTR&&OAL_FUNC, (
        L"+OALIntrRequestSysIntr(%d, 0x%08x, 0x%08x)\r\n", count, pIrqs, flags
    ));
   
    // Valid IRQ?
    if (count != 1 || pIrqs[0] >= OAL_INTR_IRQ_MAXIMUM) {
        sysIntr = SYSINTR_UNDEFINED;            
        goto cleanUp;
    }
    irq = pIrqs[0];

    // If there is mapping for given irq check for special cases
    if (g_oalIrq2SysIntr[irq] != SYSINTR_UNDEFINED) {
        // If static mapping is requested we fail
        if ((flags & OAL_INTR_STATIC) != 0) {
            OALMSG(OAL_ERROR, (L"ERROR: OALIntrRequestSysIntr: "
               L"Static mapping for IRQ %d already assigned\r\n", irq
            ));
            sysIntr = SYSINTR_UNDEFINED;            
            goto cleanUp;
        }
        // If we should translate, return existing SYSINTR
        if ((flags & OAL_INTR_TRANSLATE) != 0) {
            sysIntr = g_oalIrq2SysIntr[irq];
            goto cleanUp;
        }
    }

    // Find next available SYSINTR value...
    for (sysIntr = SYSINTR_FIRMWARE; sysIntr < SYSINTR_MAXIMUM; sysIntr++) {
        if (g_oalSysIntr2Irq[sysIntr] == OAL_INTR_IRQ_UNDEFINED) break;    }
   
    // Any available SYSINTRs left?
    if (sysIntr >= SYSINTR_MAXIMUM) {
        OALMSG(OAL_ERROR, (L"ERROR: OALIntrRequestSysIntr: "
            L"No avaiable SYSINTR found\r\n"
        ));            
        sysIntr = SYSINTR_UNDEFINED;
        goto cleanUp;
    }
   
    // Make SYSINTR -> IRQ association.
    g_oalSysIntr2Irq[sysIntr] = irq;
   
    // Make IRQ -> SYSINTR association if required
    if ((flags & OAL_INTR_DYNAMIC) != 0) goto cleanUp;
    if (
        g_oalIrq2SysIntr[irq] == SYSINTR_UNDEFINED ||
        (flags & OAL_INTR_FORCE_STATIC) != 0
    ) {
        g_oalIrq2SysIntr[irq] = sysIntr;
    }

cleanUp:
    OALMSG(OAL_INTR&&OAL_FUNC, (
        L"-OALIntrRequestSysIntr(sysIntr = %d)\r\n", sysIntr
    ));
    return sysIntr;
}
这个函数就是为物理中断指派相应的逻辑中断号,而红色那句就是指派一个空的逻辑中断号!

呵呵,谢谢大家的热心帮助,结贴啦:D
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表