这是在微控制器平台上,所以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()
,这将允许我声明两个不同长度的两个变量?
到目前为止我唯一想到的是将结构中的数据作为指针,在声明缓冲区时声明数组,并将缓冲区长度添加到Buffer typedef:
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;
这会有效,但是有更好的解决方案吗?
答案 0 :(得分:2)
您可以定义两个结构:
#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_size
,都可以使用BUFFER_LENGTH
(当然已初步化)。
答案 1 :(得分:1)
如果您不想动态分配,可以使用如下定义:
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 ...
}
如果您不想进行动态分配,您可以使用静态预先分配的此类结构。