下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

FreeRTOS_FD_CLR()

[FreeRTOS-Plus-TCP API 引用]

FreeRTOS_sockets.h
void FreeRTOS_FD_CLR( Socket_t xSocket, SocketSet_t xSocketSet, BaseType_t xBitsToClear );
		

套接字集中的套接字具有多个相关联的相关事件位。 相关事件位置位将会使套接字解除 FreeRTOS_select() 调用的阻塞状态。 相关事件位使用 FreeRTOS_FD_SET() API 函数实现置位,而使用 FreeRTOS_FD_CLR() API 函数实现清零。 如果 所有事件位均已清零,则该套接字会从套接字集中移除 。

必须 FreeRTOSIPConfig.h 中设置为 1, 才能使用 FreeRTOS_FD_CLR() 。

每个套接字成员都有自己的事件位集,可以是一个位元 或以下值的组合:

eSELECT_READ 对于正在读取数据的套接字, 只要套接字包含未读数据, eSELECT_READ 事件就会在套接字中处于挂起状态。

对于正在监听新连接的套接字, 每次接收到新连接时, eSELECT_READ 事件就会挂起。

eSELECT_WRITE 只要套接字有写入空间, eSELECT_WRITE 事件就会一直处于挂起状态。

如果 TCP 套接字主动连接到 pear, 则在建立连接后, 会立即触发 eSELECT_WRITE 事件。

当 eSELECT_WRITE 事件被挂起后,就应将其禁用, 或者调用方应对套接字写入足够数据, 以完全填充传输缓冲区—— 否则,将不会清除挂起的 eSELECT_WRITE 事件。

eSELECT_EXCEPT 如果套接字断开连接,则 eSELECT_EXCEPT 事件会进入挂起状态 。

eSELECT_INTR 如果在调用过程中使用 FreeRTOS_SignalSocket() 或 FreeRTOS_SignalSocketFromISR() 向任何套接字发出信号,则返回 eSELECT_INTR。请注意, 只有在定义了 ipconfigSUPPORT_SIGNALS 的情况下才会触发。

参数:

xSocket   具有一个已清零相关位或正从套接字集中移除的套接字 。

xSocketSet   套接字成员所属的套接字集。

xBitsToClear   应清零的位,使用 'eSELECT_ALL' 将所有位清零 并从套接字集中移除该套接字。

返回:

无效


/* FreeRTOS includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

/* FreeRTOS-Plus-TCP includes. */
#include "FreeRTOS_IP.h"
#include "FreeRTOS_Sockets.h"

void vConnectExample( )
{
Socket_t xSocket;
struct freertos_sockaddr xEchoServerAddress;
const TickType_t xZeroTimeOut = 0;
SocketSet_t xSocketSet;

/* Create a TCP socket. */
xSocket = FreeRTOS_socket( FREERTOS_AF_INET4, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );

/* Create a socket set. */
xSocketSet = FreeRTOS_CreateSocketSet()( );

/* Make the socket a member of the set.
Only the WRITE event can unblock a call to select() */

FreeRTOS_FD_SET( xSocket, xSocketSet, eSELECT_WRITE );

/* When working with select(), time-outs on API's aren't necessary */
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xZeroTimeOut, sizeof( xZeroTimeOut ) );
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, &xZeroTimeOut, sizeof( xZeroTimeOut ) );

/* Fill in the peer's address */
xEchoServerAddress.sin_port = FreeRTOS_htons( echoECHO_PORT );
xEchoServerAddress.sin_addr = FreeRTOS_inet_addr_quick( configECHO_SERVER_ADDR0,
configECHO_SERVER_ADDR1,
configECHO_SERVER_ADDR2,
configECHO_SERVER_ADDR3 );

/* Now initiate an active connect procedure to a peer. This call is non-blocking */
FreeRTOS_connect( xSocket, &xEchoServerAddress, sizeof( xEchoServerAddress ) );

/* Now block for at most 30 seconds. A successful connection will unblock
select() with a eSELECT_WRITE event */

if( FreeRTOS_select( xSocketSet, 30000 ) != 0 )
{
BaseType_t xMask = FreeRTOS_FD_ISSET ( xSocket, xSocketSet );
if( xMask != 0 )
{
/* Clear the WRITE event bit, it is not interesting any more */
FreeRTOS_FD_CLR( xSocket, xSocketSet, eSELECT_WRITE );

/* Set the READ event bit */
FreeRTOS_FD_SET( xSocket, xSocketSet, eSELECT_READ );
}
}
}

Example use of the FreeRTOS_FD_SET / FD_CLR / FD_ISSET() API functions
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.