Общие константы для проекта AVR / Linux GCC C ++ - PullRequest
4 голосов
/ 07 сентября 2011

Я создаю программное обеспечение для проекта Linux + AVR Arduino. Очевидно, что вся работа разделена на несколько проектов в Eclipse (я не использую Arduino IDE). Я хотел бы использовать общие, в основном строковые, константы для всех этих проектов. Я также должен сэкономить оперативную память микроконтроллера, поэтому необходимы константы времени компиляции. Как мне лучше всего это реализовать? Моя идея - создать отдельный проект только для заголовков для этих констант.

Использование:

class A {
public:
    static const char * const STRING;
    static const unsigned char BOOL;
};

недостаточно, потому что я хотел бы иметь возможность объединять строковые константы следующим образом:

class A {
public:
    static const char * const STRING_PART1;
    static const char * const STRING_PART2;
    static const unsigned char BOOL;
};
const char * const A::STRING_PART1 = "PART1_";
//const char * const A::STRING_PART2 = A::STRING_PART1 + "PART2"; //obviously won't compile
//const char * const A::STRING_PART2 = strcat("PART2", A::STRING_PART1); //this is not compile-time

Я тоже не хочу использовать define. Я хотел бы использовать:

class A {
public:
    static const std::string STRING_PART1;
    static const std::string STRING_PART2;
}

, который допускает конкатенацию строк и (AFAIK) во время компиляции, но std :: string недоступен в проектах avr - или я здесь не прав и просто не знаю, как его использовать.

Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 07 сентября 2011

Вы можете продолжить с текущей идеей использования const char* const (если std::string не используется). Я бы предложил использовать #define только для назначения. Пример:

class A {
public:
    static const char * const STRING_PART1;
    static const char * const STRING_PART2;
    static const unsigned char BOOL;
};
#define PART1_ "PART1_"  // <--- for value assignent
#define PART2_ "PART2_"
const char * const A::STRING_PART1 = PART1_;
const char * const A::STRING_PART2 = PART1_ PART2_;  // <--- ok! concatenation by compiler
1 голос
/ 07 сентября 2011

Время компиляции для меня означает, что оно хранится в ПЗУ (например, флэш-памяти микроконтроллера), где переменные времени выполнения хранятся в ОЗУ.В моем случае это оперативная память, которую я должен сэкономить.Компилятор решает, куда поместить переменные, основываясь на многих правилах.Определения являются одним из примеров констант времени компиляции, они явно не учитывают использование ОЗУ.Другим примером должны быть статические константы класса - но в этом случае мой компилятор решит иначе.Конечно, я могу сбивать с толку.

Я думаю, что вы на самом деле сбиваете с толку:

  • определения не хранятся в ПЗУ - они не являются частьюваша программа вообще, поскольку они уже оценены препроцессором.
  • разница между "временем компиляции" и "временем выполнения", которое вы делаете, относится к оценке, а не к хранилищу.

Если вы хотите использовать программную память (= AVR flash) для константных строк, используйте макрос PSTR из avr / pgmspace.h.

...