WIN32 X86 API

本文详细解析了线程同步机制,包括临界区、事件对象的使用及操作,如InitializeCriticalSectionAndSpinCount、CreateEvent等。同时,深入探讨了WinUsb_ReadPipe和WinUsb_WritePipe函数在USB数据读写过程中的作用与注意事项。
摘要由CSDN通过智能技术生成

InitializeCriticalSectionAndSpinCount
当一个线程试图获取一个被锁定的临界区时,它会旋转:它进入一个循环,这个循环会迭代旋转计数次数,检查锁是否被释放。如果在循环结束之前锁没有被释放,线程将进入睡眠状态,等待锁被释放

事件对象就像一个开关:它只有两种状态—开和关。当一个事件处于”开”状态,我们称其为”有信号”否则称为”无信号”。
CreateEvent 打开一个事件对象
SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号。
WaitForSingleObject()等待,直到参数所指定的OBJECT成为发信号状态时才返回

ResetEvent(cmd->cmdEvent);
将指定的时间对象设置为不信号状态

EnterCriticalSection(&cmd->critical);
EnterCriticalSection(&cmd->critical);
线程同步,一个线程执行了EnterCriticalSection(&cmd->critical),没执行LeaveCriticalSection(&cmd->critical);
另一个线程再执行到EnterCriticalSection(&cmd->critical)会处于等待状态。

/**************************************************************************************************/
创建事件对象(CreateEvent):
详解请点这里
事件对象就是一个开关,只有开 关 两种状态。
开: 有信号
关:无信号

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
BOOL bManualReset, //reset type
BOOL bInitialState, //initial state
LPCTSTR lpName //object name
);
————————————————
参数:

lpEventAttributes 一般为NULL
bManualReset 创建的Event是自动复位还是人工复位.如果true,人工复位。
bInitialState 初始状态,true,有信号,false无信号
lpName 事件对象的名称。您在OpenEvent函数中可能使用。

操作事件对象的函数:

ResetEvent() //设置为无信号
OpenEvent() //获取事件的Handle
CloseHandle() //关闭
SetEvent()或PulseEvent() //设置,使其有信号。
WaitForSingleObject()或WaitForMultipleObjects()来等待其变为有信号.

返回值:

该函数创建一个Event同步对象,如果CreateEvent调用成功的话,会返回新生成的对象的句柄,否则返回NULL。

/*****************************************************************************************************/
WinUsb_ReadPipe和WinUsb_WritePipe函数功能理解

BOOL __stdcall WinUsb_ReadPipe(
  _In_       WINUSB_INTERFACE_HANDLE InterfaceHandle,
  _In_       UCHAR PipeID,
  _Out_      PUCHAR Buffer,
  _In_       ULONG BufferLength,
  _Out_opt_  PULONG LengthTransferred,
  _In_opt_   LPOVERLAPPED Overlapped
);
————————————————

参数:

InterfaceHandle 和那个端点的那个管道联接
PipeID 管道的地址,第7位表示端点数据方向:0表示OUT(主-从),1表示IN(从-主)
Buffer 接收读取的数据的缓冲区。
BufferLength 读取数据的最大个数,这个值必须小于或等于Buffer缓冲区中的字节个数。
LengthTransferred 一个无符号长整型指针,接收实际复制到Buffer缓冲区中的个数。
Overlapped,一般定为一个空指针,NULL。

返回值:

操作成功返回TRUE,失败返回FALSE。(GetLastError获取错误返回值)

注意事项:

如果设备返回数据(我理解是INpacket)大于最大的传输长度,WinUSB将分离这个数据成一较小段的,并且连续提交。如果这个传输数据的长度不是最大传输长度的整数倍,WINUSB就会把他增加到最大传输个数的倍数。

USB包的大小不考虑传输请求,如果设备响应了一个对现在的缓冲区来说较大的包,并且读请求符合管道上指针的类型,如果管道指针允许部分读取(ALLOW_PARTIAL_READS,),WINUSB将把剩下的数据放在下次传输的开头,

如果第六个参数为非空,第五个参数设置的值是无意义的。

如果PIPE为空,WinUsb_ReadPipe我们函数不返回直到PIPE中有数据,如果出现错误状况或者超时,函数就返回FALSE,(GetLastError获取错误返回值).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值