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

 
 
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
Student Pupkin
сообщение Sep 30 2010, 12:20
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760



Цитата(Punk @ Sep 30 2010, 14:53) *
после того как я из основного кода прыгаю в RAM проц сбрасывается...

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

??? А как же тогда прога, копируемая в RAM, будет переходит на свои обработчики исключений (прерываний)? Скаттер для RAM-проги покажите заодно... И стартап до кучи. smile.gif
Go to the top of the page
 
+Quote Post
Punk
сообщение Oct 1 2010, 05:00
Сообщение #17


Местный
***

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



Цитата(Student Pupkin @ Sep 30 2010, 16:20) *
Как делаете переход? Про ремап не забыли? smile.gif


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

Спасибо за всем за ответы, если кому интересно могу код выложить
Go to the top of the page
 
+Quote Post
segment
сообщение Oct 1 2010, 06:48
Сообщение #18


Местный
***

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



Выложи, пожалуйста.
Go to the top of the page
 
+Quote Post
Punk
сообщение Oct 1 2010, 08:46
Сообщение #19


Местный
***

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



Цитата(Сега @ Oct 1 2010, 10:48) *
Выложи, пожалуйста.

пожалуйста. Комментов в коде толком нет, там понятно все боле мене. Можно сказать что посты в этом топике это и есть комменты=)
Прикрепленные файлы
Прикрепленный файл  firmware.rar ( 119.99 килобайт ) Кол-во скачиваний: 48
 
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 00:46
Рейтинг@Mail.ru


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