【FreeRTOS】小白进阶之如何使用FreeRTOS Queue Set(三)

介绍 queue set 的基础使用。

1、头文件声明和任务定义

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "supporting_functions.h"

void vSenderTask1( void *pvParameters );
void vSenderTask2( void *pvParameters );

void vReceiverTask( void *pvParameters );

// 定义两个队列
static QueueHandle_t xQueue1 = NULL, xQueue2 = NULL;

// 定义队列 set
static QueueSetHandle_t xQueueSet = NULL;

2、任务创建

int main( void )
{
	// 创建两个队列
    xQueue1 = xQueueCreate( 1, sizeof( char * ) );
	xQueue2 = xQueueCreate( 1, sizeof( char * ) );

	// 创建队列 set
	xQueueSet = xQueueCreateSet( 1 * 2 );

	// 加队列到队列 set 中
	xQueueAddToSet( xQueue1, xQueueSet );
	xQueueAddToSet( xQueue2, xQueueSet );

	// 创建发送任务
	xTaskCreate( vSenderTask1, "Sender1", 1000, NULL, 1, NULL );
	xTaskCreate( vSenderTask2, "Sender2", 1000, NULL, 1, NULL );

	// 创建接收任务
	xTaskCreate( vReceiverTask, "Receiver", 1000, NULL, 2, NULL );

	vTaskStartScheduler();

	for( ;; );
	return 0;
}

3、队列发送任务

static void vSenderTask1( void *pvParameters )
{
   const TickType_t xBlockTime = pdMS_TO_TICKS( 100 );
   const char * const pcMessage = "Message from vSenderTask1\r\n";

	for( ;; )
	{
		vTaskDelay( xBlockTime );

		xQueueSend( xQueue1, &pcMessage, 0 );
	}
}

static void vSenderTask2( void *pvParameters )
{
    const TickType_t xBlockTime = pdMS_TO_TICKS( 200 );
    const char * const pcMessage = "Message from vSenderTask2\r\n";

	for( ;; )
	{
		vTaskDelay( xBlockTime );

		xQueueSend( xQueue2, &pcMessage, 0 );
	}
}

4、队列接收任务

static void vReceiverTask( void *pvParameters )
{
    QueueHandle_t xQueueThatContainsData;
    char *pcReceivedString;

	for( ;; )
	{
		// 等待 queue set 数据
		xQueueThatContainsData = ( QueueHandle_t ) xQueueSelectFromSet( xQueueSet, portMAX_DELAY );

		// 接收数据
		xQueueReceive( xQueueThatContainsData, &pcReceivedString, 0 );

		vPrintString( pcReceivedString );
	}
}

 

你可能感兴趣的:(FreeRTOS系统开发)