目录
一、简介
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); //窥视