c-对于可以在编译时允许可变大小的通用队列实现,有什么想法吗

  • 本文关键字:实现 队列 于可 编译 许可 c uart msp430
  • 更新时间 :
  • 英文 :


我在系统中使用了3种不同的UART。我为要放入的RX数据和TX数据定义了一个软件缓冲区。

/*! Queue Size for all UARTS. Defines the size of static memory allocated for
RX and TX Buffers. */
#define QUEUE_SIZE 300u
/*!
* brief Arbitrary FIFO queue structure used to store RAW serial data
* ingroup uart
*/
typedef struct
{
uchar8_t x[QUEUE_SIZE];
uint16_t head_index;
uint16_t tail_index;
uint16_t length;
} serial_queue_t;

我声明了这个结构的6个实例——每个UART都有一个RX和TX缓冲区。

现在我有一个通用的方法来从UART中提取字符或将字符推送到UART。

/*!
* brief Private method used to get and remove the next character in an
* arbitrary UART FIFO queue.
* ingroup uart
* param[in] *p_queue The queue to get data from
* param[out] *p_pull The next character in the buffer. This will not be
* assigned if the character is unavailable.
* returns TRUE if the next character is available, FALSE if that character is
* not available.
*
* note This Function is Atomic
* If this function is executing and a UART ISR occurs which would recall this
* function before the tail index has been updated it could cause a memory
* leak/data loss. Therefore this function is not reentrant and must block
* interrupts.
*/
static bool_t uart_pull(serial_queue_t volatile * p_queue, uchar8_t * p_pull);
/*!
* brief Private method to push a character onto an arbitrary UART queue.
* ingroup uart
* param[in,out] *p_queue The queue to push data onto.
* param[in] push The next character in the buffer. This will not be assigned
* if the character is unavilable.
* returns TRUE if the character was placed in the queue successfully, FALSE
* if the queue is full.
*
* note This Function is Atomic
* If this function is executing and a UART ISR occurs which would recall this
* function before the head index has been updated it could cause a memory
* leak/data loss. Therefore this function is not reentrant and must block
* interrupts.
*/
static bool_t uart_push(serial_queue_t volatile * p_queue, uchar8_t push);

现在我需要更改我的实现。我需要调整一些缓冲区的大小,使它们更大,这样我就可以传输更大的数据帧。我还计划缩小一些缓冲区以回收一些空间,因为300字节对它们来说是多余的。我正在尝试想出一个干净的方法来做到这一点,这样我就可以保持我的实现的通用性。

到目前为止,我的最佳想法是简单地定义两个不同的结构,每个结构都定义了不同大小的不同数组,然后使p_queue指针无效。我可以为每个函数添加一个参数,告诉函数正在使用哪个UART缓冲区,这样他们就知道在处理缓冲区时要使用哪个结构,或者在存储该队列的最大长度的队列结构中添加另一个字段,并将最大长度、头索引和尾索引重新定位在字符数组前面。

有人有更好的想法吗?因为为几乎相同的东西定义多达6种不同的结构并不是那么干净吗?我也不想把整个事情放在堆上并分配运行时——我希望在编译时由链接器处理分配。

我使用Adam Dunkels ContikiOS的环形缓冲区:http://contiki.sourceforge.net/docs/2.6/a01686.html

为了得到我想要的东西,我不得不对它们进行一些修改,但作为一个可以构建的平台,它是坚如磐石的。

我已经用<stdint.h>等中的int32_t替换了int,以确保我有一个可移植的实现。除此之外,我认为我没有太大的改变。我在各种不同的处理器上使用该代码,这些处理器具有不同的字大小、字节序等。它只起作用(TM):)

编辑:重读您的问题后,您确定要在编译时而不是在运行时

相关内容

  • 没有找到相关文章

最新更新