Embedded 令人沮丧的FreeRTOS xQueueCreate()限制

Embedded 令人沮丧的FreeRTOS xQueueCreate()限制,embedded,avr,freertos,Embedded,Avr,Freertos,我试图使用队列将UART ISR中的字符缓冲到后台任务。我希望队列长度为512字节。不幸的是,这是不可能的,因为size参数的类型是unsigned portBASE_type,对于xmega256a3来说,它是一个单字节(char)。是否存在队列的最大大小随portBASE\u TYPE浮动的原因?而不是uint16\t 我很好奇其他人是否也遇到了同样的限制,如果有的话,他们对此做了什么。出于效率原因,对大多数变量使用portBASE\u TYPE是很自然的。AVR是一种8位体系结构,因此处理

我试图使用
队列
将UART ISR中的字符缓冲到后台任务。我希望队列长度为512字节。不幸的是,这是不可能的,因为size参数的类型是
unsigned portBASE_type
,对于xmega256a3来说,它是一个单字节(
char
)。是否存在队列的最大大小随
portBASE\u TYPE
浮动的原因?而不是uint16\t


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

出于效率原因,对大多数变量使用
portBASE\u TYPE
是很自然的。AVR是一种8位体系结构,因此处理8位队列算法比处理16位队列算法更有效。对于某些应用程序,这种效率可能至关重要

在32位体系结构上使用
uint16\u t
没有意义,您会注意到ARM内核的
portBASE\u类型是32位值,因此选择
uint16\u t
作为默认队列长度类型将是对这些内核的人为限制

以下是一些选项:

  • 重构任务以更频繁地从队列中读取。除非其他任务占用了太多的处理时间,否则应该可以降低ISR队列长度并在读取线程中缓冲数据
  • 使用不同的
    portBASE\u类型重新编译FreeRTOS
    。我没有尝试过这一点,但我看不出这一点不起作用的原因,除非FreeRTOS中有一些汇编代码,它需要8位
    portBASE\u类型
    。我快速查看了一下,没有看到任何明显的迹象表明汇编代码需要8位类型
  • 使用您自己的队列库,该库能够存储所需的数据。使用其他FreeRTOS原语(如信号量)向任务发出信号,表明数据已添加到队列中。任务不会阻塞队列读取,而是阻塞信号量。信号量发出信号后,您将使用自己的队列库读取队列数据
理查德·巴里(FreeRTOS作者)在FreeRTOS邮件列表上发布了以下回复:

这仅适用于8位体系结构。它已经被提到过好几次(您可以在FreeRTOS站点上搜索支持档案),但由于大多数新项目都使用32位体系结构,所以这已经不是几年前的事了。简单的做法是更改portmacro.h中portBASE_类型的定义,但这会使代码更大,效率更低

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


我不熟悉FreeRTOS的具体情况。当将其视为一般情况时,是否可以分配一个缓冲区来收集字符并将指向该缓冲区的指针用于队列?是否存在原子访问问题或某些其他假设,使得在此类情况下首选BASE_类型?