【RTOS】快速体验FreeRTOS所有常用API(4)队列

发布时间:2024年01月15日

四、队列

该部分在上份代码基础上修改得来,代码下载链接:

https://wwzr.lanzout.com/iBNAS1l75bvc 密码:7xy2

该代码尽量做到最简,不添加多余的、不规范的代码。

内容主要包括

(1)队列的概念、创建、写队列、读队列

(2)队列集(可跳过)

最终实现效果:

(1)任务1写队列,任务2读队列。

(2)任务1、任务2 写队列并使用队列集,任务3读队列集(可跳过)

img

2.1 概念

队列是一种用于在任务之间传递数据的强大机制。队列提供了一种安全且高效的方式,允许一个任务将数据发送到队列,而另一个任务则从队列中接收数据。

使用场景

  1. 任务间通信: 通过队列,一个任务可以将数据发送给另一个任务,实现任务间的通信。
  2. 生产者-消费者模型: 队列常用于生产者任务生成数据,然后通过队列传递给消费者任务进行处理。
  3. 实现有限缓冲区: 队列可以用于实现有限的缓冲区,限制生产者和消费者的速度。

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

img

任务1写队列,如果满了就阻塞。

任务2读队列,如果空了就阻塞。

现象是:代码设置的是任务1 写队列较快,所以现象是任务1 的cnt很快的加到20(20为我们创建的队列最大长度),然后阻塞,等任务2 去读队列,任务2每次读一个数据,队列就变为非空,任务1就被唤醒,cnt就++。

img

2.5 队列集(可跳过)

队列集(需要改FreeRTOSConfig.h)

文章来源:https://blog.csdn.net/weixin_44029896/article/details/135611045
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。