我知道如何使用malloc
动态分配新数组。
我想知道在这种情况下是否有办法避免这种情况:
#define RX_BUFFER_SIZE 256
#define TX_BUFFER_SIZE 128
typedef struct MyBuffer
{
volatile uint8_t RX[RX_BUFFER_SIZE];
volatile uint8_t TX[TX_BUFFER_SIZE];
volatile uint16_t RX_Head;
volatile uint16_t RX_Tail;
volatile uint16_t TX_Head;
volatile uint16_t TX_Tail;
} MyBuffer_t;
typedef struct MyChannel
{
// other stuff
MyBuffer_t buffer;
} MyChannel_t;
然后在我的代码中,我创建了几个这样的变量:
MyChannel_t ch1;
MyChannel_t ch2;
MyChannel_t ch3;
但是我想为每个变量设置不同大小的数组。可以从一小部分中进行选择,即:
#define RX_BUFFER_SIZE_S 32
#define TX_BUFFER_SIZE_S 16
#define RX_BUFFER_SIZE_M 128
#define TX_BUFFER_SIZE_M 64
#define RX_BUFFER_SIZE_L 256
#define TX_BUFFER_SIZE_L 128
有没有一种方法可以使用malloc
来实现 ?
答案 0 :(得分:2)
将缓冲区声明为指针:
typedef struct MyBuffer
{
volatile uint8_t * RX;
volatile uint8_t * TX;
size_t rxSize;
size_t txSize;
volatile uint16_t RX_Head;
...
然后为缓冲区使用单独的静态分配,并使用它们来初始化对象。
volatile uint8_t ch1_rx_buffer[RX_BUFFER_SIZE_S];
volatile uint8_t ch1_tx_buffer[TX_BUFFER_SIZE_S];
MyChannel_t ch1 = {
.buffer = {
ch1_rx_buffer,
ch1_tx_buffer,
sizeof ch1_rx_buffer,
sizeof ch1_tx_buffer,
...
}
}