память отображается с помощью компоновщика - PullRequest
3 голосов
/ 06 января 2012

Как я могу заставить компоновщик поместить некоторые из моих переменных в определенное место в памяти. Например, я хочу выделить целое число имя в 0x8100000. Если я не пропустил понять, я могу использовать:

int name __attribute__ ((section ("name_of_section")));

и затем в скриптах компоновщика:

 SECTIONS
 {
   ...
   . = 0x8100000;
   .data : { name_of_section }
   ...
 }

Я хочу использовать нечто подобное для сопоставления порта uC. Но что-то не совпадает, и я не знаю, где я допустил ошибку. (Я никогда не использовал скрипт компоновщика, поэтому извините, если написал что-то очень глупое).

Ответы [ 3 ]

3 голосов
/ 06 января 2012

Обычно это делается без скрипта компоновщика.

int volatile * const portA = 0x8100000;  //portA is a constant pointer to a volatile int
...

*portA = 53;  //write value 53 to output port

Если вам необходимо использовать скрипт компоновщика, он будет зависеть от компилятора и / или микросхемы.Можете ли вы сказать нам, какой чип и набор инструментов вы используете?

1 голос
/ 07 января 2012

Спасибо за все ваши советы!Теперь это работает..ld файл:

SECTIONS
{
...
   .data: {
   ...
   }
   ...
   var_name = 0x40010CA0;
}

.c файл:

extern volatile int var_name;

После изучения документов, на которые я ссылался выше (пример раздела ввода), я попробовал также что-то подобное: .ld file:

.hrd_map 0x40010CA0 : 
{       
    main.o(.b_section)  
}

Где .b_section был глобальной переменной с атрибутом:

int b __attribute__((section(".b_section")));

Но это не работает, я получил такую ​​ошибку: множественное определение `main«.Я думаю, это потому, что ранее в файле .ld у меня было другое назначение, например: .data: {...} .bss .text.Может быть, кто-то знает, как это исправить или как получить некоторые переменные без использования атрибута section .Я пытался искать символы для переменных в файле main.o, но я не видел ничего похожего на имя символа для переменной, кроме .b_section, который я создал, используя атрибут section и другие (созданные по умолчанию?) .data .bss .text и т. д.

@ Dan Вы правы, я делаю это для обучения, и я с вами согласен.Но, с другой стороны, я думаю, что этот код будет достаточно переносимым, поскольку каждый чип требует .ld и Startup-файл, а определение портов также включено в библиотеки.

0 голосов
/ 07 января 2012

Я рекомендую НЕ использовать компоновщик для доступа к аппаратным регистрам.Ваш код будет намного легче понять и поддерживать, если вы явно закодируете адреса.Хорошей идеей будет собрать всю информацию о специфических для устройства регистрах во включаемом файле.Для сложных периферийных устройств обычно хорошей идеей является определение структуры для блока регистров, связанного с периферийным устройством, особенно когда устройство поддерживает несколько экземпляров конкретного периферийного устройства.Затем используйте технику из ответа Люка, чтобы попасть в регистр или зарегистрировать блок в своем коде.И ключевое слово volatile всегда должно использоваться при доступе к аппаратным регистрам.

...