FreeRTOS-消息队列(二)

首先介绍三个函数:

1.消息队列创建函数

函 数 原 型:
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength,
							UBaseType_t uxItemSize );

功 能:用于创建一个新的队列。
参 数:
uxQueueLength: 队列能够存储的最大消息单元数目,即队列长度。
uxItemSize: 队列中消息单元的大小,以字节为单位。

返 回 值:
如果创建成功则返回一个队列句柄,用于访问创建的队列。 
如果创建不成功则返回NULL, 可能原因是创建队列需要的 RAM 无法分配成功。

2.消息队列发送函数

函 数 原 型
BaseType_t xQueueSend(QueueHandle_t xQueue,
					const void * pvItemToQueue,
					TickType_t xTicksToWait);
功 能:
		用于向队列尾部发送一个队列消息。
参 数
xQueue: 队列句柄。
pvItemToQueue: 指针,指向要发送到队列尾部的队列消息。
xTicksToWait: 
			被设置成 0,函数立刻返回。
			portMAX_DELAY 阻塞直到接收到消息
返 回 值
消息发送成功成功返回 pdTRUE,否则返回 errQUEUE_FULL。

3.消息队列接收函数

函 数 原 型
BaseType_t xQueueReceive(QueueHandle_t xQueue,
						 void *pvBuffer,
						TickType_t xTicksToWait);
功 能:
		用于从一个队列中接收消息, 并把接收的消息从队列中删除。
参 数
xQueue: 		队列句柄。
pvBuffer: 		指针,指向接收到要保存的数据。
xTicksToWait:
				0,立即返回
				portMAX_DELAY阻塞到有消息读出
队列接收成功返回 pdTRUE,否则返回 pdFALSE

4.代码

#include "main.h"


void AppTaskCreate(void);//声明
void Receive_Task(void* pvParameters);//声明
void Send_Task(void* pvParameters);//声明

TaskHandle_t AppTaskCreate_Handle = NULL;
TaskHandle_t Receive_Task_Handle = NULL;
TaskHandle_t Send_Task_Handle = NULL;
QueueHandle_t Test_Queue =NULL;
#define QUEUE_LEN 2
#define QUEUE_SIZE 4

int main(void)
{
	BSP_Config();             //板子初始化函数
	
	BaseType_t xReturn=pdPASS;//设置xreturn的初值
	xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,//任务入口函数
						"AppTaskCreate",// 任务名字
						64,//任务栈大小
						NULL,//任务入口函数参数
						1,//任务的优先级
						&AppTaskCreate_Handle);//创建一个总任务
	if(xReturn==pdPASS)
	{
	  printf("任务启动成功,开始调度\r\n");
	  vTaskStartScheduler();  //任务调度,比较任务优先级
	}
	else//不会执行
		return -1;
}
/************************************************
函数名称:AppTaskCreate
函数作用:总任务调度函数
函数参数:无
函数返回值:无
************************************************/
void AppTaskCreate(void)
{
	taskENTER_CRITICAL();//开启临界段
	BaseType_t xReturn=pdPASS;//创建任务返回值
		
	Test_Queue = xQueueCreate(QUEUE_LEN,QUEUE_SIZE);//创建消息队列
	if(Test_Queue != NULL)
		printf("创建 Test_Queue 消息队列成功!\r\n");

	
	xReturn = xTaskCreate(Receive_Task,//任务入口函数
						"Receive_Task",//任务名字
						 64,//任务栈大小
						 NULL,//任务入口函数参数
						 2,//任务的优先级
						 &Receive_Task_Handle);//任务控制块
	if(xReturn == pdPASS)
		printf("创建 Receive_Task 任务成功!\r\n");

	
	xReturn = xTaskCreate(Send_Task,//任务入口函数
						 "Send_Task",//任务名字
						 64,//任务栈大小
						 NULL,//任务入口函数参数
						 3,//任务的优先级
						 &Send_Task_Handle);//任务控制块
	if(xReturn == pdPASS)
		printf("创建 Send_Task 任务成功! \r\n");
	
	vTaskDelete(AppTaskCreate_Handle);//删除任务
	taskEXIT_CRITICAL();//退出临界段
}
/************************************************
函数名称:Receive_Task
函数作用:接收任务调度函数
函数参数:pvParameters
函数返回值:无
************************************************/
void Receive_Task(void* parameter)
{
	BaseType_t xReturn=pdPASS;
	uint32_t r_queue;
	
	while(1)
	{		
	xReturn = xQueueReceive(Test_Queue,//消息队列的句柄
							&r_queue,//接收的消息内容
							portMAX_DELAY);//等待时间 一直等
							
		if(xReturn == pdPASS)
			printf("r_queue本次接收到的数据是 %d \r\n",r_queue);
		else
			printf("接收失败\r\n");
	}
}
/************************************************
函数名称:Send_Task
函数作用:发送任务调度函数
函数参数:pvParameters
函数返回值:无
************************************************/
void Send_Task(void* pvParameters)
{
	BaseType_t xReturn = pdPASS;
	uint32_t send_data1 = 1;
	uint32_t send_data2 = 2;
	uint32_t data =0;
	while(1)
	{
		if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))
		{
			data = USART_ReceiveData(USART1);

			if(data == send_data1)
			{
				xReturn = xQueueSend(Test_Queue,//消息队列的句柄
									 &send_data1,//发送的消息内容
									 0);// 等待时间 0
									 
				if(xReturn == pdPASS)
				printf("消息 send_data1 发送成功!\r\n");
			}
			else if(data == send_data2)
			{
				xReturn = xQueueSend(Test_Queue,//消息队列的句柄
									&send_data2,//发送的消息内容
									0);// 等待时间 0
				if(xReturn == pdPASS)
					printf("消息 send_data2 发送成功!\r\n");
			}
		}
		vTaskDelay(20);
	}
}


void BSP_Config(void)
{
	led_Config();//配置LED灯
	beep_Config();//蜂鸣器
	key_Config();
	USART_Config();
	printf("串口初始化成功\r\n");
}

总结

我看的是野火的文档,赞一个把哈哈,需要的话评论一下。其实也可以自己找,很容易找到的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值