Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загрузка функций в RAM по заданному адресу
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Punk
Приветствую.
Есть Устройство:

LPC2294+внешняя RAM+SD карта+LCD
------------------------------------------
Есть ли возможность в Кейле компилировать заданные функции программы в отдельные бинарники? затем сохраняем эти бинарники, скажем, на SD карте, а уже с нее грузим необходимые (выбранные в меню девайса) бинарники в RAM и запускаем их на выполнение. Что в этой идее реально и выполнимо?

P.S. говоря очень простым языком: Хочу чтобы как на PC, выбрал exe-шник с диска и запустил
kovigor
Цитата(Punk @ Sep 16 2010, 13:43) *
P.S. говоря очень простым языком: Хочу чтобы как на PC, выбрал exe-шник с диска и запустил


На PC это реализуется средставми ОС, а никак не компилятора. Может, и здесь какой-то Linux использовать ?
Punk
Цитата(kovigor @ Sep 16 2010, 22:08) *
На PC это реализуется средставми ОС, а никак не компилятора. Может, и здесь какой-то Linux использовать ?

Да, была идея Линукс прикрутить, но хочется все же разобраться с возможностью своими средствами загружать код с внешнего носителя в RAM и исполнять его там.
Сейчас думаю сделать так: Написать программу которая будет локализована во внутреннем флеше контроллера и будет грузить скомпилированный в hex файл проект в RAM и передавать ему управление. Получится что-то вроде альтернативного загрузчика., если получится гг=) , главное после выполнения загруженного кода вновь возвращаться в загрузчик.
SPACUM
Цитата(Punk @ Sep 16 2010, 22:55) *
Сейчас думаю сделать так: Написать программу которая будет локализована во внутреннем флеше контроллера и будет грузить скомпилированный в hex файл проект в RAM и передавать ему управление. Получится что-то вроде альтернативного загрузчика., если получится гг=) , главное после выполнения загруженного кода вновь возвращаться в загрузчик.

В этом процессоре программы неперемещаемые. Придется каждой выбирать свое место. А в чем основная необходимость? Уже весь флеш кончился или хотите одну программу на все случаи? Вроде записывать на флешку и запускать из процессора это чистая мутотень при отладке. Я написал такую программу, а применять не хочется.
SergeyDDD
Цитата(Punk @ Sep 16 2010, 13:43) *
Приветствую.
Есть Устройство:

LPC2294+внешняя RAM+SD карта+LCD
------------------------------------------
Есть ли возможность в Кейле компилировать заданные функции программы в отдельные бинарники? затем сохраняем эти бинарники, скажем, на SD карте, а уже с нее грузим необходимые (выбранные в меню девайса) бинарники в RAM и запускаем их на выполнение. Что в этой идее реально и выполнимо?

P.S. говоря очень простым языком: Хочу чтобы как на PC, выбрал exe-шник с диска и запустил


Да вроде как не проблема
Допустим на внутреннем флеше находится загрузчик и Ваше меню для запуска программ с SD
В скаттер-файле загрузчика выделяете свой RW_RAM регион или используете сугубо RW_IRAM1(внутреннее ОЗУ)
IROM1 остается на 0x00000000

Для запускаемых с SD приложений переписываете скаттер-файл скажем так:
IROM1 меняете на 0x80000000 (внешнее ОЗУ)
RW_RAM прописываете для региона отличного от RW_RAM загрузчика

А дальше загрузчик грузит выбранный бинарник в область 0x80000000
В Memory Mapping Control Register (MEMMAP - 0xE01FC040) выбирает "User External memory Mode. Interrupt vectors are re-mapped to external memory" (при замаскированном прерывании)
И прыгает по адресу 0x80000000



И еще...
Отладка SD-шной программы тоже не проблема
Нужно только написать свой кейловский драйвер (Keil\ARM\Flash), который в Init конфигурирует внешнее ОЗУ (External Memory Controller - EMC) и в ProgramPage грузит прошивку в 0x80000000

Ну и видимо в SD-шной программе из Startup.s повыкидывать все лишнее
Punk
Цитата(SPACUM @ Sep 16 2010, 23:37) *
В этом процессоре программы неперемещаемые. Придется каждой выбирать свое место. А в чем основная необходимость? Уже весь флеш кончился или хотите одну программу на все случаи?....

Чисто спортивный интерес=)

Цитата(SergeyDDD @ Sep 17 2010, 00:45) *
Да вроде как не проблема
Допустим на внутреннем флеше находится загрузчик и Ваше меню для запуска программ с SD
В скаттер-файле загрузчика выделяете свой RW_RAM регион или используете сугубо RW_IRAM1(внутреннее ОЗУ)
IROM1 остается на 0x00000000............................


Да! То что нужно, Только вот не понятно зачем редактировать startup.s программы подгружаемой в RAM? управление же полностью ей передается, пусть и пашет со своими установками.
Dron_Gus
Цитата(Punk @ Sep 17 2010, 07:36) *
Да! То что нужно, Только вот не понятно зачем редактировать startup.s программы подгружаемой в RAM? управление же полностью ей передается, пусть и пашет со своими установками.

Потому что в этом файле находятся вектора прерываний. Они в Вашем случае не нужны. Плюс там же обычно настройка стэков и возможно PLL, памяти и еще чего-нибудь. Вам это тоже не надо.
SergeyDDD
Цитата(Punk @ Sep 17 2010, 06:36) *
Чисто спортивный интерес=)



Да! То что нужно, Только вот не понятно зачем редактировать startup.s программы подгружаемой в RAM? управление же полностью ей передается, пусть и пашет со своими установками.


Ну в смысле повыбрасывать аппаратную конфигурацию в startup
Я думаю повторная конфигурация внешней памяти PLL и прочего это излишнее
За нее это сделает или драйвер кейла при отладке, или загрузчик
А настройку стеков и кучи лучше оставить

Можете в startup завести по определенному адресу 32-битный регион, куда загрузчик будет класть адрес точки возврата в загрузчик
Да... и там же не забудьте разрешить прерывание, которое должен запретить загрузчик, когда меняет "Memory Mapping Control Register"

2 Dron_Gus
благодаря "Memory Mapping Control Register" вектора там будут
Dron_Gus
Цитата(SergeyDDD @ Sep 17 2010, 12:25) *
благодаря "Memory Mapping Control Register" вектора там будут

Топикстартер не уточнил, нужен ли ему возврат из таких "подпрограмм" и "фоновая" работа основного ПО.
Punk
Цитата(Dron_Gus @ Sep 17 2010, 12:30) *
Топикстартер не уточнил, нужен ли ему возврат из таких "подпрограмм" и "фоновая" работа основного ПО.

Да, возврат нужен
Punk
Цитата(SergeyDDD @ Sep 17 2010, 00:45) *
И прыгает по адресу 0x80000000


А как перепрыгнуть подскажите? Насколько я понял из манула на RealView комманду LDR PC,xxx инлайн в С-коде выполнить нельзя
Сергей Борщ
Цитата(Punk @ Sep 29 2010, 13:23) *
комманду LDR PC,xxx инлайн в С-коде выполнить нельзя
А вызвать функцию по (константному) указателю?
Punk
Цитата(Сергей Борщ @ Sep 29 2010, 15:17) *
А вызвать функцию по (константному) указателю?


Да,спасибо, так и сделаю. торможу что-то.
А все-таки посредством ассемблера это как-то можно реализовать? (спортивный интерес)
SergeyDDD
Цитата(Punk @ Sep 29 2010, 13:23) *
А как перепрыгнуть подскажите? Насколько я понял из манула на RealView комманду LDR PC,xxx инлайн в С-коде выполнить нельзя


создайте в проекте ассемблерный файл с функцией в которой делаете перехода на 0х80000000
функцию разрешите на экспорт

или ...
void (*pFuncJump) (void);
pFuncJump= (void(*)(void))0x80000000;
pFuncJump();

Punk
Вобчем дошло дело до испытаний кода, все немного упростилось, а именно:

Железо: платка от OLIMEX, с LPC2129 на борту, COMпортовый шнурок, PC
Софт: В LPC2129 небольшой код который грузит данные принимаемые через RS232 в RAM, начиная с адреса 0x40000000.
На PC программа, которая передает в LPC2129, скомпилированный кейлом бинарник, размер которого 1килобайт

Код грузится в RAM без проблем, проверял вычитывая RAM. Но после того как я из основного кода прыгаю в RAM проц сбрасывается...


Из стартапа бинарника копируемого в RAM убрал все вектора., ничего не изменилось.
Что не так делаю?
Student Pupkin
Цитата(Punk @ Sep 30 2010, 14:53) *
после того как я из основного кода прыгаю в RAM проц сбрасывается...

Как делаете переход? Про ремап не забыли? smile.gif
Цитата(Punk @ Sep 30 2010, 14:53) *
Из стартапа бинарника копируемого в RAM убрал все вектора., ничего не изменилось.

??? А как же тогда прога, копируемая в RAM, будет переходит на свои обработчики исключений (прерываний)? Скаттер для RAM-проги покажите заодно... И стартап до кучи. smile.gif
Punk
Цитата(Student Pupkin @ Sep 30 2010, 16:20) *
Как делаете переход? Про ремап не забыли? smile.gif


Перечитал еще раз ответы общественности, и нашел ошибки в своем коде, а именно:
1. IROM для загружаемой в RAM программы начинался с 0x0 адреса, сделал с 0x40000000
2. Пересекались RW регионы основного кода и загружаемого.
После исправлений все заработало, не тестил только работу прерываний, во время работы RAM кода.

Спасибо за всем за ответы, если кому интересно могу код выложить
segment
Выложи, пожалуйста.
Punk
Цитата(Сега @ Oct 1 2010, 10:48) *
Выложи, пожалуйста.

пожалуйста. Комментов в коде толком нет, там понятно все боле мене. Можно сказать что посты в этом топике это и есть комменты=)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.