Заполнение константного массива неизвестным количеством определений - PullRequest
1 голос
/ 08 ноября 2019

Есть ли более элегантный способ сделать это:

#if   SCID_BASE
const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE, SCIC_BASE, SCID_BASE};
#elif SCIC_BASE
const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE, SCIC_BASE};
#elif SCIB_BASE
const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE };
#else
const uint32_t baseaddr[] = {SCIA_BASE};
#endif

SCI_BASE - это определения извне моей программы, а значения uint32_t

Мне нужны базовые адреса во время выполнения, но это зависит от платформысколько портов.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Что-то вроде этого:

const uint32_t baseaddr[] = {
  SCIA_BASE,
#ifdef SCIB_BASE
  SCIB_BASE,
#ifdef SCIC_BASE
  SCIC_BASE,
#ifdef SCID_BASE
  SCID_BASE,
#endif
#endif
#endif
};

Или, если вы не хотите заботиться о математике #endif s:

const uint32_t baseaddr[] = {
  SCIA_BASE,
#ifdef SCIB_BASE
  SCIB_BASE,
#endif
#ifdef SCIC_BASE
  SCIC_BASE,
#endif
#ifdef SCID_BASE
  SCID_BASE,
#endif
};

Это легко оценить, если выполучить новые адреса. Просто добавьте еще 3 строки на адрес.

1 голос
/ 08 ноября 2019

Более элегантный способ - сделать что-то подобное в некотором глобальном «mcu.h».

extern volatile const uint32_t SCI_PORTS; // number of supported ports

Затем в «mcu.c»:

#include "mcu.h"

#ifdef MCU_ABC_X
  volatile const uint32_t SCI_PORTS = 2; // allocated at fixed address
#elif MCU_ABC_Y
  volatile const uint32_t SCI_PORTS = 3; // allocated at fixed address
...
#endif

Тогдаваш массив всегда будет

#include "mcu.h"

const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE, SCIC_BASE, SCID_BASE};

for(size_t i=0; i<SCI_PORTS; i++)
  send(baseaddr[i], "hello world");

Вы используете только SCI_PORTS количество элементов в этом массиве. Это позволяет разместить SCI_PORTS по фиксированному адресу, например ячейке EEPROM, и вы получите тот же двоичный файл независимо от того, для какого члена семейства MCU вы компилируете.

...