Я пытаюсь использовать атрибуты переменных, специально предоставляемые версией 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?
Важные заметки:
- Я знаю, что обычно для размещения переменной по фиксированному адресу в gcc вам нужно выполнить двухэтапный процесс (используя атрибут раздела, а затем модифицируя скрипт компоновщика), но конкретно для AVR это выглядит так: атрибуты шага были предоставлены, вопрос в том, как заставить их работать. Двухэтапный процесс для меня не вариант.
- Я знаю, что в общем всегда можно сделать так:
*(volatile int*)0x600 = your_data_here;
Но это тоже не вариант для меня, мне нужна фактическая объявленная переменная (потому что я хочу отобразить ее на побитовую структуру, чтобы иметь доступ к отдельным битам без явного использования маски и логические операции.
Поэтому я действительно ищу способ заставить работать предоставленные атрибуты, а не обходной путь. Что мне не хватает?
int
структурой, которую вы определяете, которая имеет битовые поля. Тем не менее, уместно спросить, как заставить работать эти конкретные атрибуты GCC. - person David Grayson   schedule 22.02.2019