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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Размещение функции в RAM, LPC2000, Keil
toweroff
сообщение Jun 9 2010, 19:23
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Попробовал разместить критичные, с точки зрения времени выполнения, функции в RAM. До этого не пользовался, но сравнения для )
Keil 4.11, использовал следующие комбинации для кода и скаттера:

1.
Код
Код
#pragma arm section code = "ramfunc"
тело
#pragma arm section code


scatter
Код
LR_IROM1 0x00000000  0x00080000 {  ; load region size_region
  ER_IROM1 0x00000000
  {; load address = execution address
   STARTUP.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
}
  RW_IRAM1 0x40000000 0x00010000  {; RW data
   *(ramfunc)
   .ANY (+RW +ZI)
  }
}


2.
По совету, найденному в примерах Keil, добавил для всего С-файла в свойствах "Memory Assignment->Code/Const->IRAM1(0x40000000-0x4000FFFF)" и собрал все со сгенеренным scatter'ом

Код - убрал прагмы

scatter
Код
LR_IROM1 0x00000000 0x00080000  {   ; load region size_region
  ER_IROM1 0x00000000 0x00080000  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x40000000 0x00010000  { ; RW data
    mscuser.o (+RO)
   .ANY (+RW +ZI)
  }
}


Итого

Размер используемой RAM при компиляции не изменяется никак.
Так должно быть (с объемом), или я что-то сделал не так и компилятор с линкером мне должны сказать (хотя бы по количеству), что RAM пользуется больше?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2010, 19:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(toweroff @ Jun 9 2010, 23:23) *
использовал следующие комбинации для кода и скаттера

Все правильно сделали.

Цитата(toweroff @ Jun 9 2010, 23:23) *
По совету, найденному в примерах Keil, добавил для всего С-файла в свойствах "Memory Assignment->Code/Const->IRAM1(0x40000000-0x4000FFFF)"

А это плохой совет.

Цитата(toweroff @ Jun 9 2010, 23:23) *
Размер используемой RAM при компиляции не изменяется никак.
Так должно быть (с объемом), или я что-то сделал не так и компилятор с линкером мне должны сказать (хотя бы по количеству), что RAM пользуется больше?

Смотреть нужно не размер использованной памяти, а map файл.

Не знаю как с Keil'ом, а на RVDS 2.2 есть баг: компилятор может заинлайнить функцию, проигнорировав #pragma arm section. Баг можно обойти установкой более низкого уровня оптимизации (#pragma o1) для конкретной функции, или вынесением ее в отдельный модуль.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 9 2010, 19:35
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(aaarrr @ Jun 9 2010, 23:30) *
А это плохой совет.

Но почему?
Зачем лазить в каракули скаттера, когда можно вынести необходимые функции в один файл и в его свойствах указать расположение кода в ОЗУ?
Что в этом плохого?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2010, 19:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sonycman @ Jun 9 2010, 23:35) *
Что в этом плохого?

Плохо подстраивать (уродовать, точнее) структуру проекта в угоду "галочке" в среде.
Плохо лениться разобраться с нехитрым скриптом скаттера.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jun 9 2010, 19:47
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(aaarrr @ Jun 9 2010, 23:30) *
Баг можно обойти установкой более низкого уровня оптимизации (#pragma o1) для конкретной функции, или вынесением ее в отдельный модуль.

в отдельном модуле, оптимизация _всего_ кода с установленной для данного модуля O1 дало уменьшение используемой RAM -4 байта

Цитата(sonycman @ Jun 9 2010, 23:35) *
Но почему?
Зачем лазить в каракули скаттера, когда можно вынести необходимые функции в один файл и в его свойствах указать расположение кода в ОЗУ?
Что в этом плохого?

как сказал ув.zltigo, лучше руками, чем галочками smile.gif за цитату не ручаюсь, но суть верна smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2010, 19:50
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(toweroff @ Jun 9 2010, 23:47) *
в отдельном модуле, оптимизация _всего_ кода с установленной для данного модуля O1 дало уменьшение используемой RAM -4 байта

Да при чем тут размер, в map-файле что написано?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jun 9 2010, 19:53
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Посмотрел *.map
модуль расположился в адресах IRAM, вроде ок
отложим до завтра линковку, проверю работоспособность и скорость

пока по коду - собственно, кто конкретно расположит мой модуль в RAM? механизьмаф не знаю, потому спрашиваю smile.gif просто надобности не было
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2010, 20:01
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(toweroff @ Jun 9 2010, 23:53) *
пока по коду - собственно, кто конкретно расположит мой модуль в RAM? механизьмаф не знаю, потому спрашиваю smile.gif просто надобности не было

__main разложит после startup'а.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jun 9 2010, 20:34
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(aaarrr @ Jun 10 2010, 00:01) *
__main разложит после startup'а.

спасибо, завтра протестирую

Цитата(aaarrr @ Jun 10 2010, 00:01) *
__main разложит после startup'а.

и, все-таки, пока не завтра...
в стартапе

Код
                IMPORT  __main
                LDR     R0, =__main
                BX      R0


далее все стартует на мой код в main() бред

В стартапе:
до того - настройка слоков и EMC, все лишнее отключено/поудалено... да и не было там ранее вроде копирования никакого областей никуда

так кто же копирует код из flash в RAM для выполнения? неверно

как отследить __main?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2010, 20:42
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(toweroff @ Jun 10 2010, 00:34) *
и, все-таки, пока не завтра...
в стартапе

Код
                IMPORT  __main
                LDR     R0, =__main
                BX      R0


далее все стартует на мой код в main()
до того - настройка слоков и EMC, все лишнее отключено/поудалено... да и не было там ранее вроде копирования никакого областей никуда

__main != main. И кто же тогда ранее инициализировал переменные, __user_initial_stackheap вызывал?
Стартует оно потому что галочка "Run to main()" стоит.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jun 9 2010, 21:03
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата
__main != main.

знаю.. теперь smile.gif

Цитата
И кто же тогда ранее инициализировал переменные, __user_initial_stackheap вызывал?

копаюсь...

Цитата
Стартует оно потому что галочка "Run to main()" стоит.

навсегда off...

Цитата( @ Jun 10 2010, 00:42) *
__user_initial_stackheap вызывал?

нет

там начался _scatterload_*
разбираюсь опять... но, похоже, должно быть оно... по крайней мере, по названию
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 9 2010, 21:08
Сообщение #12


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(toweroff @ Jun 10 2010, 01:03) *
навсегда off...

А это зря, делать Вам нечего в дебрях стандартного сишного стартапа.
Он всё разложит в соответствии с "галочками", ну или с "ручками", если они достаточно прямые smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2010, 21:15
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(toweroff @ Jun 10 2010, 01:03) *
копаюсь...

Про вызов __user_initial_stackheap и инициализацию переменных - это был не вопрос. Все эти действия, как и вызов __scatter*, выполняет библиотечный __main.

Цитата(sonycman @ Jun 10 2010, 01:08) *
А это зря, делать Вам нечего в дебрях стандартного сишного стартапа.
Он всё разложит в соответствии с "галочками", ну или с "ручками", если они достаточно прямые smile.gif

В дебрях библиотек - действительно практически нечего, разве что полюбопытствовать или посмотреть вызов вышеупомянутого stackheap. А вот в собственном стартапе бывает что и нужно.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jun 9 2010, 21:28
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(sonycman @ Jun 10 2010, 01:08) *
А это зря, делать Вам нечего в дебрях стандартного сишного стартапа.
Он всё разложит в соответствии с "галочками", ну или с "ручками", если они достаточно прямые smile.gif

не сомневаюсь, но хотя бы один раз посмотреть необходимо. Успокоения и осознания для smile.gif

Цитата(sonycman @ Jun 10 2010, 01:08) *
А это зря, делать Вам нечего в дебрях стандартного сишного стартапа.
Он всё разложит в соответствии с "галочками", ну или с "ручками", если они достаточно прямые smile.gif

я просто точки останова ставил там, где необходимо smile.gif

кстати, всякие __rt_lib_* откуда? я не пользую RL-ARM, и листбокс в Operation System стоит как None......
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2010, 21:31
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



__rt* - компоненты стандартных библиотек, к RL-ARM никакого отношения не имеют.
Go to the top of the page
 
+Quote Post

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

 


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


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