免费RTOS循环队列



我有一个Free RTOS队列,我想将其用作循环队列。即向添加元素,然后在元素满后,弹出队列的前面,然后推到队列的后面。

[1]
[1,2]
[1,2,3]
[2,3,4] //queue full, so remove front and then push.

据我所知,这可以使用完成

if(uxQueueSpacesAvailable(...)
{
xQueueSend(...);
}
else
{
xQueueReceive(...);
xQueueSend(...);
}

但我一点也不喜欢这个解决方案,在这里读取队列并不是真正的描述性或逻辑性的。它也有额外的延迟。

有没有更好的方法来实现这一点?

此外,是否有任何方法可以访问队列中的所有元素,而不删除它们?

我会创建一个标志,每当队列中没有更多空间将其标记为true时,您只需要访问标志(bool值(,而不是整个队列。如果一旦填满,您仍然希望您的队列能够释放空间,那么您可以更改这一点,但逻辑会变得有点麻烦,与当前解决方案相比,优势将微乎其微。所以…

bool full = false;
if (full) {
xQueueReceive(...);
xQueueSend(...);
}
else
{
xQueueSend(...);
if (!uxQueueSpacesAvailable(...)) {
full = true;
}
}

关于是否可以在不删除元素的情况下读取整个队列,答案是肯定的和否定的,没有真正的Api调用,有xQueuePeek,您可以使用它来查看而不删除下一个,但仅限于此。您可以使用xQueuePeek查看第一个元素的大小和位置(显然是内存方面的(,这样您就可以定位下一个元素,然后重复,但这次手动查看存储的数据,这里有一个类似实现的链接https://www.freertos.org/FreeRTOS_Support_Forum_Archive/May_2016/freertos_How_to_traverse_a_queue_0be515fcj.html

最新更新