реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Указать линкеру зарезервированную область flash, и прикрепить bin файл
athlon64
сообщение Mar 16 2010, 16:43
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Компилятор IAR 5.41
Процессор Atmel AT91SAM7X256

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

Буду благодарен за разъяснения или пример


--------------------
Руслан
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 16 2010, 16:54
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Почитать документацию на линкер, определить секцию и положить в нее этот буфер. Отдельно проверить и при необходимости откорректировать расположение стеков.
Вот только зачем нужно класть буфер в строго определенной области ОЗУ?
Go to the top of the page
 
+Quote Post
athlon64
сообщение Mar 16 2010, 17:08
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Хорошо, пусть буфер будет не в строко определённом месте. Главное чтобы работа с ним была максимально быстрой.
Как его организовать? массив?


--------------------
Руслан
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 16 2010, 17:16
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(athlon64 @ Mar 16 2010, 20:08) *
Как его организовать? массив?

Напишите сначала, кто будет в буфере жить, и что с ним предполагается делать. Пока понятно только, что есть 32 битные данные и вскользь упоминаются какие-то пакеты.
Go to the top of the page
 
+Quote Post
athlon64
сообщение Mar 16 2010, 18:12
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



предполагается набор функций. Последовательность выполнения функций и их входные и выходные данные хранятся во внешнем EEPROM - набор 32битных пакетов - 8бит код команды и 24бита адрес переменной.
Команды типа "прочитать из EEPROM и положить в буфер", "вызвать функцию №", "сохранить результат" и т.п., в 24битах адреса - адрес переменной для чтения/записи либо номер функции.
Заданная в EEPROM последовательность молотится в цикле.
Входных переменных у функции может быть много, в сумме с константами и выходными переменными не более 1024 (на деле не более 256, но на будущее пусть будет ограничение в 1024).


--------------------
Руслан
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 16 2010, 19:34
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Т.е. планируется скопировать содержимое EEPROM в ОЗУ, и из него уже "молотить"? Тогда не понимаю затруднений с организацией. Сделайте глобальный массив, функции смогут работать с ним напрямую, или получать в качестве параметров указатель или индекс - по большому счету это не важно.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Mar 20 2010, 05:34
Сообщение #7


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(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;


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

Если конечно это не ваш случай, тогда извиняйте )))

Сообщение отредактировал rezident - Mar 20 2010, 06:06
Причина редактирования: Излишнее цитирование.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 21 2010, 03:11
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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];
Go to the top of the page
 
+Quote Post
athlon64
сообщение Apr 4 2010, 07:50
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Предполагается в процессоре at91sam7x256 использовать последние 16кб флеша (64 страницы по 256 байт) для хранения служебных данных. Модифицирую проект из примеров basic-internalflash-project.
Как в IAR указать линкеру что в последние 16кб не нужно размещать основную программу? Если правильно понимаю, надо что-то дописать в .icf-файл
И ещё вопрос:
Загрузка данных планируется лоадером, который пока не написан. Для отладки хотелось бы пока прикрепить нужный мне bin-файл к проекту чтобы он был включён в начало 16кб сектора данных. Как это сделать?


--------------------
Руслан
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 4 2010, 08:55
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(athlon64 @ Apr 4 2010, 10:50) *
Как это сделать?

Почитать документацию на линкер. Почитать форум. Сделать. Если, вдруг, чего не получится - спросить.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 20:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01448 секунд с 7
ELECTRONIX ©2004-2016