本文主要是介绍RTOS笔记——队列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
队列
队列的本质就是环形缓冲区,在环形缓冲区的基础上增加了一些保护措施和阻塞唤醒机制,而因为增加了保护机制因此环形缓冲区中有读写位置和数据个数
从读的一方理解队列运行逻辑:有任务AB,任务B需要等待任务A计算获取数据后再运行,任务B读队列为空时进入休眠,设置等待时间,在等待时间内任务A计算完成将数据放置于缓冲区就会将B唤醒,如果等待时间超时则由tick中断自动唤醒并返回错误。
从写的一方理解队列运行逻辑:任务A写队列但是有可能队列已经满了,可以在队列满的时候设置阻塞时间,在任务B读取一个数据后将会唤醒任务A,也可以超时后tick中断唤醒并返回错误
总结:队列包含两个部分:1.环形缓冲区 2.两个链表(Sender List,Receiver List)分别用于存放读写任务的阻塞状态
操作队列就只需要三个函数:创建队列,读队列,写队列
1.创建队列
/* 动态分配 */
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );/* 静态分配 */
QueueHandle_t xQueueCreateStatic(UBaseType_t uxQueueLength,
UBaseType_t uxItemSize,
uint8_t *pucQueueStorageBuffer,StaticQueue_t *pxQueueBuffer);
2.读队列
BaseType_t xQueueReceive( QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait );BaseType_t xQueueReceiveFromISR(QueueHandle_t xQueue,
void *pvBuffer,
BaseType_t *pxTaskWoken);
3.写队列
/* 等同于xQueueSendToBack
* 往队列尾部写入数据,如果没有空间,阻塞时间为xTicksToWait
*/
BaseType_t xQueueSend(QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait);
/*
* 往队列尾部写入数据,如果没有空间,阻塞时间为xTicksToWait
百问网
138
*/
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);
队列集
要支持多个输入设备时,我们需要实现一个“InputTask”,它读取各个设备的队列,得 到数据后再分别转换为游戏的控制键。
InputTask 如何及时读取到多个队列的数据?要使用队列集。 队列集的本质也是队列,只不过里面存放的是“队列句柄”。
使用过程如下: a. 创建队列 A,它的长度是 n1 b. 创建队列 B,它的长度是 n2 c. 创建队列集 S,它的长度是“n1+n2” d. 把队列 A、B 加入队列集 S e. 这样,写队列 A 的时候,会顺便把队列 A 的句柄写入队列集 S f. 这样,写队列 B 的时候,会顺便把队列 B 的句柄写入队列集 S g. InputTask 先读取队列集 S,它的返回值是一个队列句柄,这样就可以知道哪个队列有 有数据了;然后 InputTask 再读取这个队列句柄得到数据。
这篇关于RTOS笔记——队列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!