Объявите массивы с различными размерами в структуре typedef C - PullRequest
0 голосов
/ 15 ноября 2018

Я знаю, как динамически выделить новый массив с 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?

1 Ответ

0 голосов
/ 15 ноября 2018

Объявите ваши буферы как указатели:

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,
         ... 
    }
}
...