|
Запуск кода из внешней памяти |
|
|
|
 |
Ответов
(15 - 29)
|
Sep 20 2017, 07:50
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(scifi @ Sep 20 2017, 10:40)  Кстати, вот вам ход конём: Сделать загрузчик и основную программу (2 раздельных проекта). Загрузчик, ясное дело, загружает, а потом передаёт управление основной программе. Там этих заморочек с настройками в разы меньше. это я уже делал и на блекфине и на stm32 теперь нечто подобное нужно сделать на миландре
|
|
|
|
|
Sep 20 2017, 09:12
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Значит так. Процессор ваш имеет 128 Кбайт Flash и 48 Кбайт RAM на ядре Cortex-M. 1. Пишете загрузчик, который выполняется из внутренней Flash при старте. В нём инициализируете внешнюю память и копируете в неё из какой-то внешней флэшки основной код полностью. Затем передаёте управление основной программе Код #define APPLICATION_ADDRESS 0xXXXXXXXX typedef void(*pFunction)(void); uint32_t app_jump_address = *( uint32_t*) (APPLICATION_ADDRESS + 4); //извлекаем адрес перехода из вектора Reset pFunction Jump_To_Application = (pFunction)app_jump_address; __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); //устанавливаем стек приложения Jump_To_Application(); 2. Основная программа ничего не знает о том что её откуда-то скопировали. Её задача только перенаправить на себя таблицу векторов прерываний. Код #pragma section = ".intvec" SCB->VTOR = (uint32_t) __section_begin(".intvec"); А стек я бы расположил всё же во внутренней RAM процессора. 48 кБ для стека это дофига вообще. Да и быстрее эта память обычно.
|
|
|
|
|
Sep 20 2017, 09:21
|

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

|
Цитата(VladislavS @ Sep 20 2017, 12:12)  В нём инициализируете внешнюю память и копируете в неё из какой-то внешней флэшки основной код полностью. Добавлю свои пять копеек: код должен быть зашифрован, если изделие коммерческое. А оно коммерческое по-любому, т. к. прозвучало ключевое слово - "миландр"  Открытые исходники различных шифровальщиков не проблема. Цитата 48 кБ для стека это дофига вообще. Дофига - мягко сказано! Видать, очень толстый проект, коли 48кБ ОЗУ не хватает
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Sep 20 2017, 10:00
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(Forger @ Sep 20 2017, 12:21)  Добавлю свои пять копеек: код должен быть зашифрован, если изделие коммерческое. А оно коммерческое по-любому, т. к. прозвучало ключевое слово - "миландр"  Открытые исходники различных шифровальщиков не проблема. С таким ключевым словом обычно чтобы поиметь доступ к процессору надо в открытый космос выходить Цитата(jcxz @ Sep 20 2017, 12:42)  Ну вот.... У человека был шанс чему-то разобраться, научиться, может даже стать наконец-то настоящим программистом... и опять ему помешали.....  А зачем вам конкуренты?
|
|
|
|
|
Sep 20 2017, 11:02
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(VladislavS @ Sep 20 2017, 12:12)  Значит так. Процессор ваш имеет 128 Кбайт Flash и 48 Кбайт RAM на ядре Cortex-M. 1. Пишете загрузчик, который выполняется из внутренней Flash при старте. В нём инициализируете внешнюю память и копируете в неё из какой-то внешней флэшки основной код полностью. Затем передаёте управление основной программе Код #define APPLICATION_ADDRESS 0xXXXXXXXX typedef void(*pFunction)(void); uint32_t app_jump_address = *( uint32_t*) (APPLICATION_ADDRESS + 4); //извлекаем адрес перехода из вектора Reset pFunction Jump_To_Application = (pFunction)app_jump_address; __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); //устанавливаем стек приложения Jump_To_Application(); 2. Основная программа ничего не знает о том что её откуда-то скопировали. Её задача только перенаправить на себя таблицу векторов прерываний. Код #pragma section = ".intvec" SCB->VTOR = (uint32_t) __section_begin(".intvec"); А стек я бы расположил всё же во внутренней RAM процессора. 48 кБ для стека это дофига вообще. Да и быстрее эта память обычно. спасиб, но так я уже делал на STM тут вот в чем дело - мне хотелось бы чтобы и стек и куча и все функции изначально поместились бы во внешней RAM я вот что подумал - в принципе все армы они похожы и какой нибудь ARM7 не имеет на борту SRAM но как то может работать сразу из внешней памяти я вот и подумал что мой простенький контроллер так же сможет разобрался в System init написал инициализацию внешней шины или внешних шин.. далее в скрипте для линкера изменил: CODE place in ROM_region { readonly }; place in SRAM_region { block CSTACK }; place in XRAM_region { readwrite, block HEAP };
и все мои переменные оказались во внешней памяти программа работает щас попытаюсь функции туда же запихнуть
|
|
|
|
|
Sep 20 2017, 11:07
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(inventor @ Sep 20 2017, 14:02)  щас попытаюсь функции туда же запихнуть Где у вас прошивка изначально то размещается? Цитата(inventor @ Sep 20 2017, 14:02)  тут вот в чем дело - мне хотелось бы чтобы и стек и куча А потом вертолёты сами по целям лупят...  Делать надо как надо, а как не надо делать не надо.
|
|
|
|
|
Sep 20 2017, 11:15
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(jcxz @ Sep 20 2017, 13:22)  Недавно убила фраза друга (далёкого от программирования): "Ну ты же знаешь - самые сильные программисты в Индии, все самые сложные заказы отправляются туда."... вполне возможно так и есть у индийцев перед китайцами, русскими, французами и прочими зулусами есть одно преимущество - они англоязычные то есть они литературу просто читают а не читают и в голове переводят на свой язык. Цитата(VladislavS @ Sep 20 2017, 14:07)  Где у вас прошивка изначально то размещается? во внутренней flash Цитата(VladislavS) А потом вертолёты сами по целям лупят...  Делать надо как надо, а как не надо делать не надо. это с запасом, так как сам проект имеет большие объемы данных с которыми надо работать, а в 48 кБайтах они по любому не поместятся
|
|
|
|
|
Sep 20 2017, 11:31
|

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

|
Цитата(inventor @ Sep 20 2017, 14:15)  в 48 кБайтах они по любому не поместятся Чудовищные глобальные или статически массивы - во внешней ОЗУ, это понятно. Еще понимаю разместить во внешней ОЗУ кучу (heap). Но что за проект такой, где прям нужен такой чумовой стек > 48кБ да еще и в относительно медленной памяти?!
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|