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

 
 
> IAR + SAM7S, Как узнать размер свободной SRAM?
KAlex
сообщение Nov 12 2007, 12:07
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Есть проект, в котором надо динамически выделять под массив данных область в памяти. Желательно как можно большего размера.
Как на стадии компиляции узнать размер свободной SRAM?
Возможно ли определить это в уже работающей программе?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_dem
сообщение Nov 20 2007, 21:21
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



имхо, имелось в виду немного не то :

Так как флеш пишется постранично, и у флеш контроллера есть внутренний буфер на одну страницу, то на время подготовки этой страницы (записи значений в буфер) можно работать из флеша

а вот во время выполнения команды записи (предложенная Сергеем функция) все должно быть остановлено и сама функция должна работать из RAM

Учитывая небольшой размер вашей прошивки, я бы вообще порекомендовал вам после запуска копировать прошивку в RAM и делать REMAP - и работайте с флешем когда и как вам хочется. Естественно, прошивка должна быть слинкована с правильными адресами (работа из RAM). А копирование можно сделать в cstartup на ассемблере.
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Nov 21 2007, 12:22
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(_dem @ Nov 21 2007, 00:21) *
Учитывая небольшой размер вашей прошивки, я бы вообще порекомендовал вам после запуска копировать прошивку в RAM и делать REMAP - и работайте с флешем когда и как вам хочется. Естественно, прошивка должна быть слинкована с правильными адресами (работа из RAM). А копирование можно сделать в cstartup на ассемблере.


Про флеш понятно. Про ремап - нет, буду по второму кругу доку читать, но пока не понятно.
В частности:
Ресетится контроллер, передается управление по адресу 0x0, который мемори контроллером транслируется в 0x00100000 (флеш).
Выполняется там что-то, копируется что-то из флеша в страницу памяти по адресу 0x00200000(РАМ). Потом мы ставим бит remap, следующая инструкция откуда возьмется - из RAM или из FLASH?

Еще одна непонятка - как нужно настроить компилятор, куда что линковать?
Получается что для бутлоадера нужно прописывать файл линкеру, что мы "живем" по адресам 0x00100000? Тогда после ресета pc=0, первая инструкция - переход по реальному адресу. Ну а приложение нужно размещать по адресу 0x00, и в бутлоадере делать копирование флеша в память, ремап и передачу управления на 0x00. Правильно?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 21 2007, 14:20
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Kitsok @ Nov 21 2007, 14:22) *
Ресетится контроллер, передается управление по адресу 0x0, который мемори контроллером транслируется в 0x00100000 (флеш).
Выполняется там что-то, копируется что-то из флеша в страницу памяти по адресу 0x00200000(РАМ). Потом мы ставим бит remap, следующая инструкция откуда возьмется - из RAM или из FLASH?
Давайте представим это так: есть три области - с нуля, с 0x00100000 (флеш), и с 0x00200000(ОЗУ). Если РС указывает на вторую область, программа исполняется из флеш. Если на третью - из ОЗУ. Если на первую - то зависит от ремапа. Т.е. в первой области мы имеем "зеркало" второй или третьей. Поэтому в момент ремапа программа должна исполняться из второй или третьей (она может вообще всегда исполняться из второй или третьей, а в нулевую попадать только по исключениям, чтобы считать вектор). Это в SAM7. В LPC несколько иначе - там "отражается" только область 0x40 байт на вектора. Поэтому ответ такой - из следующего адреса. А что окажется по этому адресу - зависит от адреса (если вторая область - флеш, если третья - ОЗУ) и ремапа(если первая)
Цитата(Kitsok @ Nov 21 2007, 14:22) *
Еще одна непонятка - как нужно настроить компилятор, куда что линковать? Получается что для бутлоадера нужно прописывать файл линкеру, что мы "живем" по адресам 0x00100000? Тогда после ресета pc=0, первая инструкция - переход по реальному адресу. Ну а приложение нужно размещать по адресу 0x00, и в бутлоадере делать копирование флеша в память, ремап и передачу управления на 0x00. Правильно?
Почти. У меня так: загрузчик живет по адресам 0x00100000 - 0x00100FFF (нулевой сектор флеш), файл SAM7_boot.xcl. Приложение живет вслед за загрузчиком, начиная с 0x00101000 (первый сектор флеш и далее), файл SAM7S64_boot_app.xcl. При включении питания или сбросе флеш отражена на нулевые адреса, на месте векторов оказываются вектора загрузчика, из вектора ресета считывается переход на загрузчик в адреса 0x00100000 - 0x00100FFF. Загрузчик получает управление. Если надо передать управление приложению, то загрузчик берет вектора приложения из адресов 0x00101000-0x0010103F, копирует их в озу по адресам 0x00200000-0x0020003F (эта область зарезервирована и в загрузчике и в приложении, чтобы там не оказались какие-либо данные). Загрузчик (работая в адресах 0x00100000 - 0x00100FFF) запрещает прерывания и делает ремап. При этом ОЗУ отражается на нулевые адреса и в области векторов оказываются скопированные в 0x00200000-0x0020003F вектора приложения. Загрузчик передает управление на нулевой адрес, т.е. на вектор ресет приложения. Из вектора считывается команда перехода на cstartup приложения, в адреса 0x00101040....
Прикрепленные файлы
Прикрепленный файл  boot.zip ( 1.51 килобайт ) Кол-во скачиваний: 38
 


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Nov 21 2007, 14:43
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(Сергей Борщ @ Nov 21 2007, 17:20) *
У меня так: загрузчик живет по адресам 0x00100000 - 0x00100FFF (нулевой сектор флеш), файл SAM7_boot.xcl. Приложение живет вслед за загрузчиком, начиная с 0x00101000 (первый сектор флеш и далее), файл SAM7S64_boot_app.xcl. При включении питания или сбросе флеш отражена на нулевые адреса, на месте векторов оказываются вектора загрузчика, из вектора ресета считывается переход на загрузчик в адреса 0x00100000 - 0x00100FFF. Загрузчик получает управление. Если надо передать управление приложению, то загрузчик берет вектора приложения из адресов 0x00101000-0x0010103F, копирует их в озу по адресам 0x00200000-0x0020003F (эта область зарезервирована и в загрузчике и в приложении, чтобы там не оказались какие-либо данные). Загрузчик (работая в адресах 0x00100000 - 0x00100FFF) запрещает прерывания и делает ремап. При этом ОЗУ отражается на нулевые адреса и в области векторов оказываются скопированные в 0x00200000-0x0020003F вектора приложения. Загрузчик передает управление на нулевой адрес, т.е. на вектор ресет приложения. Из вектора считывается команда перехода на cstartup приложения, в адреса 0x00101040....


Ну, собственно, именно такой механизм я и имел в виду. Разница лишь в том, что я зачем-то (может, для скорости? wink.gif) предложил копировать все приложение из флеша в память, а потом - remap.
Важно то, что после ресета у нас pc=0, а следующая инструкция уже выполняется из диапазона 0x00100000-... Или, другими словами, таблица векторов (которую мы копируем) "живет" всегда по адресам из 0x000000-0x000003F, а переводит всегда на реальные адреса во флеше. Ну или в RAM, если копировать приложение.

Спасибо большое всем!
Похоже, до меня доперло wink.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- KAlex   IAR + SAM7S   Nov 12 2007, 12:07
- - zltigo   Цитата(KAlex @ Nov 12 2007, 14:07) Возмож...   Nov 12 2007, 12:22
|- - KAlex   Цитата(zltigo @ Nov 12 2007, 15:22) А в ч...   Nov 12 2007, 12:33
|- - zltigo   Цитата(KAlex @ Nov 12 2007, 14:33) Неизве...   Nov 12 2007, 13:18
|- - KAlex   Цитата(zltigo @ Nov 12 2007, 16:18) Для В...   Nov 12 2007, 13:27
|- - zltigo   Цитата(KAlex @ Nov 12 2007, 15:27) А как ...   Nov 12 2007, 13:36
|- - KAlex   Спасибо. То что надо.   Nov 13 2007, 08:31
|- - Kitsok   zltigo А вот немного не в тему. Есть девайс на ...   Nov 18 2007, 08:16
|- - Сергей Борщ   Цитата(Kitsok @ Nov 18 2007, 10:16) копир...   Nov 18 2007, 12:34
|- - Kitsok   Цитата(Сергей Борщ @ Nov 18 2007, 15:34) ...   Nov 18 2007, 19:32
|- - Сергей Борщ   Цитата(Kitsok @ Nov 18 2007, 21:32) необх...   Nov 19 2007, 13:13
|- - Kitsok   Цитата(Сергей Борщ @ Nov 19 2007, 16:13) ...   Nov 20 2007, 10:52
|- - Сергей Борщ   Цитата(Kitsok @ Nov 20 2007, 12:52) А вот...   Nov 20 2007, 12:30
|- - Kitsok   Цитата(Сергей Борщ @ Nov 20 2007, 15:30) ...   Nov 20 2007, 13:52
- - Kitsok   Цитата(Kitsok @ Nov 21 2007, 17:43) Похож...   Nov 21 2007, 22:55
- - Сергей Борщ   Цитата(Kitsok @ Nov 22 2007, 00:55) ... н...   Nov 22 2007, 11:35
- - Kitsok   Цитата(Сергей Борщ @ Nov 22 2007, 14:35) ...   Nov 22 2007, 12:05


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

 


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


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