|
Загрузка функций в RAM по заданному адресу |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Sep 16 2010, 18:55
|

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

|
Цитата(kovigor @ Sep 16 2010, 22:08)  На PC это реализуется средставми ОС, а никак не компилятора. Может, и здесь какой-то Linux использовать ? Да, была идея Линукс прикрутить, но хочется все же разобраться с возможностью своими средствами загружать код с внешнего носителя в RAM и исполнять его там. Сейчас думаю сделать так: Написать программу которая будет локализована во внутреннем флеше контроллера и будет грузить скомпилированный в hex файл проект в RAM и передавать ему управление. Получится что-то вроде альтернативного загрузчика., если получится гг=) , главное после выполнения загруженного кода вновь возвращаться в загрузчик.
Сообщение отредактировал Punk - Sep 16 2010, 18:58
|
|
|
|
|
Sep 16 2010, 19:37
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531

|
Цитата(Punk @ Sep 16 2010, 22:55)  Сейчас думаю сделать так: Написать программу которая будет локализована во внутреннем флеше контроллера и будет грузить скомпилированный в hex файл проект в RAM и передавать ему управление. Получится что-то вроде альтернативного загрузчика., если получится гг=) , главное после выполнения загруженного кода вновь возвращаться в загрузчик. В этом процессоре программы неперемещаемые. Придется каждой выбирать свое место. А в чем основная необходимость? Уже весь флеш кончился или хотите одну программу на все случаи? Вроде записывать на флешку и запускать из процессора это чистая мутотень при отладке. Я написал такую программу, а применять не хочется.
--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
|
|
|
|
|
Sep 16 2010, 20:45
|
Местный
  
Группа: Свой
Сообщений: 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 повыкидывать все лишнее
|
|
|
|
|
Sep 17 2010, 03:36
|

Местный
  
Группа: Участник
Сообщений: 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? управление же полностью ей передается, пусть и пашет со своими установками.
|
|
|
|
|
Sep 17 2010, 08:25
|
Местный
  
Группа: Свой
Сообщений: 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" вектора там будут
|
|
|
|
|
Sep 29 2010, 11:31
|

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

|
Цитата(Сергей Борщ @ Sep 29 2010, 15:17)  А вызвать функцию по (константному) указателю? Да,спасибо, так и сделаю. торможу что-то. А все-таки посредством ассемблера это как-то можно реализовать? (спортивный интерес)
|
|
|
|
|
Sep 29 2010, 11:44
|
Местный
  
Группа: Свой
Сообщений: 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();
|
|
|
|
|
Sep 30 2010, 10:53
|

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

|
Вобчем дошло дело до испытаний кода, все немного упростилось, а именно:
Железо: платка от OLIMEX, с LPC2129 на борту, COMпортовый шнурок, PC Софт: В LPC2129 небольшой код который грузит данные принимаемые через RS232 в RAM, начиная с адреса 0x40000000. На PC программа, которая передает в LPC2129, скомпилированный кейлом бинарник, размер которого 1килобайт
Код грузится в RAM без проблем, проверял вычитывая RAM. Но после того как я из основного кода прыгаю в RAM проц сбрасывается...
Из стартапа бинарника копируемого в RAM убрал все вектора., ничего не изменилось. Что не так делаю?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|