3871|4

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于2440,ce5中的串口COM_Write函数的WaitReturn = WaitForSingleObject [复制链接]


  1. ULONG
  2. COM_Write(HANDLE pHead,         /*@parm [IN]  HANDLE returned by COM_Open.*/
  3.           PUCHAR pSourceBytes,  /*@parm [IN]  Pointer to bytes to be written.*/
  4.           ULONG  NumberOfBytes  /*@parm [IN]  Number of bytes to be written. */
  5.          )
  6. {
  7.     PHW_OPEN_INFO   pOpenHead = (PHW_OPEN_INFO)pHead;
  8.     PHW_INDEP_INFO  pSerialHead = pOpenHead->pSerialHead;
  9.     ULONG               BytesWritten   = 0;
  10.     ULONG               TotalWritten   = 0;
  11.     PHWOBJ              pHWObj         = NULL;
  12.     PVOID               pHWHead        = NULL;
  13.     PHW_VTBL            pFuncTbl       = NULL;
  14.     ULONG               TotalTimeout;   // The Total Timeout
  15.     ULONG               Timeout;        // The Timeout value actually used
  16.     ULONG               WaitReturn;

  17.     DEBUGMSG (ZONE_WRITE|ZONE_FUNCTION,
  18.               (TEXT("+COM_WRITE(0x%X, 0x%X, %d)\r\n"), pHead,
  19.                pSourceBytes, NumberOfBytes));      


  20.     // Check validity of handle
  21.     if ( !pSerialHead || !pSerialHead->OpenCnt ) {
  22.         DEBUGMSG (ZONE_WRITE|ZONE_ERROR,
  23.                   (TEXT("COM_WRITE, device not open\r\n") ));
  24.         SetLastError (ERROR_INVALID_HANDLE);
  25.         return(ULONG)-1;
  26.     }

  27.     // Make sure the caller has access permissions
  28.     if ( !(pOpenHead->AccessCode & GENERIC_WRITE) ) {
  29.         DEBUGMSG(ZONE_USR_READ|ZONE_ERROR,
  30.                  (TEXT("COM_Write: Access permission failure x%X\n\r"),
  31.                   pOpenHead->AccessCode));
  32.         SetLastError (ERROR_INVALID_ACCESS);
  33.         return(ULONG)-1;
  34.     }

  35. #ifdef DEBUG
  36.     if ( IsBadReadPtr(pSourceBytes, NumberOfBytes) ) {
  37.         DEBUGMSG (ZONE_WRITE|ZONE_ERROR,
  38.                   (TEXT("COM_WRITE, bad read pointer\r\n") ));
  39.         SetLastError(ERROR_INVALID_PARAMETER);
  40.         return(ULONG)-1;
  41.     }
  42. #endif

  43.     COM_INC_USAGE_CNT(pOpenHead);

  44.     pHWObj   = pSerialHead->pHWObj;
  45.     pHWHead  = pSerialHead->pHWHead;
  46.     pFuncTbl = pHWObj->pFuncTbl;

  47.     /* Lock out other threads from messing with these pointers.
  48.      */
  49.     DEBUGMSG (ZONE_WRITE, (TEXT("COM_Write wait for CritSec %x.\r\n"),
  50.                            &(pSerialHead->TransmitCritSec1)));
  51.     EnterCriticalSection(&(pSerialHead->TransmitCritSec1));
  52.     DEBUGMSG (ZONE_WRITE, (TEXT("COM_Write Got CritSec %x.\r\n"),
  53.                            &(pSerialHead->TransmitCritSec1)));

  54.     DEBUGMSG (ZONE_WRITE, (TEXT("COM_Write wait for CritSec %x.\r\n"),
  55.                            &(pSerialHead->TxBufferInfo.CS)));
  56.     TxEnterCS(pSerialHead);
  57.     DEBUGMSG (ZONE_WRITE, (TEXT("COM_Write got CritSec %x.\r\n"),
  58.                            &(pSerialHead->TxBufferInfo.CS)));

  59.     pSerialHead->fAbortTransmit = 0;
  60.     // Clear any pending event
  61.     WaitForSingleObject(pSerialHead->hTransmitEvent,0);

  62.     pSerialHead->TxBufferInfo.Permissions = GetCurrentPermissions();
  63.     pSerialHead->TxBufferInfo.TxCharBuffer = pSourceBytes;
  64.     pSerialHead->TxBufferInfo.Length = NumberOfBytes;
  65.     TxRead(pSerialHead) = 0;
  66.     pSerialHead->TxBytesSent = 0;
  67.     pSerialHead->TxBytesPending = NumberOfBytes;

  68.     // Make sure an event isn't hanging around from a previous write time out.
  69.     ResetEvent( pSerialHead->hTransmitEvent );

  70.     TxLeaveCS(pSerialHead);
  71.     DEBUGMSG (ZONE_WRITE|ZONE_FUNCTION,
  72.               (TEXT("COM_Write released CritSec: %x.\r\n"),
  73.                &(pSerialHead->TxBufferInfo.CS)));

  74.     // We call the same write routine that a TX_INTR does.  It queus as
  75.     // much data as possible, then returns.  From then on, the normal
  76.     // interrupt mechanism kicks in.
  77.     DoTxData( pSerialHead );

  78.     TotalTimeout = pSerialHead->CommTimeouts.WriteTotalTimeoutMultiplier*NumberOfBytes +
  79.                    pSerialHead->CommTimeouts.WriteTotalTimeoutConstant;

  80.     if ( !TotalTimeout )
  81.         Timeout = INFINITE;
  82.     else
  83.         Timeout = TotalTimeout;

  84.     DEBUGMSG (ZONE_WRITE, (TEXT("COM_Write wait for transmission complete event %x.\r\n"),
  85.                            pSerialHead->hTransmitEvent));

  86.     [color=#FF0000]WaitReturn = WaitForSingleObject (pSerialHead->hTransmitEvent, Timeout);[/color]
  87.     [color=#FF0000]这里在等啥事件啊?这个事件是怎么发生的啊?由谁产生的?在哪里被处理的?[/color]
  88.     // In the absense of WaitForMultipleObjects, we use flags to
  89.     // handle errors/aborts. Check for aborts or asynchronous closes.
  90.     if ( pSerialHead->fAbortTransmit ) {
  91.         DEBUGMSG(ZONE_USR_READ,(TEXT("COM_Write - Aborting write\r\n")));
  92.         goto LEAVEWRITE;
  93.     }

  94.     if ( !pSerialHead->OpenCnt ) {
  95.         DEBUGMSG(ZONE_WRITE|ZONE_ERROR,
  96.                  (TEXT("COM_Write - device was closed\n\r")));
  97.         SetLastError(ERROR_INVALID_HANDLE);
  98.         goto LEAVEWRITE;
  99.     }

  100. #ifdef DEBUG
  101.     if ( WAIT_TIMEOUT == WaitReturn ) {
  102.         // Timeout
  103.         DEBUGMSG (ZONE_WARN, (TEXT("Write timeout %d, %d\r\n"), NumberOfBytes, pSerialHead->TxBytesPending));
  104.     } else {
  105.         DEBUGMSG (ZONE_WRITE, (TEXT("COM_Write completed normally.\r\n")));
  106.     }
  107. #endif

  108.     LEAVEWRITE:
  109.     // Regardless of timeout, we need to clear the TxBufferInfo
  110.     // to prevent ISR from possibly coming around and trying to use
  111.     // the buffer after we have returned to the caller.
  112.     DEBUGMSG (ZONE_WRITE, (TEXT("COM_Write wait for CritSec %x.\r\n"),
  113.                            &(pSerialHead->TxBufferInfo.CS)));
  114.     TxEnterCS(pSerialHead);
  115.     DEBUGMSG (ZONE_WRITE, (TEXT("COM_Write got CritSec %x.\r\n"),
  116.                            &(pSerialHead->TxBufferInfo.CS)));
  117.     pSerialHead->TxBufferInfo.Permissions = 0;
  118.     pSerialHead->TxBufferInfo.TxCharBuffer = NULL;
  119.     pSerialHead->TxBufferInfo.Length = 0;
  120.     pSerialHead->TxBytesPending = 0;
  121.     TxRead(pSerialHead) = 0;
  122.     TxLeaveCS(pSerialHead);
  123.     DEBUGMSG (ZONE_WRITE|ZONE_FUNCTION,
  124.               (TEXT("COM_Write released CritSec: %x.\r\n"),
  125.                &(pSerialHead->TxBufferInfo.CS)));


  126.     LeaveCriticalSection(&(pSerialHead->TransmitCritSec1));
  127.     DEBUGMSG (ZONE_WRITE|ZONE_FUNCTION,
  128.               (TEXT("COM_Write released CritSec: %x. Exiting\r\n"),
  129.                &(pSerialHead->TransmitCritSec1)));

  130.     /* OK, the Transmitter has gone empty.
  131.      */
  132.     EvaluateEventFlag(pSerialHead, EV_TXEMPTY);

  133.     if ( pSerialHead->DCB.fRtsControl == RTS_CONTROL_TOGGLE ) {
  134.         pFuncTbl->HWClearRTS(pHWHead);
  135.     }

  136.     COM_DEC_USAGE_CNT(pOpenHead);
  137.     DEBUGMSG (ZONE_WRITE|ZONE_FUNCTION,
  138.               (TEXT("-COM_WRITE, returning %d\n\r"),pSerialHead->TxBytesSent));
  139.     return(pSerialHead->TxBytesSent);
  140. }
复制代码

最新回复

好像不是这么解释的吧? 在COM_Write()函数中,先ResetEvent(pSerialHead->hTransmitEvent),然后接着调用DoTxData( pSerialHead )[该函数中又调用HWTxIntrHandler()-->对应驱动中的具体负责发数据发送到串口发送缓冲区的SL_TxIntrEx()函数];然后再WaitReturn = WaitForSingleObject (pSerialHead->hTransmitEvent, Timeout); 所以这里应该是对应做了个写超时的等待!   详情 回复 发表于 2010-3-22 10:43
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

WaitReturn = WaitForSingleObject (pSerialHead->hTransmitEvent, Timeout);
这里在等啥事件啊?这个事件是怎么发生的啊?由谁产生的?在哪里被处理的?
初学,莫见怪。。谢谢。
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
在状态转换时Set的,没有其他代码了么?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 ulovexd 的回复:

WaitReturn = WaitForSingleObject (pSerialHead->hTransmitEvent, Timeout);
这里在等啥事件啊?这个事件是怎么发生的啊?由谁产生的?在哪里被处理的?
初学,莫见怪。。谢谢。


这个是发送啊,你写数据肯定要启动这个线程了。

这个用于操作系统同步的pSerialHead->hTransmitEvent得到响应后,就去执行线程了,否则系统在做别的工作。
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 gooogleman 的回复:


这个是发送啊,你写数据肯定要启动这个线程了。

这个用于操作系统同步的pSerialHead->hTransmitEvent得到响应后,就去执行线程了,否则系统在做别的工作。


好像不是这么解释的吧?

在COM_Write()函数中,先ResetEvent(pSerialHead->hTransmitEvent),然后接着调用DoTxData( pSerialHead )[该函数中又调用HWTxIntrHandler()-->对应驱动中的具体负责发数据发送到串口发送缓冲区的SL_TxIntrEx()函数];然后再WaitReturn = WaitForSingleObject (pSerialHead->hTransmitEvent, Timeout);
所以这里应该是对应做了个写超时的等待!


 
 
 

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

随便看看
查找数据手册?

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