Упрощение компиляции с каждым из списка опций - PullRequest
0 голосов
/ 09 октября 2010

У меня есть список определений: MASTER, SLAVE0, SLAVE1, ... SLAVE9 для управления тем, какой массив аудиоданных запрограммирован в микроконтроллер.Микро может содержать не более одного звукового файла, поэтому я включил следующие определения в начало моего файла main.c:

#define MASTER
#define SLAVE0
#define SLAVE1
....
#define SLAVE9 

Затем я пишу следующее в моем аудио массиве:

#if defined(MASTER)
    uint8_t sound[4096] PROGMEM = {127,126, ... }
#elif defined(SLAVE0)
    uint8_t sound[4096] PROGMEM = {126,128, ... }
....
#else 
    #ERROR "One of MASTER-SLAVE9 must be defined!"
#endif

Человек, желающий скомпилировать, должен пройти и закомментировать одну и только одну из #define строк.Это не только утомительно, но и подвержено ошибкам.Итак, я ищу, чтобы упростить процесс.Были бы полезны любые указатели для любой из следующих задач:

  1. Как я могу проверить список макросов на наличие одного и только одного из этих параметров?Простой if defined(MASTER) && !(defined(SLAVE0) || defined(SLAVE1) ...) потребовал бы 11 таких тестов, каждый с 11 слегка различающимися условиями.Это единовременные расходы, но это некрасиво.Такое ощущение, что это может быть общей потребностью, и что должен быть лучший способ.
  2. Как я могу упростить процесс компиляции?Я использую AVRStudio с компиляцией WinAVR t0.У него есть опция экспорта файла экспорта, но у меня нет опыта работы с ним.Я застрял, делая это на Windows.Идеальный процесс - собрать все 11 конфигураций в одну команду, и тогда я смогу пройтись и запрограммировать каждую из них на микроконтроллер по отдельности.Нынешний процесс сборки, не совсем идеальный, включает редактирование исходного кода каждый раз, когда я хочу построить, и переименование / перемещение выходного файла.

Ответы [ 4 ]

2 голосов
/ 09 октября 2010

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

#if (defined(MASTER) + defined(SLAVE1) + defined(SLAVE2)) != 1
    #error "Too many macros defined"
#endif

Что касается самого определения, большинство компиляторов позволяют вам определять макрос, используя параметр командной строки; это может быть чище, чем файл с «списком настраиваемых параметров». После этого вы сможете создать несколько конфигураций сборки, каждая из которых определяет свой макрос, и создавать их по очереди (я не знаком с вашей системой сборки, чтобы объяснить, как именно вам нужно это сделать). 1004 *

1 голос
/ 10 октября 2010

Я бы просто сделал блочный комментарий с именем всех возможных констант и следовал бы за ним одним определением.Кто хочет скомпилировать, тот просто пишет, что хочет.Сначала он проверит комментарий, чтобы увидеть список, затем он просто напишет.

Или, что еще лучше, сохраните этот список в комментарии (для справки) и используйте параметр -D, который есть у большинства компиляторов (например, -DMASTER для определения master), и если ваш инструмент его поддерживает, настройте сборкудля каждого, где вы меняете значение -D.Используя другую конфигурацию сборки, я думаю, вы также можете изменить имя выходного файла, чтобы убить двух зайцев камнем.

0 голосов
/ 26 октября 2010

Вам нужно сообщение об ошибке, когда вы определили больше, чем один макрос?Ну, просто напишите:

#ifdef MASTER
uint8_t sound = { ... };
#endif
#ifdef SLAVE0
uint8_t sound = { ... };
#endif
#ifdef SLAVE1
uint8_t sound = { ... };
#endif

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

Также почему бы не использовать это?

#define SLAVE <n>

uint8_t sound_master = { ... };
uint8_t sound_slave_0 = { ... };
uint8_t sound_slave_1 = { ... };
uint8_t sound_slave_2 = { ... };

#define XCAT(a,b) a##b
#define CAT(a,b) XCAT(a,b)
#ifdef SLAVE
#define sound CAT(sound_slave_,SLAVE)
#endif
#ifdef MASTER
#ifdef sound
/* warnin or so. but if you need an error just remove this ifdef **/
#endif
#define sound sound_master
#endif
0 голосов
/ 09 октября 2010

Почему бы не что-то вроде:

#define ARRAY_NAME        (SLAVE0)

...


#if (ARRAY_NAME == MASTER)
    // blah
#elif (ARRAY_NAME == SLAVE0)
    // blah
// etc.

или даже лучше, просто:

#define ARRAY_MASTER { 1, 2, 3, 4 }
#define ARRAY_SLAVE0 { 5, 6, 7, 8 }
// etc.

...

const uint8_t sound[] = ARRAY_MASTER;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...