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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как скомпилировать сишный код в RAM?
AndyDev
сообщение Nov 23 2012, 17:28
Сообщение #1


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

Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406



Подскажите плиз, как под Keil'ом скомпилировать сишный код в RAM?
На сколько я понимаю, если такое возможно, то код из ROM должен при старте каким-то загрузчиком быть перенесен в RAM.

Зачем это нужно? Очень просто - из ОЗУ код выполняется гораздо быстрее, чем из медленной Flash. И чем выше тактовая частота, тем эта разность заметнее.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 23 2012, 21:52
Сообщение #2


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(AndyDev @ Nov 23 2012, 19:28) *
Подскажите плиз, как под Keil'ом скомпилировать сишный код в RAM? На сколько я понимаю, если такое возможно, то код из ROM должен при старте каким-то загрузчиком быть перенесен в RAM. Зачем это нужно?


В Кейле - вынести эти функции в отдельный файл, и в опциях для этого файла указать размещение в ОЗУ.
В IAR вроде можно просто перед функцией написать __ramfunction или как-то так.

Цитата
Очень просто - из ОЗУ код выполняется гораздо быстрее, чем из медленной Flash. И чем выше тактовая частота, тем эта разность заметнее.

Не всегда. Например для STM32F407 -"Z", это практически ничего не дает.
Go to the top of the page
 
+Quote Post
Spider
сообщение Nov 24 2012, 06:06
Сообщение #3


В поисках истины
***

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



Раз уж такая тема пошла. подскажите, а возможно загрузить в память самостоятельную прошивку и полностью перейти на нее?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 24 2012, 08:27
Сообщение #4


Гуру
******

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



QUOTE (Alexey Belyaev @ Nov 24 2012, 08:06) *
а возможно загрузить в память самостоятельную прошивку и полностью перейти на нее?
Да, возможно. Как это сделать именно в Кейле - не знаю.


--------------------
На любой вопрос даю любой ответ
"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
haker_fox
сообщение Nov 24 2012, 08:56
Сообщение #5


Познающий...
******

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



QUOTE (AndyDev @ Nov 24 2012, 02:28) *
Подскажите плиз, как под Keil'ом скомпилировать сишный код в RAM?

Да. Настройки линкера - Ваша цель rolleyes.gif

QUOTE (Alexey Belyaev @ Nov 24 2012, 15:06) *
Раз уж такая тема пошла. подскажите, а возможно загрузить в память самостоятельную прошивку и полностью перейти на нее?

Да. У меня так работает мой загрузчик. При старте МК получает ip от DHCP сервера (можно и статический), и представляется FTP сервером. Затем, я "захожу" туда Total Commander'ом и "заливаю" бинарник. Чтобы сообщить загрузчику, что код можно исполнять, нужно "дозалить" файл с именем done. Полуив его, загрузчик проверяет, загружен ли до этого файл *.bin, и если да, то передает ему управление. Если нет - в моем случае ничего не делает. Ждет)


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
AndyDev
сообщение Nov 24 2012, 10:38
Сообщение #6


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

Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406



Подскажите тогда заодно, как в Кейле передаются параметеры в функцию, написанную на асме? Через стек, регистры? Какие регистры можно в этой функции использовать? Где вообще почитать инфу о соглашении на счет регистров в подобном случае?

Цитата(Allregia @ Nov 24 2012, 01:52) *
В Кейле - вынести эти функции в отдельный файл, и в опциях для этого файла указать размещение в ОЗУ.
В IAR вроде можно просто перед функцией написать __ramfunction или как-то так.


Не всегда. Например для STM32F407 -"Z", это практически ничего не дает.


Что-то я не нашел, где устанавливается размещение ОЗУ для файла.

У меня NXP1114, у него флешка слабенькая, на 50Мгц много тормозов дает.
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Nov 24 2012, 11:07
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



Цитата(haker_fox @ Nov 24 2012, 12:56) *
Да. Настройки линкера - Ваша цель rolleyes.gif


Да. У меня так работает мой загрузчик. При старте МК получает ip от DHCP сервера (можно и статический), и представляется FTP сервером. Затем, я "захожу" туда Total Commander'ом и "заливаю" бинарник. Чтобы сообщить загрузчику, что код можно исполнять, нужно "дозалить" файл с именем done. Полуив его, загрузчик проверяет, загружен ли до этого файл *.bin, и если да, то передает ему управление. Если нет - в моем случае ничего не делает. Ждет)

Извините за оффтоп, вы сами ftp сервер писали или взяли где? я тоже хочу запустить FTP но нигде примеров не нашёл хоть с BSD не портируй ((


--------------------
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 24 2012, 11:11
Сообщение #8


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

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Nov 24 2012, 11:12
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



Цитата(AndyDev @ Nov 24 2012, 14:38) *
Подскажите тогда заодно, как в Кейле передаются параметеры в функцию, написанную на асме? Через стек, регистры? Какие регистры можно в этой функции использовать? Где вообще почитать инфу о соглашении на счет регистров в подобном случае?


В кейле как и везде передаюстся согласно стандарту АРМ на вызовы процедур.
AASPC-- так вроде называется. Если коротко, то через регистры с нулевого по третий.



--------------------
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 24 2012, 11:35
Сообщение #10


Познающий...
******

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



QUOTE (SyncLair @ Nov 24 2012, 20:07) *
Извините за оффтоп, вы сами ftp сервер писали или взяли где? я тоже хочу запустить FTP но нигде примеров не нашёл хоть с BSD не портируй ((

Нет, самому мне не под силу такое rolleyes.gif
Я использовал библиотеку RL-ARM. Буквально за вечер смастерил приложение.
А примеры на RL-ARM есть. Более менее позволяют разобраться. Документация у Кейла на мой взгляд - вполне rolleyes.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 24 2012, 11:47
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(AndyDev @ Nov 24 2012, 12:38) *
У меня NXP1114, у него флешка слабенькая, на 50Мгц много тормозов дает.

Какой выигрыш получится от переноса функций в ОЗУ? Есть такие данные?
Go to the top of the page
 
+Quote Post
AndyDev
сообщение Nov 24 2012, 11:52
Сообщение #12


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

Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406



Цитата(_Артём_ @ Nov 24 2012, 15:47) *
Какой выигрыш получится от переноса функций в ОЗУ? Есть такие данные?

Зависит от конкретного микроконтроллера.
Если, допустим, у вас от 20-30Мгц задержка на доступ во флеш 1, от 30 до 40 - 2, 40 до 50 - 3,
то на каждую считанную команду вместо одного такта будет тратиться 2, 3 и 4, соответственно. Сами прикиньте.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 24 2012, 20:15
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
AndyDev
сообщение Nov 25 2012, 11:34
Сообщение #14


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

Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406



Цитата(Сергей Борщ @ Nov 25 2012, 00:15) *
Прикидка показывает, что не все так страшно. Поэтому вас и спрашивали о реальных данных.

Замеряю - напишу.
Go to the top of the page
 
+Quote Post
AndyDev
сообщение Nov 26 2012, 13:55
Сообщение #15


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

Группа: Участник
Сообщений: 163
Регистрация: 17-11-07
Пользователь №: 32 406



Цитата(AndyDev @ Nov 25 2012, 15:34) *
Замеряю - напишу.

Перенес несколько критичных к скорости функций в ОЗУ, и вся программа стала работать примерно на 50-60% быстрее.
А сами критичные функции, как-то ДПФ и т.д. - ускорились почти в два раза.

Микроконтроллер LPC1114, тактовая частота 48МГц. Делитель тактовой частоты FlashClock = 3 (как и положено для скоростей от 40 до 50МГц).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:18
Рейтинг@Mail.ru


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