下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。
自 FreeRTOS V10.1.0 开始,FreeRTOS+UDP 已从 (自 FreeRTOS V10.1.0 开始)。请参阅替代方案:FreeRTOS+TCP 堆栈 (此堆栈可配置为仅供 UDP 使用)。

FreeRTOS_select()

[FreeRTOS 嵌入式 IP 堆栈 API]

FreeRTOS_sockets.h
xSocket_t FreeRTOS_select( xSocketSet_t xSocketSet, TickType_t xBlockTimeTicks );
		

阻塞套接字集,直到套接字集的成员包含 可读取数据。

同时从多个套接字读取数据时,套接字集允许 应用程序任务阻塞。 任务不在单个套接字上阻塞, 而是在套接字集上阻塞。

要使用套接字集:

  1. 调用 FreeRTOS_CreateSocketSet() 创建套接字集。 套接字集相当于 Berkeley 套接字 fd_set 类型。

  2. 调用 FreeRTOS_FD_SET() 向套接字集添加一个或多个套接字。 FreeRTOS_FD_SET() 相当于 Berkeley 套接字 FD_SET() 宏。

  3. 调用 FreeRTOS_Select() 以测试套接字集中的套接字,检查其内是否包含任何 待读取数据。

  4. 从 FreeRTOS_select()(如有)返回的套接字中读取数据, 方法是照常调用 FreeRTOS_recvfrom()。
在任何时候,套接字都只能属于一个套接字集。

FreeRTOS_FD_CLR() 从套接字集中移除套接字。

参数:

xSocketSet   当前正在测试的套接字集。

xBlockTimeTicks   调用 任务将保持在阻塞状态(同时执行其他任务) 使调用任务保持在“已阻塞”状态(同时执行其他任务) 以等待套接字集成员准备好数据队列, 以便调用 FreeRTOS_recvfrom() 函数来读取数据。

返回:

如果 xBlockTimeTicks 在套接字集中的套接字准备好被读取之前过期, 则返回 NULL。 否则,返回指向 包含已接收数据的套接字的句柄。 在返回的套接字句柄上调用 FreeRTOS_recvfrom() 将始终接收数据, 即使 FreeRTOS_recvfrom() 阻塞时间为零。

用法示例:


/* FreeRTOS-Plus-UDP sockets include */
#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;

/* Create the set of sockets that will be passed into FreeRTOS_select(). */
xFD_Set = FreeRTOS_CreateSocketSet( selSELECT_QUEUE_SIZE );

/* Create two sockets to add to the set. */
for( x = 0; x < 2; x++ )
{
/* Create the socket. */
xSocket = FreeRTOS_socket( FREERTOS_AF_INET,
FREERTOS_SOCK_DGRAM,
FREERTOS_IPPROTO_UDP );

/* Bind the socket to a port number. */
xAddress.sin_port = FreeRTOS_htons( 1000 + x );
FreeRTOS_bind( xSocket, &xAddress, sizeof( struct freertos_sockaddr ) );

/* There should always be data available on the socket returned from
FreeRTOS_select() so blocking on a read is never necessary. Set the
Rx block time to 0. */

FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO,
&xRxBlockTime, sizeof( xRxBlockTime ) );

/* Add the created socket to the set. */
FreeRTOS_FD_SET( xSocket, xFD_Set );
}

for( ;; )
{
/* Wait for a socket from the set to become available for reading. */
xSocket = FreeRTOS_select( xFD_Set, portMAX_DELAY );

/* xSocket should never be NULL because FreeRTOS_select() was called
with an indefinite delay (assuming INCLUDE_vTaskSuspend is set to 1). */

configASSERT( xSocket );

/* Read from the socket - this read is guaranteed to return data. */
lBytes = FreeRTOS_recvfrom( xSocket, &( ulReceivedValue ),
sizeof( uint32_t ), 0, &xAddress,
&xClientLength );

/* Process the received data here. */
}
}

Example use of the FreeRTOS_close() API function
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.