реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Загрузка функций в RAM по заданному адресу
Punk
сообщение Sep 16 2010, 10:43
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 19-06-06
Из: Новосибирск
Пользователь №: 18 167



Приветствую.
Есть Устройство:

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

P.S. говоря очень простым языком: Хочу чтобы как на PC, выбрал exe-шник с диска и запустил
Go to the top of the page
 
+Quote Post
kovigor
сообщение Sep 16 2010, 18:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



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


На PC это реализуется средставми ОС, а никак не компилятора. Может, и здесь какой-то Linux использовать ?
Go to the top of the page
 
+Quote Post
Punk
сообщение Sep 16 2010, 18:55
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 19-06-06
Из: Новосибирск
Пользователь №: 18 167



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

Да, была идея Линукс прикрутить, но хочется все же разобраться с возможностью своими средствами загружать код с внешнего носителя в RAM и исполнять его там.
Сейчас думаю сделать так: Написать программу которая будет локализована во внутреннем флеше контроллера и будет грузить скомпилированный в hex файл проект в RAM и передавать ему управление. Получится что-то вроде альтернативного загрузчика., если получится гг=) , главное после выполнения загруженного кода вновь возвращаться в загрузчик.

Сообщение отредактировал Punk - Sep 16 2010, 18:58
Go to the top of the page
 
+Quote Post
SPACUM
сообщение Sep 16 2010, 19:37
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531



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

В этом процессоре программы неперемещаемые. Придется каждой выбирать свое место. А в чем основная необходимость? Уже весь флеш кончился или хотите одну программу на все случаи? Вроде записывать на флешку и запускать из процессора это чистая мутотень при отладке. Я написал такую программу, а применять не хочется.


--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
Go to the top of the page
 
+Quote Post
SergeyDDD
сообщение Sep 16 2010, 20:45
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 231
Регистрация: 7-12-06
Из: Киев
Пользователь №: 23 248



Цитата(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 повыкидывать все лишнее
Go to the top of the page
 
+Quote Post
Punk
сообщение Sep 17 2010, 03:36
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 19-06-06
Из: Новосибирск
Пользователь №: 18 167



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

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

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


Да! То что нужно, Только вот не понятно зачем редактировать startup.s программы подгружаемой в RAM? управление же полностью ей передается, пусть и пашет со своими установками.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 06:41
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



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

Потому что в этом файле находятся вектора прерываний. Они в Вашем случае не нужны. Плюс там же обычно настройка стэков и возможно PLL, памяти и еще чего-нибудь. Вам это тоже не надо.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
SergeyDDD
сообщение Sep 17 2010, 08:25
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 231
Регистрация: 7-12-06
Из: Киев
Пользователь №: 23 248



Цитата(Punk @ Sep 17 2010, 06:36) *
Чисто спортивный интерес=)



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


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

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

2 Dron_Gus
благодаря "Memory Mapping Control Register" вектора там будут
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 08:30
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



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

Топикстартер не уточнил, нужен ли ему возврат из таких "подпрограмм" и "фоновая" работа основного ПО.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Punk
сообщение Sep 17 2010, 10:28
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 19-06-06
Из: Новосибирск
Пользователь №: 18 167



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

Да, возврат нужен
Go to the top of the page
 
+Quote Post
Punk
сообщение Sep 29 2010, 10:23
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 19-06-06
Из: Новосибирск
Пользователь №: 18 167



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


А как перепрыгнуть подскажите? Насколько я понял из манула на RealView комманду LDR PC,xxx инлайн в С-коде выполнить нельзя
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 29 2010, 11:17
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Punk
сообщение Sep 29 2010, 11:31
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 19-06-06
Из: Новосибирск
Пользователь №: 18 167



Цитата(Сергей Борщ @ Sep 29 2010, 15:17) *
А вызвать функцию по (константному) указателю?


Да,спасибо, так и сделаю. торможу что-то.
А все-таки посредством ассемблера это как-то можно реализовать? (спортивный интерес)
Go to the top of the page
 
+Quote Post
SergeyDDD
сообщение Sep 29 2010, 11:44
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 231
Регистрация: 7-12-06
Из: Киев
Пользователь №: 23 248



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


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

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

Go to the top of the page
 
+Quote Post
Punk
сообщение Sep 30 2010, 10:53
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 19-06-06
Из: Новосибирск
Пользователь №: 18 167



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

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

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


Из стартапа бинарника копируемого в RAM убрал все вектора., ничего не изменилось.
Что не так делаю?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 21:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01504 секунд с 7
ELECTRONIX ©2004-2016