LINUX.ORG.RU

Вопрос про использование __attribute__.


0

0

Доброе время суток!
На днях решил освоить avr-gcc. По ходу решения некоторой тестовой задачи возникла необходимость разместить некий массив, размер которого известен еще на этапе компиляции программы, по заданному адресу памяти данных. Т.е. этот массив не относится ни к секции .data ни к секции .bss. Чтение gcc.gnu.org не принесло ожидаемого просветления: вроде как, нужно использовать директиву __attribute__, но вот как?... И еще, этот самый адрес зависит от размера памяти конкретного кристалла...

P.S. Всем ответившим ПО СУЩЕСТВУ заранее благодарен.


Чего-то я не врубаюсь о чем ты ?
Почему нельзя просто завести указатель на этот адрес ?

anonymous
()

>На днях решил освоить avr-gcc

Наверно, стоит сначала почитать всю доку на avr-libc

> По ходу решения некоторой тестовой задачи возникла необходимость разместить некий массив, размер которого известен еще на этапе компиляции программы, по заданному адресу памяти данных. Т.е. этот массив не относится ни к секции .data ни к секции .bss

Это инициализированные данные и должны лежать во флеше? Или это некий массив в ОЗУ по определенному адресу?

В любом случае это задача линкера. Для второго варианта достаточно линкеру дать ключ --defsym fixed_data=0xC000, а в программе написать:

extern char fixed_data[16384]; (вроде так)

smartly ★★★
()
Ответ на: комментарий от smartly

>Это инициализированные данные и должны лежать во флеше?

Блин, тут не прочитал внимательно.

smartly ★★★
()
Ответ на: комментарий от smartly

>Для второго варианта достаточно линкеру дать ключ --defsym >fixed_data=0xC000, а в программе написать:

>extern char fixed_data[16384]; (вроде так)

Это не сильно отличается от char* fixed_data = (char *)0xC000;
:)

Murr ★★
()

>И еще, этот самый адрес зависит от размера памяти конкретного кристалла...

Если у вас размер определен на этапе компиляции/сборки, то либо это тривиально делается через инициализацию глобального указателя, либо опции компоновщика(как уже справедливо сказали).

Если же размер не известен, то что вы хотите статически инициализировать? :)

Murr ★★
()
Ответ на: комментарий от Murr

>Это не сильно отличается от char* fixed_data = (char *)0xC000;

Верно. Но через линкер, возможно, будет гибче.

Про зависимость от кристалла: Это случайно не то, что нужно:

char* fixed_data = (char *)(RAM_END+1);

Точно не помню, как эта константа называется в *.h файлах.

smartly ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.