Я пытаюсь использовать переменные атрибуты, специально предоставленные AVR flavor для 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 вместо «address».
Я использую набор инструментов gcc, упакованный в последней версии Atmel Studio 7.0.19.31, предназначенный для 8-битных MCU (ATMega64).
Отсюда вопрос:Кто-нибудь пытался использовать эти специальные атрибуты AVR с каким-либо успехом?
Важные примечания:
- Мне известно, что в целом для выполнения размещения переменной по фиксированному адресу в gcc необходимо выполнить двухэтапный процесс (с использованием атрибута section изатем изменить скрипт компоновщика), но, в частности, для AVR кажется, что эти одношаговые атрибуты были предоставлены, вопрос в том, как заставить их работать.Двухэтапный процесс для меня не вариант.
- Я знаю, что в общем случае всегда можно сделать это:
*(volatile int*)0x600 = your_data_here;
Но для меня это тоже не вариант, мне нужна объявленная фактическая переменная (потому что я хочу отобразить его на побитовую структуру, чтобы иметь доступ к отдельным битам без явного использования масок и логических операций.
Поэтому я действительно ищу способ заставить предоставленные атрибуты работать, а недля обхода. Чего мне не хватает?