|
Загрузка функций в RAM по заданному адресу |
|
|
|
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 убрал все вектора., ничего не изменилось. Что не так делаю?
|
|
|
|
|
Sep 30 2010, 12:20
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760

|
Цитата(Punk @ Sep 30 2010, 14:53)  после того как я из основного кода прыгаю в RAM проц сбрасывается... Как делаете переход? Про ремап не забыли?  Цитата(Punk @ Sep 30 2010, 14:53)  Из стартапа бинарника копируемого в RAM убрал все вектора., ничего не изменилось. ??? А как же тогда прога, копируемая в RAM, будет переходит на свои обработчики исключений (прерываний)? Скаттер для RAM-проги покажите заодно... И стартап до кучи.
|
|
|
|
|
Oct 1 2010, 05:00
|

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

|
Цитата(Student Pupkin @ Sep 30 2010, 16:20)  Как делаете переход? Про ремап не забыли?  Перечитал еще раз ответы общественности, и нашел ошибки в своем коде, а именно: 1. IROM для загружаемой в RAM программы начинался с 0x0 адреса, сделал с 0x40000000 2. Пересекались RW регионы основного кода и загружаемого. После исправлений все заработало, не тестил только работу прерываний, во время работы RAM кода. Спасибо за всем за ответы, если кому интересно могу код выложить
|
|
|
|
|
Oct 1 2010, 08:46
|

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

|
Цитата(Сега @ Oct 1 2010, 10:48)  Выложи, пожалуйста. пожалуйста. Комментов в коде толком нет, там понятно все боле мене. Можно сказать что посты в этом топике это и есть комменты=)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|