2

我正在尝试使用 aqueue将我的 UART ISR 中的字符缓冲到后台任务。我希望队列长度为 512 字节。不幸的是,这是不可能的,因为 size 参数的类型unsigned portBASE_TYPE对于 xmega256a3 来说是单字节 ( char)。队列的最大大小浮动是否有原因portBASE_TYPE?而不是uint16_t?

我很好奇其他人是否也遇到了同样的限制,如果有的话,他们做了什么。

4

2 回答 2

4

Richard Barry(FreeRTOS 作者)在 FreeRTOS 邮件列表上发布了以下回复:

这仅适用于 8 位架构。它已经被提及过几次(您可以在 FreeRTOS 网站上搜索支持档案),但多年来没有提及,因为大多数新项目都使用 32 位架构。简单的做法是在 portmacro.h 中更改 portBASE_TYPE 的定义,但这会使您的代码更大且效率更低。

顺便说一句,许多 FreeRTOS 演示使用队列将字符传入和传出中断,以提​​供任务和中断通信的简单示例,但除非吞吐量非常低(例如命令控制台),否则不推荐编写生产代码的方式。使用循环缓冲区,最好使用 DMA,效率更高。

于 2013-01-23T00:12:20.837 回答
3

portBASE_TYPE出于效率原因,使用大多数变量是很自然的。AVR 是 8 位架构,因此处理 8 位队列算法比 16 位更有效。对于某些应用,这种效率可能很关键。

在 32 位架构上使用 auint16_t没有意义,您会注意到portBASE_TYPEARM 内核的 32 位值,因此选择 auint16_t作为队列长度的默认类型将是对这些内核的人为限制。

这里有一些选项:

  • 重构您的任务以更频繁地从队列中读取。除非其他任务占用太多处理时间,否则应该可以降低 ISR 队列长度并在读取线程中缓冲数据。
  • 使用不同的portBASE_TYPE. 我还没有尝试过,但我看不出为什么这不起作用的原因,除非 FreeRTOS 中有一些需要 8 位的汇编代码portBASE_TYPE。我快速浏览了一下,没有看到任何明显的汇编代码需要 8 位类型的迹象。
  • 使用您自己的队列库,该库能够存储您需要的尽可能多的数据。使用其他 FreeRTOS 原语(例如信号量)向您的任务发出数据已添加到队列中的信号。它不会阻塞在队列读取上,而是阻塞在信号量上。在信号量发出信号后,您将使用自己的排队库来读取排队的数据。
于 2013-01-22T04:14:06.100 回答