3474|6

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

windowsCE下的中断线程 [复制链接]

各位兄弟关于中断有几个问题,请各位高手指导一下!先谢谢啦!
问题:1、InterruptInitialize(g_I2CSysIntr, gI2CIntrEvent, 0, 0)这个函数是把逻辑中断号与事件gI2CIntrEvent相关联,但是
         我看g_I2CSysIntr的初始化定义是UINT32 g_I2CSysIntr = SYSINTR_UNDEFINED;
        个人理解:是不是KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_I2CIrq, sizeof(UINT32), &g_I2CSysIntr, sizeof(UINT32), NULL)NULL)中对g_I2CSysIntr重新附值为SYSINTR_IIC??
问题:2、在IIC_Read函数中
   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);       
其中ret = WaitForSingleObject(gI2CEvent, I2C_RW_TIMEOUT);等待事件gI2CEvent发生,然后进入中断??这个事件是系统触发还是中断函数中通过
SetEvent(gI2CEvent);触发的??如果是系统触发,然后进入中断线程处理,那么为什么
中断中的处理也是case I2C_STATUS_SETADDR:                                               
                                if((v_pIICPregs->IICSTAT & 0x09) == 0)                                // 发送地址成功
                                {
                                        SetEvent(gI2CEvent);               
                                        IICError = I2C_ERROR_NO_ERR;
                                }
在中断中再次SetEvent(gI2CEvent)的作用是什么呢?
问题:3、在中断线程中同样有ret = WaitForSingleObject(gI2CIntrEvent, INFINITE);
        这个WaitForSingleObject是谁触发的事件呢??是操作系统吗?如果是的话,那么在IIC_Read中的WaitForSingleObject是谁在触发这个事件?
         这两个函数中(I2C_IntrThread和IIC_Read)WaitForSingleObject的事件触发的先后顺序是什么样的??        DWORD I2C_IntrThread(PVOID pArg)
{
        DWORD ret;
        // 创建I2C中断中断事件
        gI2CIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        // 初始化 I2C 中断: 注册中断事件, 允许 I2C 中断
        if (!(InterruptInitialize(g_I2CSysIntr, gI2CIntrEvent, 0, 0)))
        {
                CloseHandle(gI2CIntrEvent);
                RETAILMSG(1, (TEXT("ERROR: I2C Bus: Interrupt initialize failed.\r\n")));
                return 0;
        }
        // IIC 中断线程开始运行
        while (1)
        {
                ret = WaitForSingleObject(gI2CIntrEvent, INFINITE);
                if ((ret != WAIT_OBJECT_0) || (g_bKillIST == TRUE))                                        /* 驱动卸载或错误发生 */
                {               
                        CloseHandle(gI2CIntrEvent);
                        RETAILMSG(1, (TEXT("INFO: I2C Bus Driver DeInit or Error Occur. \r\n")));
                        return 0;                                                                                                                /* 线程退出 */
                }
                switch(I2cStatus)
                {       
                    // Start IIC Status
                    case I2C_STATUS_SETADDR:                                               
                                if((v_pIICPregs->IICSTAT & 0x09) == 0)                                                // 发送地址成功
                                {
                                        SetEvent(gI2CEvent);               
                                        IICError = I2C_ERROR_NO_ERR;
                                }
                    .................
问题:4、ret = WaitForSingleObject(gI2CIntrEvent, INFINITE);无论成功或者失败都有返回值给ret ,然后是向下继续执行吧??

最新回复

非常感谢shuiyan兄,已经帮我解决了不少疑问 再次谢谢啦! 揭贴得分!  详情 回复 发表于 2008-7-1 11:35
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
顶起来!
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
再顶
各位兄弟哪位了解
指点小弟
谢谢啦!
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

4
 
第一个问题和第四个问题关于函数的用法,你去查MSDN,那上面的解释比论坛上谁的回答都强
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
第3个问题呢??
这个最重要!
谢谢大家!!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
问题1: 你的理解是对的,初始化赋值就相当于平时int i=0;一样,给个初值。

问题2:在中断中SetEvent是相当于释放Event的占有权,使得操作系统的管理进程能够再次为event分配占有权。如果不释放,所有希望以此event触发的线程都会被无限挂起,无法获得执行,即使底层的中断其实在不停的触发。

问题3:I2C_IntrThread中的先触发,然后进行I2C的状态机判断,如果当前是读(I2C_READ)状态,就调用IIC_READ函数,而IIC_READ函数中又有中断。所以IIC_READ的中断是必须在IIC_READ函数被I2C_IntrThread调用的前提下才能发生。
    I2C_IntrThread是i2c的所有状态机管理线程,除了READ,还有WRITE,START/RESTART,STOP,ACK/NAK等很多操作。

问题4: 是继续向下执行,所以可以在紧接着下一行看到对ret值的判断。


另:还是建议你去详细看一下I2C的协议,对其状态机好好理解一下,直接看驱动代码,会很模糊的。理解了状态机,理解了操作流程,看代码的话,你的思路就非常清晰了。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
非常感谢shuiyan兄,已经帮我解决了不少疑问
再次谢谢啦!
揭贴得分!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

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