Перейти к содержанию
    

Запуск кода из внешней памяти в 1986ВЕ3

подскажите мне вот что

имеется арм контроллер

в котором ест 48 килобайт памяти

этого мало для моих задач, я подцепил 4 Мбайт внешней памяти

и хочу что бы старт начался из нее, а не из внутренней SRAM

и чтобы стек там же располагался

как мне это правильно сделать

чтобы стек так же расположить во внешней памяти?

 

вот у меня есть файлstartup_MYCPU.s

где есть вызов LDR R0, =SystemInit

что я должен сделать внутри System Init

кроме настройки внешней шины адреса, данных, управления?

Изменено пользователем haker_fox
Уточнил название темы, добавил теги.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Отремапить таблицу векторов прерывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё "бензинчику" добавлю (; загрузка в R0 адреса SystemInit ничего не вызовет.

Внешняя память то какая: flash? ram?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё "бензинчику" добавлю (; загрузка в R0 адреса SystemInit ничего не вызовет.

Внешняя память то какая: flash? ram?

наверное SPI Flash

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё "бензинчику" добавлю (; загрузка в 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

 

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

скрипт линкера такой:

 

/*###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 };

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

и данные

 

CPU milandr 1986ВЕ3

память RAM то же миландр

подклчается через 2 ноги на адреса

то есть адрес RAM A0 идет на адрес A2 проца

то есть обращение 32 разрядное

 

среда разработки IAR 6.5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1986ВЕ3

В мануале к IAR должно быть расжевано как настраивать скрипт линкера. Полистайте хелп к IAR.

При старте все равно запуск должен производится из внутренней FLASH, в которой будет настраивается контроллер памяти,

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

делается REMAP векторов, стека и передается управление во внешнее ОЗУ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

RAM

контроллер миландр

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

 

миландр, этого мало, какой?

RAM, интерфейс?

 

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

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

- Дальше, зная адреса RAM, добавляем в линкер скрип регион RAM, распологаем там стек

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

миландр, этого мало, какой?

RAM, интерфейс?

 

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

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

- Дальше, зная адреса RAM, добавляем в линкер скрип регион RAM, распологаем там стек

 

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

там еще такое, чтобы внешняя памят заработала

я настраивают выводы для работы с интерфейсом внешней памяти

то есть какие выводы будут шиной данных, какие шиной адреса

а какие управляющие, и кроме этого настраиваю memory region

и задаю число циклов ожидание и пр.

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

 

понятно, не видел собщение предыдущее

такой еще вопрос: в SystemInit инициализацию Ram делать

напрямую обращаясь к регистрам или вызываьт функции (использовать стек и пр) ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы не стал мудрить с полным переносом кода во внешнюю ОЗУ, а размещал там лишь некоторые функции, которые должны работать оттуда.

IAR поддерживает RAM-функции (читайте хелп к нему).

Тогда нужно лишь настроить правильно скрипт линкера (читайте хелп к IAR) и выбрать нужные функции, которые должны работать во внешней ОЗУ (как это делать тоже есть в хелпе к IAR).

Если стек не конский, то я бы разместил его (и скорее всего вектора) во внутренней ОЗУ, если она работает быстрее внешней ОЗУ. Но вектора можно оставить во FLASH.

Если используется огромная куча (heap), то ее - во внешнюю ОЗУ.

Разумеется, инициализация контроллера памяти для внешней ОЗУ должна выполнять ДО того как обращаетесь к ней.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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:

напрямую обращаясь к регистрам или вызываьт функции (использовать стек и пр) ?

Можно постараться не использовать стек, тоесть напрямую через регистры.

Можно подменить на время инициализции, стек, на нормальную SRAM потом вернуть, делается это через регист SP (MSP)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё интересный вопрос, где хранится код программы (тот, который большой и никуда не помещается) и как планируете его закачать во внешнее ОЗУ.

Кстати, вот вам ход конём:

Сделать загрузчик и основную программу (2 раздельных проекта). Загрузчик, ясное дело, загружает, а потом передаёт управление основной программе. Там этих заморочек с настройками в разы меньше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

ЕМНИП, FTDI сделал МК, в котором SPI флеш сидит внутри в роли ПЗУ. При старте автоматичски копируется в ОЗУ и запускается.

тыц

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...