|
Размещение функции в RAM, LPC2000, Keil |
|
|
|
Jun 9 2010, 19:23
|

Гуру
     
Группа: Свой
Сообщений: 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 пользуется больше?
|
|
|
|
|
Jun 9 2010, 19:30
|
Гуру
     
Группа: Свой
Сообщений: 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) для конкретной функции, или вынесением ее в отдельный модуль.
|
|
|
|
|
Jun 9 2010, 20:34
|

Гуру
     
Группа: Свой
Сообщений: 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?
|
|
|
|
|
Jun 9 2010, 20:42
|
Гуру
     
Группа: Свой
Сообщений: 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()" стоит.
|
|
|
|
|
Jun 9 2010, 21:03
|

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

|
Цитата __main != main. знаю.. теперь  Цитата И кто же тогда ранее инициализировал переменные, __user_initial_stackheap вызывал? копаюсь... Цитата Стартует оно потому что галочка "Run to main()" стоит. навсегда off... Цитата( @ Jun 10 2010, 00:42)  __user_initial_stackheap вызывал? нет там начался _scatterload_* разбираюсь опять... но, похоже, должно быть оно... по крайней мере, по названию
|
|
|
|
|
Jun 9 2010, 21:15
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(toweroff @ Jun 10 2010, 01:03)  копаюсь... Про вызов __user_initial_stackheap и инициализацию переменных - это был не вопрос. Все эти действия, как и вызов __scatter*, выполняет библиотечный __main. Цитата(sonycman @ Jun 10 2010, 01:08)  А это зря, делать Вам нечего в дебрях стандартного сишного стартапа. Он всё разложит в соответствии с "галочками", ну или с "ручками", если они достаточно прямые  В дебрях библиотек - действительно практически нечего, разве что полюбопытствовать или посмотреть вызов вышеупомянутого stackheap. А вот в собственном стартапе бывает что и нужно.
|
|
|
|
|
Jun 9 2010, 21:28
|

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

|
Цитата(sonycman @ Jun 10 2010, 01:08)  А это зря, делать Вам нечего в дебрях стандартного сишного стартапа. Он всё разложит в соответствии с "галочками", ну или с "ручками", если они достаточно прямые  не сомневаюсь, но хотя бы один раз посмотреть необходимо. Успокоения и осознания для  Цитата(sonycman @ Jun 10 2010, 01:08)  А это зря, делать Вам нечего в дебрях стандартного сишного стартапа. Он всё разложит в соответствии с "галочками", ну или с "ручками", если они достаточно прямые  я просто точки останова ставил там, где необходимо  кстати, всякие __rt_lib_* откуда? я не пользую RL-ARM, и листбокс в Operation System стоит как None......
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|