声明两个不同的结构大小

Declare two different struct sizes

这是在微控制器平台上,因此 RAM 的使用很重要。

我有一个用于循环缓冲区的不错的小库。对于循环缓冲区,我声明了一个 struct typedef:

typedef struct buffer {
    uint8_t data[BUFFER_LENGTH];
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
} Buffer;

通常,每个应用程序我只需要其中一个,因此将 BUFFER_LENGTH 定义为特定值并不是什么大问题,但我有一个应用程序需要其中两个......其中一个相对较短的长度(32 字节)和相对较长的长度(256 字节)之一。

有没有我可以使用的简单技术,它不涉及 malloc() 允许我声明两个不同长度的两个变量?

到目前为止我唯一的想法是将结构中的数据设为指针,在声明缓冲区时声明数组,并将缓冲区长度添加到缓冲区类型定义中:

typedef struct buffer {
    uint8_t dataPtr*;
    uint16_t length;
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
} Buffer;

uint8_t dataBuf1[256]
uint8_t dataBuf2[32]

Buffer buf1, buf2;

buf1.dataPtr = dataBuf1;
buf1.length = 256;

buf2.dataPtr = dataBuf2;
buf2.length = 32;

这可行,但有更好的解决方案吗?

您可以像这样定义两个结构:

#define LARGE_BUFFER_LENGTH   256
#define SMALL_BUFFER_LENGTH   32

typedef struct buffer {
    uint16_t buffer_size;
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
    uint8_t data[LARGE_BUFFER_LENGTH];
} Large_Buffer;

typedef struct buffer {
    uint16_t buffer_size;
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
    uint8_t data[SMALL_BUFFER_LENGTH];
} Small_Buffer;

data 成员移至末尾,并添加 buffer_size 成员。您应该能够共享处理程序函数,方法是将指针转换为较小的类型,使其为编译器所接受。 C 不关心数组是否明显溢出,buffer_size 字段将处理实现差异。您将在以前使用 BUFFER_LENGTH.

的任何地方使用 buffer_size(当然已初始化)

如果您不想动态分配,您可以使用如下定义:

typedef struct buffer {
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
    int length;
    uint8_t data[];
} Buffer;

然后是两个兼容的定义类型:

typedef struct buffer1 {
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
    int length;
    uint8_t data[LENGHT1];
} Buffer1_t;

和:

typedef struct buffer2 {
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
    int length; // may be useful...
    uint8_t data[LENGHT2];
} Buffer2_t;

那你就可以用指针来玩了:

Buffer *allocate_buffer(int type) {
    if (type==1) {
      return (Buffer *)malloc(sizeof(Buffer1_t));
    } else ...
}    

如果您不想要动态分配,您可以使用静态预分配的此类结构。