首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自由RTOS循环队列

自由RTOS循环队列
EN

Stack Overflow用户
提问于 2022-04-05 09:29:50
回答 1查看 331关注 0票数 0

我有一个免费的RTOS队列,我想使用它作为循环队列。即。将元素添加到,然后满后,弹出队列的前面,然后推送到队列的后面。

代码语言:javascript
复制
[1]
[1,2]
[1,2,3]
[2,3,4] //queue full, so remove front and then push.

据我所知,这可以用

代码语言:javascript
复制
if(uxQueueSpacesAvailable(...)
{
    xQueueSend(...);
}
else
{
    xQueueReceive(...);
    xQueueSend(...);
}

但是我一点也不喜欢这个解决方案,在这里读取队列并不是真正描述性的或合乎逻辑的。它还会有更多的延误。

有什么更好的方法来实现这一点吗?

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

EN

回答 1

Stack Overflow用户

发布于 2022-04-05 10:24:34

我将创建一个标志,每当队列中没有更多的空间将其标记为true时,您只需访问标志(bool值),而不必访问整个队列。如果填充完后,您仍然期望队列释放空间,那么您可以更改这个空间,但是逻辑将开始变得更加麻烦,而且与当前解决方案相比,优势将微乎其微。所以..。

代码语言:javascript
复制
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的链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71749307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档