目录
- 四、队列
- 2.1 概念
- 2.2 创建队列
- 2.3 写队列
- 2.4 读队列
- 2.5 队列集(可跳过)
四、队列
该部分在上份代码基础上修改得来,代码下载链接:
https://wwzr.lanzout.com/iBNAS1l75bvc 密码:7xy2
该代码尽量做到最简,不添加多余的、不规范的代码。
内容主要包括:
(1)队列的概念、创建、写队列、读队列
(2)队列集(可跳过)
最终实现效果:
(1)任务1写队列,任务2读队列。
(2)任务1、任务2 写队列并使用队列集,任务3读队列集(可跳过)
2.1 概念
队列是一种用于在任务之间传递数据的强大机制。队列提供了一种安全且高效的方式,允许一个任务将数据发送到队列,而另一个任务则从队列中接收数据。
使用场景:
- 任务间通信: 通过队列,一个任务可以将数据发送给另一个任务,实现任务间的通信。
- 生产者-消费者模型: 队列常用于生产者任务生成数据,然后通过队列传递给消费者任务进行处理。
- 实现有限缓冲区: 队列可以用于实现有限的缓冲区,限制生产者和消费者的速度。
2.2 创建队列
使用xQueueCreate
函数来创建一个队列。函数原型如下:
QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength, UBaseType_t uxItemSize);
/*
uxQueueLength:队列的长度,表示队列中可以存储的元素个数。
uxItemSize:每个队列元素的大小,以字节为单位。
*/
示例:
// 定义队列句柄
QueueHandle_t g_xQueueTest;
// 创建队列,大小为5个int元素
g_xQueueTest= xQueueCreate(5, sizeof(int));
这将创建一个能够存储5个int
类型元素的队列。
2.3 写队列
使用xQueueSend
函数向队列发送数据。函数原型如下:
BaseType_t xQueueSend(QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait);
/*
xQueue:目标队列的句柄。
pvItemToQueue:指向要发送的数据的指针。
xTicksToWait:发送超时时间,若为0,则一直等待;若为portMAX_DELAY,则无限等待;其他情况表示等待的时钟节拍数。
*/
示例
int data = 42;
// 发送数据到队列,如果队列已满,则阻塞
xQueueSend(g_xQueueTest, &data, portMAX_DELAY);
2.4 读队列
使用xQueueReceive
函数从队列接收数据。函数原型如下:
BaseType_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait);
/*
xQueue:目标队列的句柄。
pvBuffer:接收数据的缓冲区指针。
xTicksToWait:接收超时时间,若为0,则立即返回;若为portMAX_DELAY,则无限等待;其他情况表示等待的时钟节拍数。
*/
示例
int receivedData;
// 从队列接收数据,如果为空,则阻塞
xQueueReceive(g_xQueueTest, &receivedData, portMAX_DELAY);
实例:
创建队列、创建任务12
任务1写队列,如果满了就阻塞。
任务2读队列,如果空了就阻塞。
现象是:代码设置的是任务1 写队列较快,所以现象是任务1 的cnt很快的加到20(20为我们创建的队列最大长度),然后阻塞,等任务2 去读队列,任务2每次读一个数据,队列就变为非空,任务1就被唤醒,cnt就++。
2.5 队列集(可跳过)
队列集(需要改FreeRTOSConfig.h)