【发布时间】:2016-03-23 18:26:33
【问题描述】:
这是在微控制器平台上,因此 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() 的简单技术可以让我声明两个不同长度的变量?
目前我唯一想到的就是把struct中的数据做成指针,在声明缓冲区的时候声明数组,把缓冲区长度加到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;
这可行,但有更好的解决方案吗?
【问题讨论】:
-
声明结构不需要额外的空间,在你实例化它之前它不会占用空间。既然你都需要它们,只需声明它们。
-
@KevinDTimm 感谢您查看此内容。如果我声明
Buffer buf1和Buffer buf2,那么我的编译器将为每个分配完整的BUFFER_LENGTH。这在功能上会起作用,但会使用比我感兴趣的更多的 RAM。 -
是的,我看到了这一点(尤其是在查看 @WeatherVan 的答案之后)。我对问题的解释不正确
-
@KevinDTimm 我可以添加措辞来澄清解释吗?
-
不,问题很清楚(我只是懒惰阅读)