Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Указать линкеру зарезервированную область flash
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
athlon64
Компилятор IAR 5.41
Процессор Atmel AT91SAM7X256

Необходимо организовать в ОЗУ буфер объёмом 4кбайт, в который помещать 32битные переменные типа unsigned int (далее будут входными и выходными данными у нескольких процедур).
Как по уму выделить под буфер строго определённую область памяти в ОЗУ с адреса 0xF000 по 0xFFFF (с 60кб озу и до конца) и корректно обращаться к пакетам буфера?

Буду благодарен за разъяснения или пример
aaarrr
Цитата(athlon64 @ Mar 16 2010, 19:43) *
Как по уму выделить под буфер строго определённую область памяти в ОЗУ с адреса 0xF000 по 0xFFFF (с 60кб озу и до конца) и корректно обращаться к пакетам буфера?

Почитать документацию на линкер, определить секцию и положить в нее этот буфер. Отдельно проверить и при необходимости откорректировать расположение стеков.
Вот только зачем нужно класть буфер в строго определенной области ОЗУ?
athlon64
Хорошо, пусть буфер будет не в строко определённом месте. Главное чтобы работа с ним была максимально быстрой.
Как его организовать? массив?
aaarrr
Цитата(athlon64 @ Mar 16 2010, 20:08) *
Как его организовать? массив?

Напишите сначала, кто будет в буфере жить, и что с ним предполагается делать. Пока понятно только, что есть 32 битные данные и вскользь упоминаются какие-то пакеты.
athlon64
предполагается набор функций. Последовательность выполнения функций и их входные и выходные данные хранятся во внешнем EEPROM - набор 32битных пакетов - 8бит код команды и 24бита адрес переменной.
Команды типа "прочитать из EEPROM и положить в буфер", "вызвать функцию №", "сохранить результат" и т.п., в 24битах адреса - адрес переменной для чтения/записи либо номер функции.
Заданная в EEPROM последовательность молотится в цикле.
Входных переменных у функции может быть много, в сумме с константами и выходными переменными не более 1024 (на деле не более 256, но на будущее пусть будет ограничение в 1024).
aaarrr
Т.е. планируется скопировать содержимое EEPROM в ОЗУ, и из него уже "молотить"? Тогда не понимаю затруднений с организацией. Сделайте глобальный массив, функции смогут работать с ним напрямую, или получать в качестве параметров указатель или индекс - по большому счету это не важно.
dimka76
Цитата(athlon64 @ Mar 16 2010, 19:43) *
Как по уму выделить под буфер строго определённую область памяти в ОЗУ с адреса 0xF000 по 0xFFFF (с 60кб озу и до конца) и корректно обращаться к пакетам буфера?


Может вам посмотреть в сторону директивы #pragma data_alignment=expression

Например так
Код
#pragma data_alignment=4096
unsigned int array[4096];


Тогда не будет необходимости следить за переполнением индекса.
Пример использования индекса
Код
unsigned int index_array;

index_array += (index_array+1) & 0xFFF;


Таким образом получаем закольцовывание.

Если конечно это не ваш случай, тогда извиняйте )))
defunct
Цитата(dimka76 @ Mar 20 2010, 07:34) *
Тогда не будет необходимости следить за переполнением индекса.

Что-то непонятно, а зачем для закольцовывания индекса применять прагму data_alignment, и вообще выравнивать массив?!
Что мешает точно также поступить с индеском для обычного массива, длиной кратной степени двойки:


Код
#define ARR_SIZE  4096
#define ARR_MASK (ARR_SIZE - 1)

int a[ ARR_SIZE ];

...
index += 1;
a[ index & ARR_MASK];
athlon64
Предполагается в процессоре at91sam7x256 использовать последние 16кб флеша (64 страницы по 256 байт) для хранения служебных данных. Модифицирую проект из примеров basic-internalflash-project.
Как в IAR указать линкеру что в последние 16кб не нужно размещать основную программу? Если правильно понимаю, надо что-то дописать в .icf-файл
И ещё вопрос:
Загрузка данных планируется лоадером, который пока не написан. Для отладки хотелось бы пока прикрепить нужный мне bin-файл к проекту чтобы он был включён в начало 16кб сектора данных. Как это сделать?
zltigo
Цитата(athlon64 @ Apr 4 2010, 10:50) *
Как это сделать?

Почитать документацию на линкер. Почитать форум. Сделать. Если, вдруг, чего не получится - спросить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.