FreeRTOS队列创建、发送和接收(备忘)

目录

一、简介

1.1、开发环境

1.2、功能说明

二、动态创建队列

2.1、头文件声明

2.2、工程文件定义

2.3、创建队列

三、静态创建队列

3.1、头文件声明

3.2、工程文件定义

3.3、创建队列

四、写入消息

4.1、定义缓存变量

4.2、后向入队

4.3、前向入队

4.4、覆盖入队

五、读取消息

5.2、出队

5.3、窥视


一、简介

1.1、开发环境

STM32CubeIDE V1.9,FreeRTOS CMSIS_V1。

1.2、功能说明

FreeRTOS队列创建、发送和接收的API范例。编程时复制使用,把“Example"全部替换成所需名称,高效统一。

二、动态创建队列

2.1、头文件声明

extern QueueHandle_t EXAMPLE_QUEUE_HANDLE;						//队列句柄
typedef uint8_t EXAMPLE_QUEUE_ITEM;								//队列项目定义类型
#define EXAMPLE_QUEUE_LENGTH	1								//队列项目长度
#define EXAMPLE_QUEUE_SIZE		sizeof(EXAMPLE_QUEUE_ITEM)		//队列项目字节数
#define EXAMPLE_QUEUE_TYPE		queueQUEUE_TYPE_BASE			//队列类型

队列类型共6种:

1)queueQUEUE_TYPE_BASE(普通的消息队列);

2)queueQUEUE_TYPE_SET(队列集);

3)queueQUEUE_TYPE_MUTEX(互斥信号量);

4)queueQUEUE_TYPE_COUNTING_SEMAPHORE(计数型信号量);

5)queueQUEUE_TYPE_BINARY_SEMAPHORE(二值信号量);

6)queueQUEUE_TYPE_RECURSIVE_MUTEX(递归互斥信号量)。

2.2、工程文件定义

QueueHandle_t EXAMPLE_QUEUE_HANDLE;							//队列句柄定义

2.3、创建队列

使用xQueueCreate()创建队列(类型为queueQUEUE_TYPE_BASE):

EXAMPLE_QUEUE_HANDLE = xQueueCreate(					//创建队列
							EXAMPLE_QUEUE_LENGTH,		//队列项目长度
							EXAMPLE_QUEUE_SIZE);		//队列项目字节数

使用xQueueGenericCreate()创建队列:

EXAMPLE_QUEUE_HANDLE = xQueueGenericCreate(				//创建队列
							EXAMPLE_QUEUE_LENGTH,		//队列项目长度
							EXAMPLE_QUEUE_SIZE,			//队列项目字节数
							EXAMPLE_QUEUE_TYPE);		//队列类型

注:队列创建成功,返回数据位队列句柄;创建失败,返回NULL。

三、静态创建队列

3.1、头文件声明

extern QueueHandle_t EXAMPLE_QUEUE_HANDLE;						                //队列句柄
typedef uint8_t EXAMPLE_QUEUE_ITEM;								                //队列项目定义类型
#define EXAMPLE_QUEUE_LENGTH	1								                //队列项目长度
#define EXAMPLE_QUEUE_SIZE		sizeof(EXAMPLE_QUEUE_ITEM)		                //队列项目字节数
extern uint8_t ExampleQueueStorage[EXAMPLE_QUEUE_LENGTH * EXAMPLE_QUEUE_SIZE];	//队列项目存储区
extern StaticQueue_t EXAMPLE_STATIC_QUEUE;                                      //队列结构体保存变量
#define EXAMPLE_QUEUE_TYPE		queueQUEUE_TYPE_BASE			                //队列类型

3.2、工程文件定义

QueueHandle_t EXAMPLE_QUEUE_HANDLE;							            //队列句柄定义
uint8_t ExampleQueueStorage[EXAMPLE_QUEUE_LENGTH * EXAMPLE_QUEUE_SIZE];	//队列存储区
StaticQueue_t EXAMPLE_STATIC_QUEUE;                                     //队列结构体保存变量

3.3、创建队列

使用xQueueCreateStatic()创建队列(类型为queueQUEUE_TYPE_BASE):

EXAMPLE_QUEUE_HANDLE = xQueueCreateStatic(            //创建队列
							EXAMPLE_QUEUE_LENGTH,     //队列项目长度
							EXAMPLE_QUEUE_SIZE,       //队列项目字节数
							ExampleQueueStorage,      //队列项目存储区
							&EXAMPLE_STATIC_QUEUE);   //队列结果体保存变量

使用xQueueGenericCreateStatic()创建队列:

EXAMPLE_QUEUE_HANDLE = xQueueGenericCreateStatic(    //创建队列
							EXAMPLE_QUEUE_LENGTH,    //队列项目长度
							EXAMPLE_QUEUE_SIZE,      //队列项目字节数
							ExampleQueueStorage,     //队列存储区
							&EXAMPLE_STATIC_QUEUE,   //队列结构体保存变量
							EXAMPLE_QUEUE_TYPE);     //队列类型

返回值:队列创建成功,返回数据为队列句柄;创建失败,返回NULL。

四、写入消息

4.1、定义缓存变量

EXAMPLE_QUEUE_ITEM i = 0;                    //定义变量i,用来作为队列发送缓存

4.2、后向入队

后向入队:向队尾写入一条消息。

有以下3种方式:

语句1:

xQueueSend(EXAMPLE_QUEUE_HANDLE, &i, 0);            //后向入队

语句2:

xQueueSendToBack(EXAMPLE_QUEUE_HANDLE, &i, 0);        //后向入队

语句3:

xQueueGenericSend(EXAMPLE_QUEUE_HANDLE, &i, 0, queueSEND_TO_BACK);        //后向入队

注:上述语句,仅适用于任务中;中断中使用需在函数名后面加“FromISR”,如:

xQueueSendFromISR(EXAMPLE_QUEUE_HANDLE, &i, 0);                              //中断后向入队
xQueueSendToBackFromISR(EXAMPLE_QUEUE_HANDLE, &i, 0);                        //中断后向入队
xQueueGenericSendFromISR(EXAMPLE_QUEUE_HANDLE, &i, 0, queueSEND_TO_BACK);    //中断后向入队

返回值:pdTRUE(入队成功);errQUEUE_FULL(队列已满,入队失败)。

4.3、前向入队

前向入队:向队列头写入一条消息。

有以下2种方式:

语句1:

xQueueSendToFront(EXAMPLE_QUEUE_HANDLE, &i, 0);        //前向入队

语句2:

xQueueGenericSend(EXAMPLE_QUEUE_HANDLE, &i, 0, queueSEND_TO_FRONT);        //前向入队

注:上述语句,仅适用于任务中;中断中使用需在函数名后面加“FromISR”,如:

xQueueSendToFrontFromISR(EXAMPLE_QUEUE_HANDLE, &i, 0);                        //前向入队
xQueueGenericSendFromISR(EXAMPLE_QUEUE_HANDLE, &i, 0, queueSEND_TO_FRONT);    //前向入队

返回值:pdTRUE(入队成功);errQUEUE_FULL(队列已满,入队失败)。

4.4、覆盖入队

覆盖入队:向队列写入一条消息,如果队列已满,直接覆盖旧消息。

有以下2种方式:

语句1:

xQueueOverwrite(EXAMPLE_QUEUE_HANDLE, &i);                //覆盖入队

语句2:

xQueueGenericSend(EXAMPLE_QUEUE_HANDLE, &i, 0, queueOVERWRITE);        //覆盖入队

注:上述语句,仅适用于任务中;中断中使用需在函数名后面加“FromISR”,如:

xQueueOverwriteFromISR(EXAMPLE_QUEUE_HANDLE, &i);                         //覆盖入队
xQueueGenericSendFromISR(EXAMPLE_QUEUE_HANDLE, &i, 0, queueOVERWRITE);    //覆盖入队

返回值:pdTRUE(入队成功)。如果队列已满,会直接覆盖旧的数据,所以必定入队成功。

五、读取消息

5.1、定义缓存变量

EXAMPLE_QUEUE_ITEM i = 0;                    //定义变量i,用来作为队列接收缓存

5.2、出队

出队:从队列读取一条消息,读取成功后,将这条消息从队列中移除。

xQueueReceive(EXAMPLE_QUEUE_HANDLE, &i, portMAX_DELAY);        //出队

portMAX_DELAY:持续等待。

注:上述语句,仅适用于任务中;中断中使用需在函数名后面加“FromISR”,如:

xQueueReceiveFromISR(EXAMPLE_QUEUE_HANDLE, &i, portMAX_DELAY);        //出队

返回值:pdTRUE(出队成功);pdFALSE(出队失败)。

5.3、窥视

窥视:从队列中读取一条消息,读取成功后,不移除该消息。

xQueuePeek(EXAMPLE_QUEUE_HANDLE, &i, portMAX_DELAY);            //窥视

注:上述语句,仅适用于任务中;中断中使用需在函数名后面加“FromISR”,如:

xQueuePeekFromISR(EXAMPLE_QUEUE_HANDLE, &i, portMAX_DELAY);            //窥视

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

洪恒远

感君意气无所惜,一为歌行歌主客

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

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

打赏作者

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

抵扣说明:

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

余额充值