08-1_队列的理论讲解
08-1_队列的理论讲解
队列概念理解
队列就是一个传送带,就是一个流水线
工人放入的数据, 放在传送带上,送给消费者, 消费者第一次拿到的数据,就是工人第一次放上的数据(类比队列,先进先出)
freertos队列应用思考
队列对于消费者(取数据):
(1)当队列没有数据, 消费者需要进入阻塞状态
(2)当队列有数据后, 队列要通知需要数据的消费者
得出结论:
freertos队列 额外功能: 等待有新数据,通知要读数据的任务
队列对于生产者(存数据):
(1)当队列满的时候, 如果再加入数据, 就会覆盖缓冲区数据
所以需要让生产者进入 阻塞状态(等待)
得出结论:
freertos队列 额外功能: 等待有新空间,通知要写数据的任务
队列的本质
队列是环形缓冲区
创建队列
初始的时候, pcHead 和 pcWriteTo 都会指向队列的头部
写队列
* 往队列尾部写入数据,如果没有空间,阻塞时间为 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
);
当等待的时候, 环形任务, 是唤醒优先级最高的任务