当前位置: 首页 > article >正文

08-1_队列的理论讲解

08-1_队列的理论讲解

队列概念理解

队列就是一个传送带,就是一个流水线

image-20250108160247588

工人放入的数据, 放在传送带上,送给消费者, 消费者第一次拿到的数据,就是工人第一次放上的数据(类比队列,先进先出)

freertos队列应用思考

队列对于消费者(取数据):

(1)当队列没有数据, 消费者需要进入阻塞状态

(2)当队列有数据后, 队列要通知需要数据的消费者

得出结论:

freertos队列 额外功能: 等待有新数据,通知要读数据的任务

队列对于生产者(存数据):

(1)当队列满的时候, 如果再加入数据, 就会覆盖缓冲区数据

所以需要让生产者进入 阻塞状态(等待)

得出结论:

freertos队列 额外功能: 等待有新空间,通知要写数据的任务

队列的本质

队列是环形缓冲区

image-20250108163116547

创建队列

image-20250108163623709

初始的时候, pcHead 和 pcWriteTo 都会指向队列的头部

image-20250108170139394

写队列

* 往队列尾部写入数据,如果没有空间,阻塞时间为 xTicksToWait
*/
BaseType_t xQueueSend(
 QueueHandle_t xQueue,
 const void *pvItemToQueue,
 TickType_t xTicksToWait
 );
/* 
* 往队列尾部写入数据,如果没有空间,阻塞时间为 xTicksToWait
*/
BaseType_t xQueueSendToBack(
 QueueHandle_t xQueue,
 const void *pvItemToQueue,
 TickType_t xTicksToWait
 );
/* 
* 往队列尾部写入数据,此函数可以在中断函数中使用,不可阻塞
*/
BaseType_t xQueueSendToBackFromISR(
 QueueHandle_t xQueue,
 const void *pvItemToQueue,
 BaseType_t *pxHigherPriorityTaskWoken
 );
/* 
* 往队列头部写入数据,如果没有空间,阻塞时间为 xTicksToWait
*/
BaseType_t xQueueSendToFront(
 QueueHandle_t xQueue,
 const void *pvItemToQueue,
 TickType_t xTicksToWait
 );
/* 
* 往队列头部写入数据,此函数可以在中断函数中使用,不可阻塞
*/
BaseType_t xQueueSendToFrontFromISR(
 QueueHandle_t xQueue,
 const void *pvItemToQueue,
 BaseType_t *pxHigherPriorityTaskWoken
 );

读队列

使用 xQueueReceive()函数读队列,读到一个数据后,队列中该数据会被移除。这个
函数有两个版本:在任务中使用、在 ISR 中使用。函数原型如下:

BaseType_t xQueueReceive( QueueHandle_t xQueue,
 void * const pvBuffer,
 TickType_t xTicksToWait );
BaseType_t xQueueReceiveFromISR(
 QueueHandle_t xQueue,
 void *pvBuffer,
 BaseType_t *pxTaskWoken
 );

image-20250108170246242

当等待的时候, 环形任务, 是唤醒优先级最高的任务


http://www.kler.cn/a/472957.html

相关文章:

  • C语言初阶习题【25】strcpy的模拟实现
  • 2、蓝牙打印机点灯-GPIO输出控制
  • 道品科技智慧农业与云平台:未来农业的变革之路
  • Maven 详细配置:Maven 项目 POM 文件解读
  • 30天开发操作系统 第 12 天 -- 定时器
  • 嵌入式中QT实现文本与线程控制方法
  • 【Uniapp-Vue3】使用ref定义响应式数据变量
  • C# 中await和async的用法(二)
  • y7000p2023AX211ubuntu20无线网卡驱动
  • 【人工智能计算机视觉】——深入详解人工智能计算机视觉之图像处理之基础图像处理技术
  • UE 5.3 C++ 管理POI 如何对WidgetComponent 屏幕模式进行点击
  • 详述 VScode wkhtmltopdf 实现 markdown 转带目录标签(导航栏)的 PDF
  • k8s里面etcd的作用
  • 后端Java开发:第十二天
  • AI大模型-提示工程学习笔记4
  • 【实用技能】如何使用 .NET C# 中的 Azure Key Vault 中的 PFX 证书对 PDF 文档进行签名
  • 【UE5 C++课程系列笔记】24——多线程基础——Async
  • MySQL - 子查询和相关子查询详解
  • 低代码平台的集成与扩展性详解
  • 【DevOps工具篇】 SonarQube详解
  • Python Json格式数据处理
  • Swift语言的网络编程
  • cp命令详解
  • JAVA学习-练习试用Java实现“从用户输入获取一个字符串,并使用replace方法将字符串中的所有空格替换为下划线”
  • 深度学习中的卷积和反卷积(一)——卷积的介绍
  • client-go中watch机制的一些陷阱