__attribute__((io)), __attribute__((address)) в gcc для AVR, похоже, не имеют никакого эффекта

Я пытаюсь использовать атрибуты переменных, специально предоставляемые версией AVR gcc (https://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html#AVR-Variable-Attributes).

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

volatile int porta __attribute__((address (0x600)));

Но когда я компилирую и отлаживаю этот пример кода из вышеупомянутого документа, переменная, объявленная с таким атрибутом, помещается в место в SRAM, которое определяют компилятор и компоновщик, а не по адресу 0x600, как это было запрошено. На самом деле, если я полностью уберу атрибут из объявления, конечный результат не изменится — переменная будет помещена по тому же «любому» адресу. То же самое происходит, когда я использую атрибуты «io» и «io_low» вместо «адрес».

Я использую набор инструментов gcc, упакованный в последнюю версию Atmel Studio 7.0.19.31, предназначенную для 8-битных микроконтроллеров (ATMega64).

Отсюда вопрос: кто-нибудь пытался успешно использовать эти специальные атрибуты, характерные для AVR?

Важные заметки:

  1. Я знаю, что обычно для размещения переменной по фиксированному адресу в gcc вам нужно выполнить двухэтапный процесс (используя атрибут раздела, а затем модифицируя скрипт компоновщика), но конкретно для AVR это выглядит так: атрибуты шага были предоставлены, вопрос в том, как заставить их работать. Двухэтапный процесс для меня не вариант.
  2. Я знаю, что в общем всегда можно сделать так: *(volatile int*)0x600 = your_data_here; Но это тоже не вариант для меня, мне нужна фактическая объявленная переменная (потому что я хочу отобразить ее на побитовую структуру, чтобы иметь доступ к отдельным битам без явного использования маски и логические операции.

Поэтому я действительно ищу способ заставить работать предоставленные атрибуты, а не обходной путь. Что мне не хватает?


person Regus Pregus    schedule 21.02.2019    source источник
comment
это не обходные пути, это то, что работает. пытаясь заставить работать битовые поля или прагмы и другие директивы, это обходные пути, которые приводят к жизни обслуживания кода. Если целью является безопасность работы, продолжайте, в противном случае используйте решения, которые просто работают.   -  person old_timer    schedule 21.02.2019
comment
Что делает тулчейн с вашими атрибутами?   -  person old_timer    schedule 21.02.2019
comment
это похоже на ошибку ... но ... вы используете скрипты компоновщика, которые поставляются с набором инструментов, или используете свои собственные?   -  person old_timer    schedule 21.02.2019
comment
Использование готовых скриптов компоновщика без каких-либо изменений.   -  person Regus Pregus    schedule 21.02.2019
comment
Я тоже сторонник стандартных подходов, но в IAR EWB у меня была PORTA_Bit4 как отдельная переменная (благодаря отображению побитовой структуры на фиксированный адрес), и это делало код более читабельным: PORTA_Bit4 = 0;. Чтение производилось через тот же оператор присваивания: foo = PORTA_Bit4; Я пытаюсь перейти на avr-gcc и сохранить ту же удобочитаемость. К сожалению, стандартное решение приведения типов через указатель и использование битовых масок и логических операторов позволяет создать макрос только для чтения, запись через оператор присваивания невозможна, приходится прибегать к макросу с параметрами.   -  person Regus Pregus    schedule 21.02.2019
comment
Вероятно, вы могли бы использовать код из примечания № 2, но заменить int структурой, которую вы определяете, которая имеет битовые поля. Тем не менее, уместно спросить, как заставить работать эти конкретные атрибуты GCC.   -  person David Grayson    schedule 22.02.2019


Ответы (1)


person    schedule
comment
Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную немедленную помощь. правильное объяснение значительно улучшит его долгосрочную ценность, показав, почему это хорошее решение проблемы и сделать его более полезным для будущих читателей с другими, похожими вопросами. Пожалуйста, отредактируйте свой ответ, чтобы добавить некоторые пояснения, включая сделанные вами предположения. - person Ardent Coder; 24.06.2020