首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

挂起中断,该如何处理

2012-02-04 
挂起中断请问各位高手:为什么在读操作和写操作中两次挂起中断具体代码如下:DWORD IIC_Read(DWORD Handle,

挂起中断
请问各位高手:
为什么在读操作和写操作中两次挂起中断
具体代码如下:
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;
}
1、为什么在读操作和写操作中两次挂起中断这样做的目的是什么呢??
2、还有ret = WaitForSingleObject(gI2CEvent, I2C_RW_TIMEOUT);其中#define I2C_RW_TIMEOUT2000
是在等待gI2CEvent这个事件产生吗??,这个事件是在中断线程中被触发的,那么中断线程是怎么被触发的呢?(比如外部中断都是按键触发中断,IIC是如何触发中断呢)

[解决办法]
1. 
第一次只是在初始化配置,开始控制时的一次(只需要一次),所以这次是没有while,或者for之类的循环的。至于为什么要挂起等待中断。很显然,是为了释放CPU资源,避免阻塞。暴力的做法就是用while()循环读取某个bit位的值来判断初始化和握手是否成功。这样整个系统都被卡在这里了。

第二次是真正的有效数据通讯,所以这次是有for循环的,挂起会在每次的发出之后,需要等待设备的ACK/NAK应答。同样也是避免占用CPU资源的。


2. #define I2C_RW_TIMEOUT 2000 是设置等待超时值,就是如果超过2秒,就说明此次通讯失败,没有正确的返回值。

的确是在等待gI2CEvent这个事件。

这个事件对应的中断是由CPU的IIC Controller产生的,是硬件层面的,你既然明白按键能触发外部中断,那么也应该能理解串口、IIC、SPI之类的通讯端口,会产生数据发送完毕中断、数据发送失败中断、FIFO清空中断、FIFO过半中断、接收到数据中断,等等等等,都是可以触发中断的。

热点排行