我有一个免费的RTOS队列,我想使用它作为循环队列。即。将元素添加到,然后满后,弹出队列的前面,然后推送到队列的后面。
[1]
[1,2]
[1,2,3]
[2,3,4] //queue full, so remove front and then push.据我所知,这可以用
if(uxQueueSpacesAvailable(...)
{
xQueueSend(...);
}
else
{
xQueueReceive(...);
xQueueSend(...);
}但是我一点也不喜欢这个解决方案,在这里读取队列并不是真正描述性的或合乎逻辑的。它还会有更多的延误。
有什么更好的方法来实现这一点吗?
此外,是否有任何方法访问队列中的所有元素,而不删除它们?
发布于 2022-04-05 10:24:34
我将创建一个标志,每当队列中没有更多的空间将其标记为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的链接
https://stackoverflow.com/questions/71749307
复制相似问题