#defines в скриптах компоновщика
Вопрос
Для встроенной системы мне нужно разместить несколько структур данных по фиксированным адресам, чтобы отдельный управляющий процессор мог получить к ним доступ в известном месте.Для этого я использую сценарии компоновщика для встроенной цели, а также #defines тех же адресов для управляющего процессора.
Меня беспокоит то, что эти адресные константы определяются в двух местах: в скрипте компоновщика и в заголовочном файле.Я бы хотел иметь только один.Лучшее решение, которое я придумал на данный момент, — это заставить Makefile запускать cpp в сценарии компоновщика, позволяя ему #include тот же заголовок.
Есть ли лучший способ добиться этого?Есть ли какая-то малоизвестная опция ld или соглашение об именах для сценария компоновщика, который автоматически запускает его через cpp?
Решение
Это не совсем то решение, которое вы ищете, но один из вариантов — использовать систему сборки для настройки этих значений.Создайте config.h.in и target.ld.in, которые действуют как шаблоны, и попросите систему сборки создать config.h с правильным определением и target.ld с правильным адресом для создаваемой вами цели.
Мы используем CMake для наших встроенных систем, и он поддерживает подобные вещи.GNU autoconf тоже работает, но лично мне он никогда не нравился.
Другие советы
Вы можете использовать специальную конструкцию @ emdedded-C для размещения объекта в любом месте адресного пространства.
static struct SOMESTRUCT somestruct @ 0x40000000;
extern int someextint @ 0x3ffffffc;
char somebuffer[77] @ 0x80000000;
Предполагая 32-битный MCU.