自 FreeRTOS V10.1.0 开始,FreeRTOS+UDP 已从
(自 FreeRTOS V10.1.0 开始)。请参阅替代方案:FreeRTOS+TCP 堆栈
(此堆栈可配置为仅供 UDP 使用)。
|
|
FreeRTOS_sockets.h
xSocket_t FreeRTOS_select( xSocketSet_t xSocketSet, TickType_t xBlockTimeTicks );
阻塞套接字集,直到套接字集的成员包含
可读取数据。
同时从多个套接字读取数据时,套接字集允许
应用程序任务阻塞。 任务不在单个套接字上阻塞,
而是在套接字集上阻塞。
要使用套接字集:
-
调用 FreeRTOS_CreateSocketSet() 创建套接字集。
套接字集相当于 Berkeley 套接字 fd_set 类型。
-
调用 FreeRTOS_FD_SET() 向套接字集添加一个或多个套接字。
FreeRTOS_FD_SET() 相当于 Berkeley 套接字 FD_SET() 宏。
-
调用 FreeRTOS_Select() 以测试套接字集中的套接字,检查其内是否包含任何
待读取数据。
-
从 FreeRTOS_select()(如有)返回的套接字中读取数据,
方法是照常调用 FreeRTOS_recvfrom()。
在任何时候,套接字都只能属于一个套接字集。
FreeRTOS_FD_CLR() 从套接字集中移除套接字。
参数:
xSocketSet
|
当前正在测试的套接字集。
|
xBlockTimeTicks
|
调用 任务将保持在阻塞状态(同时执行其他任务)
使调用任务保持在“已阻塞”状态(同时执行其他任务)
以等待套接字集成员准备好数据队列,
以便调用 FreeRTOS_recvfrom() 函数来读取数据。
|
返回:
如果 xBlockTimeTicks 在套接字集中的套接字准备好被读取之前过期,
则返回 NULL。 否则,返回指向
包含已接收数据的套接字的句柄。 在返回的套接字句柄上调用 FreeRTOS_recvfrom()
将始终接收数据,
即使 FreeRTOS_recvfrom() 阻塞时间为零。
用法示例:
#include "FreeRTOS_sockets.h"
static void prvMultipleSocketRxTask( void *pvParameters )
{
xSocketSet_t xFD_Set;
xSocket_t xSocket;
struct freertos_sockaddr xAddress;
uint32_t xClientLength = sizeof( struct freertos_sockaddr ), x;
uint32_t ulReceivedValue = 0;
int32_t lBytes;
const TickType_t xRxBlockTime = 0;
xFD_Set = FreeRTOS_CreateSocketSet( selSELECT_QUEUE_SIZE );
for( x = 0; x < 2; x++ )
{
xSocket = FreeRTOS_socket( FREERTOS_AF_INET,
FREERTOS_SOCK_DGRAM,
FREERTOS_IPPROTO_UDP );
xAddress.sin_port = FreeRTOS_htons( 1000 + x );
FreeRTOS_bind( xSocket, &xAddress, sizeof( struct freertos_sockaddr ) );
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO,
&xRxBlockTime, sizeof( xRxBlockTime ) );
FreeRTOS_FD_SET( xSocket, xFD_Set );
}
for( ;; )
{
xSocket = FreeRTOS_select( xFD_Set, portMAX_DELAY );
configASSERT( xSocket );
lBytes = FreeRTOS_recvfrom( xSocket, &( ulReceivedValue ),
sizeof( uint32_t ), 0, &xAddress,
&xClientLength );
}
}
Example use of the FreeRTOS_close() API function
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.