3563|8

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于中断事件EVENT [复制链接]

在IIC_INIT中建立事件gI2CEvent = CreateEvent(NULL, FALSE, FALSE, NULL);(为自动重置)
在中断线程I2C_IntrThread中SetEvent(gI2CEvent)后
进入IIC_READ函数的ret = WaitForSingleObject(gI2CEvent, I2C_RW_TIMEOUT);
为什么还需要ResetEvent(gI2CEvent)???
我看书中介绍操作系统会自动设置为无信号状态。
DWORD IIC_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
        UINT32 count, ret;
        uchar *pReadBuffer;

        if ((pBuffer == NULL) || (dwNumBytes <= 0))
                return 0;

        pReadBuffer = MapPtrToProcess(pBuffer, GetCallerProcess());

        // 设置从机地址及当前状态
        I2cCurSla = I2cSla | 0x01;
        I2cStatus = I2C_STATUS_SETADDR;
        StartI2C(I2cCurSla);

        ret = WaitForSingleObject(gI2CEvent, I2C_RW_TIMEOUT);                /* 挂起当前线程,直到IIC中断的产生 */   
        ResetEvent(gI2CEvent);       

        if ((IICError != I2C_ERROR_NO_ERR) || (ret != WAIT_OBJECT_0))
        {
                RETAILMSG(1, (TEXT("ERROR: IIC_Read: Send Slave Address fail! \r\n")));
                return 0;       
        }
       
        I2cStatus = I2C_STATUS_RECEIVE;                                                // 进入接收状态
        for (count = 0; count < dwNumBytes; count++)
        {
                if (count == (dwNumBytes - 1))
                        IIC_StartRecByteNA();
                else
                        IIC_StartRecByteA();       
               
                /* 挂起当前线程,直到IIC中断的产生 */
                ret = WaitForSingleObject(gI2CEvent, I2C_RW_TIMEOUT);
                ResetEvent(gI2CEvent);

                if (ret != WAIT_OBJECT_0)
                {
                        if (ret == WAIT_TIMEOUT)
                                RETAILMSG(1, (TEXT("ERROR: IIC read data time out! \r\n")));
                        else
                                RETAILMSG(1, (TEXT("ERROR: IIC read data fail! \r\n")));
                       
                        return count;
                }
       
                *pReadBuffer = IIC_RecByte();       
                pReadBuffer++;

                if (IICError != I2C_ERROR_NO_ERR)
                {
                        RETAILMSG(1, (TEXT("ERROR: IIC_Read: Receive data fail! \r\n")));
                        break;       
                }
        }
       
        StopI2C(0);

        return count;
}

最新回复

thank u!  详情 回复 发表于 2008-7-4 15:48
点赞 关注

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
The state of an event object remains nonsignaled until it is explicitly set to signaled by the SetEvent or PulseEvent function. This nonsignaled state blocks the execution of any threads that have specified the event object in a call to one of the wait functions.

ResetEvent sets the event to the nonsignaled state even if the event was signaled multiple times before being reset.

The ResetEvent function is used primarily for manual-reset event objects, which must be set explicitly to the nonsignaled state. Auto-reset event objects automatically change from signaled to nonsignaled after a single waiting thread is released


就是为了让WaitForSingleObject()不误收到事件。。。。
 
 

回复

93

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
??????
您发的这个明确说明:
Auto-reset event objects automatically change from signaled to nonsignaled after a single waiting thread is released
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
顶一下
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
??
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

6
 
你用的是哪个版本的WINCE?用法是不是有点问题。
我的中断处理过程是:

  1. DWORD idInt = 0; //用实际中断号替换0
  2. HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //创建事件对象
  3. InterruptInitialize(idInt, hEvent, NULL, 0);  //把中断号和事件对象关联。
  4. while(1)
  5. {
  6. WaitForSingleObject(hEvent, INFINITE);//等待中断。发生中断时会Disable对应的中断信号。

  7. //处理中断

  8. InterruptDone(idInt); //完成中断处理,会Enable中断,之后就可以继续接受到中断。
  9. }
复制代码
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
谁说的一定要加?
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 
fengwx说的对,只要
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //创建事件对象
InterruptInitialize(idInt, hEvent, NULL, 0);  //把中断号和事件对象关联。
while(1)
{
WaitForSingleObject(hEvent, INFINITE);//等待中断。发生中断时会Disable对应的中断信号。

//处理中断

InterruptDone(idInt); //完成中断处理,会Enable中断,之后就可以继续接受到中断。
}
就行,不用reset.
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
thank u!
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表