Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil+LPC1768+64KB SRAM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
PoReX
Доброго времени суток!
Пишу под LPC1768 в Keil'e и понадобились мне все 64KB оперативки, только как правильно ее включить не пойму. В опциях на вкладке Target включаю IRAM2 с адресом 0x2007C000 и длиной 0x8000 (32KB), HeapSize 0x7D00 и все компилится. Правда динамический массив длиной больше ~30KB не создается. Если увеличить кучу до 0xFD00(любой размер больше 32КВ), то компилятор выдает:
Цитата
LPC1768_MD_CPLD.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_lpc17xx.o(HEAP).
LPC1768_MD_CPLD.axf: Error: L6407E: Sections of aggregate size 0xfd00 bytes could not fit into .ANY selector(s).

Так как же работать с этими отдельными 32KB памяти?
DpInRock
Так и работать. Указатель и вперед. А динамическое выделение - это не просто вредный отстой, это происки сатаны.
--
Чисто так. Ни в одной программе у меня heap не бывает больше нуля.
PoReX
Цитата(DpInRock @ May 18 2011, 11:47) *
Так и работать. Указатель и вперед.

А компилятор в эту область никого не поселит?

Цитата(DpInRock @ May 18 2011, 11:47) *
А динамическое выделение - это не просто вредный отстой, это происки сатаны.

Разъясните пожалуйста, почему так?
SmileGobo
Цитата
Разъясните пожалуйста, почему так?


Потому что, когда юзаешь динамическую память надо думать - люди не любят думать и все что связанно с этим процессом называют бякой
PoReX
Цитата(SmileGobo @ May 18 2011, 12:10) *
Потому что, когда юзаешь динамическую память надо думать - люди не любят думать и все что связанно с этим процессом называют бякой

А чего тут думать поставил malloc и смотришь выделилась память или нет.
mdmitry
Цитата(PoReX @ May 18 2011, 12:16) *
А чего тут думать поставил malloc и смотришь выделилась память или нет.

Ага. Выделите несколько раз подряд, потом первый блок удалите, снова выделите и посмотрите, что будет. У Вас есть сборщик мусора и дефрагментатор? На форуме уже были обсуждения про динамическое использование памяти в контроллерах.
gladov
Цитата(PoReX @ May 18 2011, 11:05) *
Доброго времени суток!
Пишу под LPC1768 в Keil'e и понадобились мне все 64KB оперативки, только как правильно ее включить не пойму. В опциях на вкладке Target включаю IRAM2 с адресом 0x2007C000 и длиной 0x8000 (32KB), HeapSize 0x7D00 и все компилится. Правда динамический массив длиной больше ~30KB не создается. Если увеличить кучу до 0xFD00(любой размер больше 32КВ), то компилятор выдает:

Так как же работать с этими отдельными 32KB памяти?


Работать как всегда. Дело в том, что память "порвана" на несколько банков, посмотрите memory map. Там не 64Кб одним куском. По моему 32+32 (не помню сейчас). А куча это сегмент памяти. Компилятор не может "растянуть" один сегмент на разные области памяти. Поэтому куча не может быть более 32кб в данном контроллере. А что касается использования динамической памяти - "если очень хочется, то можно". Надо лишь осознавать последствия и быть к ним готовым.
oman
Цитата(gladov @ May 18 2011, 13:27) *
А куча это сегмент памяти. Компилятор не может "растянуть" один сегмент на разные области памяти. Поэтому куча не может быть более 32кб в данном контроллере.

Ну почему же, как вариант использовать сторонний аллокатор и при запросах блоков памяти выдавать их из разных кусков памяти.
PoReX
Цитата(gladov @ May 18 2011, 14:27) *
Работать как всегда. Дело в том, что память "порвана" на несколько банков, посмотрите memory map. Там не 64Кб одним куском. По моему 32+32 (не помню сейчас).

Это я знаю, там 32 +32(16+16). Просто думал куча может занять сразу все 64, а оказывается нет.
Сейчас сделал кучу нулевой и если инициализирую массив 20KB в main'e вылетает HardFault, а если глобально, то все отлично+компилятор пишет, что занято столько оперативы. Так и должно быть?
Dron_Gus
Да. Ибо стэк у Вас не резиновый и явно меньше 20 К.
PoReX
Получается со вторыми 32KB памяти работать только по указателям? Так как делаю 2 массива размером 32KB и компилятор не хочет размещать второй в дополнительной области.
PoReX
Странно как-то получается. Вот пример объявления глобальных объектов и переменных с адресами назначенными компилятором:
Код
#define masssize 32350                                        
volatile uint8_t mass[masssize];                  0х10000000
volatile uint32_t *mass2;                            0х2007С004
uCAN CAN1(1,800);                                   0х10007Е60
uGPIO GPIO;                                             0х2007С008

Видно, что компилятор все-таки сует переменные и объекты в дополнительные 32КВ памяти, но если добавляю еще массив:
Код
volatile uint8_t mass3[100];

то он пытается его запихать в основные 32КВ, которые и так забиты. Почему так? Как запихнуть массив в дополнительную память?
Аматер
Цитата(PoReX @ May 19 2011, 07:50) *
Получается со вторыми 32KB памяти работать только по указателям? Так как делаю 2 массива размером 32KB и компилятор не хочет размещать второй в дополнительной области.

Так в свойствах проекта галочка есть. Ставишь ее и компилятор использует 32+32к без всякой возни с указателями.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.