|
Запуск кода из внешней памяти |
|
|
|
 |
Ответов
(1 - 14)
|
Sep 20 2017, 01:24
|
Участник

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

|
Цитата(Obam @ Sep 19 2017, 21:38)  Ещё "бензинчику" добавлю (; загрузка в R0 адреса SystemInit ничего не вызовет. Внешняя память то какая: flash? ram? наверное SPI Flash
|
|
|
|
|
Sep 20 2017, 06:53
|
Знающий
   
Группа: Свой
Сообщений: 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 };
|
|
|
|
|
Sep 20 2017, 07:02
|

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

|
Цитата(inventor @ Sep 20 2017, 09:58)  1986ВЕ3 В мануале к IAR должно быть расжевано как настраивать скрипт линкера. Полистайте хелп к IAR. При старте все равно запуск должен производится из внутренней FLASH, в которой будет настраивается контроллер памяти, после чего копируется исполняемый код из FLASH (код должен быть скомпилирован для работы с определенного адреса) во внешнюю ОЗУ, делается REMAP векторов, стека и передается управление во внешнее ОЗУ.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Sep 20 2017, 07:04
|

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

|
Цитата(inventor @ Sep 20 2017, 09:53)  RAM контроллер миландр ну так что мне нужно сделать, по шагам? миландр, этого мало, какой? RAM, интерфейс? вкратце, если SRAM подключена по штатному интерфейсу и память будет замаплена на адреса рабочего пространства, то проблем не должно быть. - Обычно в файлах startup.c (.S) вызывается SystemInit там нужно включить инициализацию RAM - Дальше, зная адреса RAM, добавляем в линкер скрип регион RAM, распологаем там стек UPD: долго печатал)
|
|
|
|
|
Sep 20 2017, 07:15
|
Знающий
   
Группа: Свой
Сообщений: 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 делать напрямую обращаясь к регистрам или вызываьт функции (использовать стек и пр) ?
|
|
|
|
|
Sep 20 2017, 07:24
|

Частый гость
 
Группа: Свой
Сообщений: 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|