|
Как скомпилировать сишный код в RAM? |
|
|
|
Nov 23 2012, 21:52
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(AndyDev @ Nov 23 2012, 19:28)  Подскажите плиз, как под Keil'ом скомпилировать сишный код в RAM? На сколько я понимаю, если такое возможно, то код из ROM должен при старте каким-то загрузчиком быть перенесен в RAM. Зачем это нужно? В Кейле - вынести эти функции в отдельный файл, и в опциях для этого файла указать размещение в ОЗУ. В IAR вроде можно просто перед функцией написать __ramfunction или как-то так. Цитата Очень просто - из ОЗУ код выполняется гораздо быстрее, чем из медленной Flash. И чем выше тактовая частота, тем эта разность заметнее. Не всегда. Например для STM32F407 -"Z", это практически ничего не дает.
|
|
|
|
|
Nov 24 2012, 08:56
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (AndyDev @ Nov 24 2012, 02:28)  Подскажите плиз, как под Keil'ом скомпилировать сишный код в RAM? Да. Настройки линкера - Ваша цель QUOTE (Alexey Belyaev @ Nov 24 2012, 15:06)  Раз уж такая тема пошла. подскажите, а возможно загрузить в память самостоятельную прошивку и полностью перейти на нее? Да. У меня так работает мой загрузчик. При старте МК получает ip от DHCP сервера (можно и статический), и представляется FTP сервером. Затем, я "захожу" туда Total Commander'ом и "заливаю" бинарник. Чтобы сообщить загрузчику, что код можно исполнять, нужно "дозалить" файл с именем done. Полуив его, загрузчик проверяет, загружен ли до этого файл *.bin, и если да, то передает ему управление. Если нет - в моем случае ничего не делает. Ждет)
--------------------
Выбор.
|
|
|
|
|
Nov 24 2012, 10:38
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406

|
Подскажите тогда заодно, как в Кейле передаются параметеры в функцию, написанную на асме? Через стек, регистры? Какие регистры можно в этой функции использовать? Где вообще почитать инфу о соглашении на счет регистров в подобном случае? Цитата(Allregia @ Nov 24 2012, 01:52)  В Кейле - вынести эти функции в отдельный файл, и в опциях для этого файла указать размещение в ОЗУ. В IAR вроде можно просто перед функцией написать __ramfunction или как-то так.
Не всегда. Например для STM32F407 -"Z", это практически ничего не дает. Что-то я не нашел, где устанавливается размещение ОЗУ для файла. У меня NXP1114, у него флешка слабенькая, на 50Мгц много тормозов дает.
|
|
|
|
|
Nov 24 2012, 11:07
|
Местный
  
Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197

|
Цитата(haker_fox @ Nov 24 2012, 12:56)  Да. Настройки линкера - Ваша цель Да. У меня так работает мой загрузчик. При старте МК получает ip от DHCP сервера (можно и статический), и представляется FTP сервером. Затем, я "захожу" туда Total Commander'ом и "заливаю" бинарник. Чтобы сообщить загрузчику, что код можно исполнять, нужно "дозалить" файл с именем done. Полуив его, загрузчик проверяет, загружен ли до этого файл *.bin, и если да, то передает ему управление. Если нет - в моем случае ничего не делает. Ждет) Извините за оффтоп, вы сами ftp сервер писали или взяли где? я тоже хочу запустить FTP но нигде примеров не нашёл хоть с BSD не портируй ((
--------------------
|
|
|
|
|
Nov 24 2012, 11:11
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(AndyDev @ Nov 24 2012, 12:38)  Что-то я не нашел, где устанавливается размещение ОЗУ для файла. Alt-F7 на файле в Project, или правую кнопку и там верхняя стройка меню - Options for file.... Далее на вкладке Properties, внизу есть Memory Assignment, и там можно отдельно для Code/Const, ZI Data, Other Data указать где им быть - в ROMx, RAMx, IRAMx.
|
|
|
|
|
Nov 24 2012, 11:12
|
Местный
  
Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197

|
Цитата(AndyDev @ Nov 24 2012, 14:38)  Подскажите тогда заодно, как в Кейле передаются параметеры в функцию, написанную на асме? Через стек, регистры? Какие регистры можно в этой функции использовать? Где вообще почитать инфу о соглашении на счет регистров в подобном случае? В кейле как и везде передаюстся согласно стандарту АРМ на вызовы процедур. AASPC-- так вроде называется. Если коротко, то через регистры с нулевого по третий.
--------------------
|
|
|
|
|
Nov 24 2012, 11:52
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406

|
Цитата(_Артём_ @ Nov 24 2012, 15:47)  Какой выигрыш получится от переноса функций в ОЗУ? Есть такие данные? Зависит от конкретного микроконтроллера. Если, допустим, у вас от 20-30Мгц задержка на доступ во флеш 1, от 30 до 40 - 2, 40 до 50 - 3, то на каждую считанную команду вместо одного такта будет тратиться 2, 3 и 4, соответственно. Сами прикиньте.
|
|
|
|
|
Nov 24 2012, 20:15
|

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

|
QUOTE (AndyDev @ Nov 24 2012, 13:52)  Сами прикиньте. Шина к флешке у него, насколько помню, 32-битная, команды 16-битные, значит за один цикл чтения вынимаются 2 команды. На переходах это, конечно, не спасает, но код состоит не из одних переходов. Далеко не все команды исполняются за 1 такт, значит во время их исполнения достаточно времени для чтения следующей команды. Прикидка показывает, что не все так страшно. Поэтому вас и спрашивали о реальных данных.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 25 2012, 11:34
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406

|
Цитата(Сергей Борщ @ Nov 25 2012, 00:15)  Прикидка показывает, что не все так страшно. Поэтому вас и спрашивали о реальных данных. Замеряю - напишу.
|
|
|
|
|
Nov 26 2012, 13:55
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406

|
Цитата(AndyDev @ Nov 25 2012, 15:34)  Замеряю - напишу. Перенес несколько критичных к скорости функций в ОЗУ, и вся программа стала работать примерно на 50-60% быстрее. А сами критичные функции, как-то ДПФ и т.д. - ускорились почти в два раза. Микроконтроллер LPC1114, тактовая частота 48МГц. Делитель тактовой частоты FlashClock = 3 (как и положено для скоростей от 40 до 50МГц).
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|