2008-09-26 3 views
1

Для встроенной системы мне нужно разместить несколько структур данных по фиксированным адресам, чтобы отдельный процессор управления мог получить к ним доступ в известном месте. Я использую сценарии компоновщика для встроенной цели, чтобы выполнить это, плюс #defines тех же адресов для процессора управления.#defines в скриптах компоновщика

Меня беспокоит, что эти постоянные адреса определены в двух местах: скрипте компоновщика и файле заголовка. Я бы хотел иметь только один. Лучшее решение, к которому я придумал, заключается в том, чтобы Makefile запускал cpp на скрипте компоновщика, позволяя ему включать # тот же заголовок.

Есть ли лучший способ достичь этого? Есть ли какой-то малоизвестный вариант для ld или соглашения об именах для скрипта компоновщика, который будет автоматически запускать его через cpp?

+0

Было бы полезно узнать, какую toolchain вы используете, поскольку это нестандартное поведение. – Benoit 2008-09-26 13:45:55

+0

gcc 3.x, работающий на x86 Linux, но скомпилированный для сборки для MIPS. – DGentry 2008-09-26 16:17:25

ответ

3

Это не совсем то решение, которое вы ищете, но один из вариантов - использовать систему сборки для настройки этих значений. Создайте config.h.in и target.ld.in, которые действуют как шаблоны и имеют систему сборки, создающую config.h с правильным определением и target.ld с правильным адресом для цели, которую вы строите.

Мы используем CMake для наших встроенных систем и поддерживаем такие вещи. GNU autoconf тоже, но я никогда не любил его лично.

0

Чтобы разместить объект в любом месте адресного пространства, вы можете использовать конструкцию @ с ограниченным кодом.

static struct SOMESTRUCT somestruct @ 0x40000000; 
extern int someextint @ 0x3ffffffc; 
char somebuffer[77] @ 0x80000000; 

Предполагая 32-разрядный MCU.