08-1_队列的理论讲解

发布于:2025-02-10 ⋅ 阅读:(58) ⋅ 点赞:(0)

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

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


网站公告

今日签到

点亮在社区的每一天
去签到