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

 
 
> Запуск кода из внешней памяти
inventor
сообщение Sep 19 2017, 16:18
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



подскажите мне вот что
имеется арм контроллер
в котором ест 48 килобайт памяти
этого мало для моих задач, я подцепил 4 Мбайт внешней памяти
и хочу что бы старт начался из нее, а не из внутренней SRAM
и чтобы стек там же располагался
как мне это правильно сделать
чтобы стек так же расположить во внешней памяти?

вот у меня есть файлstartup_MYCPU.s
где есть вызов LDR R0, =SystemInit
что я должен сделать внутри System Init
кроме настройки внешней шины адреса, данных, управления?
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 14)
dimka76
сообщение Sep 19 2017, 18:28
Сообщение #2


developer
****

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



Вы даже марку контроллера не упомянули.

А так вам еще и скрипт линкера подправить надо будет и скопировать вашу программу во внешнюю память.
Отремапить таблицу векторов прерывания.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Obam
сообщение Sep 19 2017, 19:38
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Ещё "бензинчику" добавлю (; загрузка в R0 адреса SystemInit ничего не вызовет.
Внешняя память то какая: flash? ram?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
golf2109
сообщение Sep 20 2017, 01:24
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 15-04-10
Из: Kiev
Пользователь №: 56 654



Цитата(Obam @ Sep 19 2017, 21:38) *
Ещё "бензинчику" добавлю (; загрузка в R0 адреса SystemInit ничего не вызовет.
Внешняя память то какая: flash? ram?

наверное SPI Flash
Go to the top of the page
 
+Quote Post
inventor
сообщение Sep 20 2017, 06:53
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Obam @ Sep 19 2017, 22:38) *
Ещё "бензинчику" добавлю (; загрузка в R0 адреса SystemInit ничего не вызовет.
Внешняя память то какая: flash? ram?

RAM
контроллер миландр
ну так что мне нужно сделать, по шагам?

THUMB

; Reset Handler
PUBWEAK Reset_Handler
SECTION .text:CODE:NOROOT:REORDER(2)
Reset_Handler
LDR R0, =SystemInit
BLX R0
LDR R0, =__iar_program_start
BX R0


вот так начинается программа
скрипт линкера такой:

CODE
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x00000000;

/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x0001ffff;

/* Внутренняя память */
define symbol __ICFEDIT_region_SRAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_SRAM_end__ = 0x20007fff;

/* Внешняя память */
define symbol __ICFEDIT_region_XRAM_start__= 0x60200000;
define symbol __ICFEDIT_region_XRAM_end__ = (0x60200000 + 0x00040000 - 1);

/* Стек и куча */
define symbol __ICFEDIT_size_cstack__ = 0x2000;
define symbol __ICFEDIT_size_heap__ = 0x4000;

/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region SRAM_region = mem:[from __ICFEDIT_region_SRAM_start__ to __ICFEDIT_region_SRAM_end__];
define region XRAM_region = mem:[from __ICFEDIT_region_XRAM_start__ to __ICFEDIT_region_XRAM_end__];


define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };

initialize by copy { readwrite };
do not initialize { section .noinit };

keep { section .intvec };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region { readonly };
place in SRAM_region { readwrite,
block CSTACK,
block HEAP};


/* place in XRAM_region {readwrite}; */
//place in RAM_region{ block HEAP };

Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 20 2017, 06:58
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(inventor @ Sep 20 2017, 09:53) *
ну так что мне нужно сделать, по шагам?

Назвать марку проца, памяти и название среды разработки (хотя не нужно, догадались - IAR).


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
inventor
сообщение Sep 20 2017, 06:58
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



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

CPU milandr 1986ВЕ3
память RAM то же миландр
подклчается через 2 ноги на адреса
то есть адрес RAM A0 идет на адрес A2 проца
то есть обращение 32 разрядное

среда разработки IAR 6.5
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 20 2017, 07:02
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(inventor @ Sep 20 2017, 09:58) *
1986ВЕ3

В мануале к IAR должно быть расжевано как настраивать скрипт линкера. Полистайте хелп к IAR.
При старте все равно запуск должен производится из внутренней FLASH, в которой будет настраивается контроллер памяти,
после чего копируется исполняемый код из FLASH (код должен быть скомпилирован для работы с определенного адреса) во внешнюю ОЗУ,
делается REMAP векторов, стека и передается управление во внешнее ОЗУ.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Integro
сообщение Sep 20 2017, 07:04
Сообщение #9


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

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



Цитата(inventor @ Sep 20 2017, 09:53) *
RAM
контроллер миландр
ну так что мне нужно сделать, по шагам?


миландр, этого мало, какой?
RAM, интерфейс?

вкратце, если SRAM подключена по штатному интерфейсу и память будет замаплена на адреса рабочего пространства, то проблем не должно быть.
- Обычно в файлах startup.c (.S) вызывается SystemInit там нужно включить инициализацию RAM
- Дальше, зная адреса RAM, добавляем в линкер скрип регион RAM, распологаем там стек

UPD: долго печатал)
Go to the top of the page
 
+Quote Post
inventor
сообщение Sep 20 2017, 07:15
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Integro @ Sep 20 2017, 10:04) *
миландр, этого мало, какой?
RAM, интерфейс?

вкратце, если SRAM подключена по штатному интерфейсу и память будет замаплена на адреса рабочего пространства, то проблем не должно быть.
- Обычно в файлах startup.c (.S) вызывается SystemInit там нужно включить инициализацию RAM
- Дальше, зная адреса RAM, добавляем в линкер скрип регион RAM, распологаем там стек

UPD: долго печатал)

там еще такое, чтобы внешняя памят заработала
я настраивают выводы для работы с интерфейсом внешней памяти
то есть какие выводы будут шиной данных, какие шиной адреса
а какие управляющие, и кроме этого настраиваю memory region
и задаю число циклов ожидание и пр.
эта функция, как я понимаю, должна быть вызвана до все этих ремапов?

понятно, не видел собщение предыдущее
такой еще вопрос: в SystemInit инициализацию Ram делать
напрямую обращаясь к регистрам или вызываьт функции (использовать стек и пр) ?
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 20 2017, 07:17
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Я бы не стал мудрить с полным переносом кода во внешнюю ОЗУ, а размещал там лишь некоторые функции, которые должны работать оттуда.
IAR поддерживает RAM-функции (читайте хелп к нему).
Тогда нужно лишь настроить правильно скрипт линкера (читайте хелп к IAR) и выбрать нужные функции, которые должны работать во внешней ОЗУ (как это делать тоже есть в хелпе к IAR).
Если стек не конский, то я бы разместил его (и скорее всего вектора) во внутренней ОЗУ, если она работает быстрее внешней ОЗУ. Но вектора можно оставить во FLASH.
Если используется огромная куча (heap), то ее - во внешнюю ОЗУ.
Разумеется, инициализация контроллера памяти для внешней ОЗУ должна выполнять ДО того как обращаетесь к ней.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Integro
сообщение Sep 20 2017, 07:24
Сообщение #12


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

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



Цитата(inventor @ Sep 20 2017, 10:15) *
эта функция, как я понимаю, должна быть вызвана до все этих ремапов?

RAM и все пины нужно настроить до вызова __iar_program_start, тоесть в SystemInit()

Функция __iar_program_start начинает инициализивать "стреду" компилятора, тоесть инициализоровать переменные (секции .bss и .data) если они будут лежать во внешней рам, это критично.
Кроме того, __iar_program_start уже может пользовать стек.

Код
Reset_Handler
LDR R0, =SystemInit
BLX R0
LDR R0, =__iar_program_start
BX R0


UPD:
Цитата(inventor @ Sep 20 2017, 10:15) *
напрямую обращаясь к регистрам или вызываьт функции (использовать стек и пр) ?

Можно постараться не использовать стек, тоесть напрямую через регистры.
Можно подменить на время инициализции, стек, на нормальную SRAM потом вернуть, делается это через регист SP (MSP)
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 20 2017, 07:40
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Ещё интересный вопрос, где хранится код программы (тот, который большой и никуда не помещается) и как планируете его закачать во внешнее ОЗУ.
Кстати, вот вам ход конём:
Сделать загрузчик и основную программу (2 раздельных проекта). Загрузчик, ясное дело, загружает, а потом передаёт управление основной программе. Там этих заморочек с настройками в разы меньше.
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 20 2017, 07:48
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Для толстых проектов обычно ставят внешнюю FLASH (по SPI) с загружаемым образом (шифрованным-упакованным), который при старке кидается во внешнюю ОЗУ, и из нее запускается.

зы. пока писал этот пост, меня опередили ))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 20 2017, 07:50
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Forger @ Sep 20 2017, 10:48) *
Для толстых проектов обычно ставят внешнюю FLASH (по SPI) с загружаемым образом (шифрованным-упакованным), который при старке кидается во внешнюю ОЗУ, и из нее запускается.

ЕМНИП, FTDI сделал МК, в котором SPI флеш сидит внутри в роли ПЗУ. При старте автоматичски копируется в ОЗУ и запускается.
тыц
Go to the top of the page
 
+Quote Post

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

 


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


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