【FreeRTOS】小白进阶之如何使用FreeRTOS消息队列发送和接收数据(二)

创建两个发送队列数据任务和一个接收队列数据任务。

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

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

static void vSenderTask( void *pvParameters );
static void vReceiverTask( void *pvParameters );

// 创建队列变量
QueueHandle_t xQueue;

typedef enum
{
	eSender1,
	eSender2
} DataSource_t;

// 数据结构
typedef struct
{
	uint8_t ucValue;
	DataSource_t eDataSource;
} Data_t;

// 要发送的队列数据
static const Data_t xStructsToSend[ 2 ] =
{
	{ 100, eSender1 },
	{ 200, eSender2 }
};

2、创建任务

int main( void )
{
    xQueue = xQueueCreate( 3, sizeof( Data_t ) );

	if( xQueue != NULL )
	{
		xTaskCreate( vSenderTask, "Sender1", 1000, ( void * ) &( xStructsToSend[ 0 ] ), 2, NULL );
		xTaskCreate( vSenderTask, "Sender2", 1000, ( void * ) &( xStructsToSend[ 1 ] ), 2, NULL );

		// 任务优先级较低,队列满时才会接收数据
  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
使用FreeRTOS进行消息队列接收不定长数据的过程中,可以采用动态分配内存的方式来实现。 首先,需要创建一个消息队列(Queue)以接收不定长数据。可以通过调用xQueueCreate函数来创建一个消息队列,并指定队列的长度和每个消息的大小。在此情况下,每个消息的大小可以设置为合适的最大长度。 然后,在发送消息的任务中,可以首先根据不定长数据的长度动态分配内存空间。可以使用pvPortMalloc函数来分配所需的内存大小,并将其作为消息发送消息队列中。这样,接收消息的任务就可以通过从消息队列中接收消息来获取不定长数据。 在接收消息的任务中,可以先使用uxQueueMessagesWaiting函数来获取还未读取的消息数量。然后,可以使用xQueueReceive函数来从消息队列中接收消息。在接收到消息后,可以根据接收到的数据长度进行相应的处理。 接收消息的任务需要根据接收到的消息长度动态分配内存空间,可以使用pvPortMalloc函数来分配所需的内存大小,并将接收到的数据复制到分配的内存空间中。最后,在处理完接收到的数据后,需要使用vPortFree函数释放分配的内存空间,以防止内存泄漏。 需要注意的是,在使用动态分配内存的情况下,必须小心处理内存分配和释放的问题,以避免内存泄漏或过多的内存碎片问题。可以根据实际需求和系统资源来调整消息队列的长度和内存大小,以确保系统的正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

产品人卫朋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值