crQUEUE_RECEIVE
[协程专用]
croutine.h
void crQUEUE_RECEIVE(
CoRoutineHandle_t xHandle,
QueueHandle_t xQueue,
void *pvBuffer,
TickType_t xTicksToWait,
BaseType_t *pxResult
)
crQUEUE_RECEIVE 是一个宏。 上面原型中的数据类型仅供参考。
该宏的 crQUEUE_SEND() 和 crQUEUE_RECEIVE() 是协程,
相当于任务使用的 xQueueSend() 和 xQueueReceive() 函数。
crQUEUE_SEND 和 crQUEUE_RECEIVE 只能在协程中使用,
而 xQueueSend() 和 xQueueReceive() 只能在任务中使用。 注意,协程
只能向其他协程发送数据。 协程不能使用队列将数据发送到任务,
任务,反之亦然。
crQUEUE_RECEIVE 只能从协程函数本身调用,不能
从协程函数调用的函数中调用。 这是因为
协程无法维持自己的堆栈。
请参阅网络文档的协程部分,了解有关
了解有关在任务和协程之间以及在 ISR 和
协程之间传递数据的信息。
- 参数:
-
xHandle | 调用协程的句柄。 这是协程函数的 xHandle 参数。 |
xQueue | 接收数据的队列的句柄。 使用 xQueueCreate() API 函数创建队列时,句柄作为返回值获得。 |
pvBuffer | 容纳接收项副本的缓冲区。创建队列时,将指定每个队列项的字节数。 此字节数已复制到 pvBuffer。 |
xTickToDelay | 在无立即可用的数据的情况下,协程阻塞以等待队列中可用数据时的 tick 数。此时的实际时间由 configTICK_RATE_HZ(在 FreeRTOSConfig.h 中设置)定义。 常量 portTICK_PERIOD_MS 可用于将 tick 转换为毫秒(请参阅 crQUEUE_SEND 示例)。 |
pxResult | 如果从队列中成功检索到数据,则 pxResult 指向的变量将被设置为 pdPASS,否则将设置为 ProjDefs.h 中定义的错误代码。 |
用法示例:
// A co-routine receives the number of an LED to flash from a queue. It
// blocks on the queue until the number is received.
static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle,
UBaseType_t uxIndex )
{
// Variables in co-routines must be declared static if they must maintain
// value across a blocking call.
static BaseType_t xResult;
static UBaseType_t uxLEDToFlash;
// All co-routines must start with a call to crSTART().
crSTART( xHandle );
for( ;; )
{
// Wait for data to become available on the queue.
crQUEUE_RECEIVE( xHandle,
xCoRoutineQueue,
&uxLEDToFlash,
portMAX_DELAY,
&xResult );
if( xResult == pdPASS )
{
// We received the LED to flash - flash it!
vParTestToggleLED( uxLEDToFlash );
}
}
crEND();
}
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|