我正在尝试使用 aqueue
将我的 UART ISR 中的字符缓冲到后台任务。我希望队列长度为 512 字节。不幸的是,这是不可能的,因为 size 参数的类型unsigned portBASE_TYPE
对于 xmega256a3 来说是单字节 ( char
)。队列的最大大小浮动是否有原因portBASE_TYPE
?而不是uint16_t?
我很好奇其他人是否也遇到了同样的限制,如果有的话,他们做了什么。
Richard Barry(FreeRTOS 作者)在 FreeRTOS 邮件列表上发布了以下回复:
这仅适用于 8 位架构。它已经被提及过几次(您可以在 FreeRTOS 网站上搜索支持档案),但多年来没有提及,因为大多数新项目都使用 32 位架构。简单的做法是在 portmacro.h 中更改 portBASE_TYPE 的定义,但这会使您的代码更大且效率更低。
顺便说一句,许多 FreeRTOS 演示使用队列将字符传入和传出中断,以提供任务和中断通信的简单示例,但除非吞吐量非常低(例如命令控制台),否则不推荐编写生产代码的方式。使用循环缓冲区,最好使用 DMA,效率更高。
portBASE_TYPE
出于效率原因,使用大多数变量是很自然的。AVR 是 8 位架构,因此处理 8 位队列算法比 16 位更有效。对于某些应用,这种效率可能很关键。
在 32 位架构上使用 auint16_t
没有意义,您会注意到portBASE_TYPE
ARM 内核的 32 位值,因此选择 auint16_t
作为队列长度的默认类型将是对这些内核的人为限制。
这里有一些选项:
portBASE_TYPE
. 我还没有尝试过,但我看不出为什么这不起作用的原因,除非 FreeRTOS 中有一些需要 8 位的汇编代码portBASE_TYPE
。我快速浏览了一下,没有看到任何明显的汇编代码需要 8 位类型的迹象。