inventor 0 19 сентября, 2017 Опубликовано 19 сентября, 2017 (изменено) · Жалоба подскажите мне вот что имеется арм контроллер в котором ест 48 килобайт памяти этого мало для моих задач, я подцепил 4 Мбайт внешней памяти и хочу что бы старт начался из нее, а не из внутренней SRAM и чтобы стек там же располагался как мне это правильно сделать чтобы стек так же расположить во внешней памяти? вот у меня есть файлstartup_MYCPU.s где есть вызов LDR R0, =SystemInit что я должен сделать внутри System Init кроме настройки внешней шины адреса, данных, управления? Изменено 16 ноября, 2022 пользователем haker_fox Уточнил название темы, добавил теги. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 19 сентября, 2017 Опубликовано 19 сентября, 2017 · Жалоба Вы даже марку контроллера не упомянули. А так вам еще и скрипт линкера подправить надо будет и скопировать вашу программу во внешнюю память. Отремапить таблицу векторов прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 19 сентября, 2017 Опубликовано 19 сентября, 2017 · Жалоба Ещё "бензинчику" добавлю (; загрузка в R0 адреса SystemInit ничего не вызовет. Внешняя память то какая: flash? ram? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
golf2109 0 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба Ещё "бензинчику" добавлю (; загрузка в R0 адреса SystemInit ничего не вызовет. Внешняя память то какая: flash? ram? наверное SPI Flash Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба Ещё "бензинчику" добавлю (; загрузка в 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 }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба ну так что мне нужно сделать, по шагам? Назвать марку проца, памяти и название среды разработки (хотя не нужно, догадались - IAR). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба неицинициализированные данные я там могу расположить теперь дело встало за тем, чтобы там жили функции и данные CPU milandr 1986ВЕ3 память RAM то же миландр подклчается через 2 ноги на адреса то есть адрес RAM A0 идет на адрес A2 проца то есть обращение 32 разрядное среда разработки IAR 6.5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба 1986ВЕ3 В мануале к IAR должно быть расжевано как настраивать скрипт линкера. Полистайте хелп к IAR. При старте все равно запуск должен производится из внутренней FLASH, в которой будет настраивается контроллер памяти, после чего копируется исполняемый код из FLASH (код должен быть скомпилирован для работы с определенного адреса) во внешнюю ОЗУ, делается REMAP векторов, стека и передается управление во внешнее ОЗУ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба RAM контроллер миландр ну так что мне нужно сделать, по шагам? миландр, этого мало, какой? RAM, интерфейс? вкратце, если SRAM подключена по штатному интерфейсу и память будет замаплена на адреса рабочего пространства, то проблем не должно быть. - Обычно в файлах startup.c (.S) вызывается SystemInit там нужно включить инициализацию RAM - Дальше, зная адреса RAM, добавляем в линкер скрип регион RAM, распологаем там стек UPD: долго печатал) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба миландр, этого мало, какой? RAM, интерфейс? вкратце, если SRAM подключена по штатному интерфейсу и память будет замаплена на адреса рабочего пространства, то проблем не должно быть. - Обычно в файлах startup.c (.S) вызывается SystemInit там нужно включить инициализацию RAM - Дальше, зная адреса RAM, добавляем в линкер скрип регион RAM, распологаем там стек UPD: долго печатал) там еще такое, чтобы внешняя памят заработала я настраивают выводы для работы с интерфейсом внешней памяти то есть какие выводы будут шиной данных, какие шиной адреса а какие управляющие, и кроме этого настраиваю memory region и задаю число циклов ожидание и пр. эта функция, как я понимаю, должна быть вызвана до все этих ремапов? понятно, не видел собщение предыдущее такой еще вопрос: в SystemInit инициализацию Ram делать напрямую обращаясь к регистрам или вызываьт функции (использовать стек и пр) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба Я бы не стал мудрить с полным переносом кода во внешнюю ОЗУ, а размещал там лишь некоторые функции, которые должны работать оттуда. IAR поддерживает RAM-функции (читайте хелп к нему). Тогда нужно лишь настроить правильно скрипт линкера (читайте хелп к IAR) и выбрать нужные функции, которые должны работать во внешней ОЗУ (как это делать тоже есть в хелпе к IAR). Если стек не конский, то я бы разместил его (и скорее всего вектора) во внутренней ОЗУ, если она работает быстрее внешней ОЗУ. Но вектора можно оставить во FLASH. Если используется огромная куча (heap), то ее - во внешнюю ОЗУ. Разумеется, инициализация контроллера памяти для внешней ОЗУ должна выполнять ДО того как обращаетесь к ней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба эта функция, как я понимаю, должна быть вызвана до все этих ремапов? 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба Ещё интересный вопрос, где хранится код программы (тот, который большой и никуда не помещается) и как планируете его закачать во внешнее ОЗУ. Кстати, вот вам ход конём: Сделать загрузчик и основную программу (2 раздельных проекта). Загрузчик, ясное дело, загружает, а потом передаёт управление основной программе. Там этих заморочек с настройками в разы меньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба Для толстых проектов обычно ставят внешнюю FLASH (по SPI) с загружаемым образом (шифрованным-упакованным), который при старке кидается во внешнюю ОЗУ, и из нее запускается. зы. пока писал этот пост, меня опередили )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба Для толстых проектов обычно ставят внешнюю FLASH (по SPI) с загружаемым образом (шифрованным-упакованным), который при старке кидается во внешнюю ОЗУ, и из нее запускается. ЕМНИП, FTDI сделал МК, в котором SPI флеш сидит внутри в роли ПЗУ. При старте автоматичски копируется в ОЗУ и запускается. тыц Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться