4599|10

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

中断流驱动问题(补充) [复制链接]

/*******************************/
DWORD PBT_IntrThread(PVOID pArg)
{
  DWORD ret;
        //PBT_InitializeAddresses();

        //PBT_EnableInterrupt();

        gPwrButtonIntrEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
  gPwrButtonIntrEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
  gPwrButtonIntrEvent[2] = CreateEvent(NULL, FALSE, FALSE, NULL);
  gPwrButtonIntrEvent[3] = CreateEvent(NULL, FALSE, FALSE, NULL);
  
   
        if (!(InterruptInitialize(g_PwrButtonSysIntr, gPwrButtonIntrEvent[0], 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: PwrButton: Interrupt initialize failed.\r\n")));
                CloseHandle(gPwrButtonIntrEvent[0]);
                return 0;
        }
       
        if (!(InterruptInitialize(g_Key2SysIntr, gPwrButtonIntrEvent[1], 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: PwrButton: Interrupt initialize failed.\r\n")));
                CloseHandle(gPwrButtonIntrEvent[1]);
                return 0;
        }
        if (!(InterruptInitialize(g_Key3SysIntr, gPwrButtonIntrEvent[2], 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: PwrButton: Interrupt initialize failed.\r\n")));
                CloseHandle(gPwrButtonIntrEvent[2]);
                return 0;
        }
        if (!(InterruptInitialize(g_Key4SysIntr, gPwrButtonIntrEvent[3], 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: PwrButton: Interrupt initialize failed.\r\n")));
                CloseHandle(gPwrButtonIntrEvent[3]);
                return 0;
        }
       
        while (1)
        {
                //ret = WaitForSingleObject(gPwrButtonIntrEvent, INFINITE);               
                //ret = WaitForMultipleObjects(gPwrButtonIntrEvent, INFINITE);
                ret = WaitForMultipleObjects(4,gPwrButtonIntrEvent,FALSE,INFINITE);
               
                //if((ret==WAIT_OBJECT_0)&&(g_bKillIST==FALSE ))
                switch(ret)               
    {
            case WAIT_OBJECT_0:   //按键1
                    if(PBT_IsPushed()==1)
                            {
                                    Sleep(20);
                              if(PBT_IsPushed()==1)
                                    {
                                            SetEvent(gReadKeyEvent[0]);
                                           
                                            RETAILMSG(1, (TEXT("The button is Down!!!!!!!LTH~~~~~\r\n")));
                                    }
                            }
                            InterruptDone(g_PwrButtonSysIntr);
          RETAILMSG(1, (TEXT("The Eint0 is Done!!!!!!!LTH~~~~~\r\n")));
                           
                    break;
            case WAIT_OBJECT_0+1:
                      if(PBT_IsPushed()==2)
                            {
                                    Sleep(20);
                              if(PBT_IsPushed()==2)
                                    {
                                            SetEvent(gReadKeyEvent[1]);  
                                    }
                            }
                            InterruptDone(g_Key2SysIntr);
          RETAILMSG(1, (TEXT("The Eint1 is Done!!!!!!!LTH~~~~~\r\n")));
                           
                   
                    break;
                    case WAIT_OBJECT_0+2:
                            if(PBT_IsPushed()==4)
                            {
                                    Sleep(20);
                              if(PBT_IsPushed()==4)
                                    {
                                            SetEvent(gReadKeyEvent[2]);
                                           
                                            //RETAILMSG(1, (TEXT("The button is Down!!!!!!!LTH~~~~~\r\n")));
                                    }
                            }
                            InterruptDone(g_Key3SysIntr);
          RETAILMSG(1, (TEXT("The Eint2 is Done!!!!!!!LTH~~~~~\r\n")));
                           
             
                   
                    break;
                    case WAIT_OBJECT_0+3:
                           
                            if(PBT_IsPushed()==8)
                            {
                                    Sleep(20);
                              if(PBT_IsPushed()==8)
                                    {
                                            SetEvent(gReadKeyEvent[3]);
                                           
                                            //RETAILMSG(1, (TEXT("The button is Down!!!!!!!LTH~~~~~\r\n")));
                                    }
                            }
                            InterruptDone(g_Key4SysIntr);
          RETAILMSG(1, (TEXT("The Eint4 is Done!!!!!!!LTH~~~~~\r\n")));
                           
             
                    break;
                   
                    default:  
                            CloseHandle(gPwrButtonIntrEvent[0]);
                            CloseHandle(gPwrButtonIntrEvent[1]);
                            CloseHandle(gPwrButtonIntrEvent[2]);
                            CloseHandle(gPwrButtonIntrEvent[3]);
                return 0;
                
    }
   }
   return 1;
   
}

总是返回WAIT_OBJECT_0??????????为什么啊??我用多个外部中断关联到这个IST上,这样做有问题吗?

最新回复

感谢各位热心帮忙,这个问题分比较少,要结贴了,虽然有的兄弟没有得分,偶心里依然感激,呵呵 *eeworld热心的朋友不少  详情 回复 发表于 2010-1-25 13:21
点赞 关注

回复
举报

59

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你的上个帖子我已经说过,WaitForMultipleObjects不能用于等待经过InterruptInitialize处理的事件。
可以将多个中断关联到同一个事件,然后使用WaitForSingleObject,在中断程序中判断是哪个中断过来的,然后再进行相应的处理。

 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
帮顶,Veabol正解。。。

LZ想了解WaitForMultipleObjects,不妨看看背光驱动,比较典型
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 veabol 的回复:
你的上个帖子我已经说过,WaitForMultipleObjects不能用于等待经过InterruptInitialize处理的事件。
可以将多个中断关联到同一个事件,然后使用WaitForSingleObject,在中断程序中判断是哪个中断过来的,然后再进行相应的处理。






背光、触摸屏驱动都是典型例子。呵呵
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(初级)

5
 
需要将你的按键按下的中断和事件绑定。
http://www.cnblogs.com/we-hjb/archive/2009/05/26/1490461.html
这篇文章推荐过很多次了。。很好的中断开发入门文章
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

6
 
http://www.cnblogs.com/we-hjb/archive/2009/05/26/1490461.html
再说一句,,这个文章中IST的介绍已经说的很详细了。LZ可以参考的
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

7
 
学习ing
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 

/*******************************/
DWORD PBT_IntrThread(PVOID pArg)
{
  DWORD ret;
        //PBT_InitializeAddresses();

        //PBT_EnableInterrupt();

//        gPwrButtonIntrEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
//  gPwrButtonIntrEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
//  gPwrButtonIntrEvent[2] = CreateEvent(NULL, FALSE, FALSE, NULL);
//  gPwrButtonIntrEvent[3] = CreateEvent(NULL, FALSE, FALSE, NULL);
  
  gKeyWaitEvent  = CreateEvent(NULL, FALSE, FALSE, NULL);
  
   //多个中断关联到一个事件上
        if (!(InterruptInitialize(g_Key1SysIntr, gKeyWaitEvent, 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: PwrButton: Interrupt initialize failed.\r\n")));
                CloseHandle(gKeyWaitEvent);
                return 0;
        }
       
        if (!(InterruptInitialize(g_Key2SysIntr, gKeyWaitEvent, 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: PwrButton: Interrupt initialize failed.\r\n")));
                CloseHandle(gKeyWaitEvent);
                return 0;
        }
        if (!(InterruptInitialize(g_Key3SysIntr, gKeyWaitEvent, 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: PwrButton: Interrupt initialize failed.\r\n")));
                CloseHandle(gKeyWaitEvent);
                return 0;
        }
        if (!(InterruptInitialize(g_Key4SysIntr, gKeyWaitEvent, 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: PwrButton: Interrupt initialize failed.\r\n")));
                CloseHandle(gKeyWaitEvent);
                return 0;
        }
       
        while (1)
        {
                ret = WaitForSingleObject(gKeyWaitEvent, INFINITE);               
                //ret = WaitForMultipleObjects(gPwrButtonIntrEvent, INFINITE);
                //ret = WaitForMultipleObjects(4,gPwrButtonIntrEvent,FALSE,INFINITE);
               
                if((ret==WAIT_OBJECT_0)&&(g_bKillIST==FALSE ))
                {
                switch(PBT_IsPushed())               
    {
            case 1:   //按键1
                    //if(PBT_IsPushed()==1)
                           
                                    Sleep(20);
                              if(PBT_IsPushed()==1)
                                    {
                                            SetEvent(gReadKeyEvent[0]);
                                           
                                            RETAILMSG(1, (TEXT("The button is Down!!!!!!!LTH~~~~~\r\n")));
                                    }
                           
                            InterruptDone(g_Key1SysIntr);
          RETAILMSG(1, (TEXT("The Eint0 is Done!!!!!!!LTH~~~~~\r\n")));
                           
                    break;
            case 2:
                      //if(PBT_IsPushed()==2)
                            {
                                    Sleep(20);
                              if(PBT_IsPushed()==2)
                                    {
                                            SetEvent(gReadKeyEvent[1]);  
                                    }
                            }
                            InterruptDone(g_Key2SysIntr);
          RETAILMSG(1, (TEXT("The Eint1 is Done!!!!!!!LTH~~~~~\r\n")));
                           
                   
                    break;
                    case 3:
                            //if(PBT_IsPushed()==4)
                            {
                                    Sleep(20);
                              if(PBT_IsPushed()==3)
                                    {
                                            SetEvent(gReadKeyEvent[2]);
                                           
                                            //RETAILMSG(1, (TEXT("The button is Down!!!!!!!LTH~~~~~\r\n")));
                                    }
                            }
                            InterruptDone(g_Key3SysIntr);
          RETAILMSG(1, (TEXT("The Eint2 is Done!!!!!!!LTH~~~~~\r\n")));
                           
             
                   
                    break;
                    case 4:
                           
                            //if(PBT_IsPushed()==8)
                            {
                                    Sleep(20);
                              if(PBT_IsPushed()==4)
                                    {
                                            SetEvent(gReadKeyEvent[3]);
                                           
                                            //RETAILMSG(1, (TEXT("The button is Down!!!!!!!LTH~~~~~\r\n")));
                                    }
                            }
                            InterruptDone(g_Key4SysIntr);
          RETAILMSG(1, (TEXT("The Eint4 is Done!!!!!!!LTH~~~~~\r\n")));
                           
             
                    break;
                   
                    default:  
                            //CloseHandle(gPwrButtonIntrEvent[0]);
                            //CloseHandle(gPwrButtonIntrEvent[1]);
                            //CloseHandle(gPwrButtonIntrEvent[2]);
                            //CloseHandle(gPwrButtonIntrEvent[3]);
                           
                break;
                
    }
  }
  else {
                CloseHandle(gKeyWaitEvent);
                return 0;
  }
   }
   return 1;
   
}
}

我把多个中断关联到一个事件上,刚开始4个按键都能用,按几下有的就不能用了,最后甚至都不能用?为什么啊?是不是哪儿没有释放?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
检测出哪个中断之后清一下相应的PND之类的位试试。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

10
 
你这样在每个case下面进行interruptDone,可能存在当多个key同时按下的时候,有可能会漏掉。

试试在最后面,将中断都clear一下。

InterruptDone(g_Key1SysIntr);
InterruptDone(g_Key2SysIntr);
InterruptDone(g_Key3SysIntr);
InterruptDone(g_Key4SysIntr);
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

11
 
感谢各位热心帮忙,这个问题分比较少,要结贴了,虽然有的兄弟没有得分,偶心里依然感激,呵呵 *eeworld热心的朋友不少
 
 
 

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

随便看看
查找数据手册?

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-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表