porex 0 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба Доброго времени суток! Пишу под 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 0 18 мая, 2011 Опубликовано 18 мая, 2011 (изменено) · Жалоба Так и работать. Указатель и вперед. А динамическое выделение - это не просто вредный отстой, это происки сатаны. -- Чисто так. Ни в одной программе у меня heap не бывает больше нуля. Изменено 18 мая, 2011 пользователем DpInRock Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
porex 0 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба Так и работать. Указатель и вперед. А компилятор в эту область никого не поселит? А динамическое выделение - это не просто вредный отстой, это происки сатаны. Разъясните пожалуйста, почему так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SmileGobo 0 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба Разъясните пожалуйста, почему так? Потому что, когда юзаешь динамическую память надо думать - люди не любят думать и все что связанно с этим процессом называют бякой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
porex 0 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба Потому что, когда юзаешь динамическую память надо думать - люди не любят думать и все что связанно с этим процессом называют бякой А чего тут думать поставил malloc и смотришь выделилась память или нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба А чего тут думать поставил malloc и смотришь выделилась память или нет. Ага. Выделите несколько раз подряд, потом первый блок удалите, снова выделите и посмотрите, что будет. У Вас есть сборщик мусора и дефрагментатор? На форуме уже были обсуждения про динамическое использование памяти в контроллерах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gladov 0 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба Доброго времени суток! Пишу под LPC1768 в Keil'e и понадобились мне все 64KB оперативки, только как правильно ее включить не пойму. В опциях на вкладке Target включаю IRAM2 с адресом 0x2007C000 и длиной 0x8000 (32KB), HeapSize 0x7D00 и все компилится. Правда динамический массив длиной больше ~30KB не создается. Если увеличить кучу до 0xFD00(любой размер больше 32КВ), то компилятор выдает: Так как же работать с этими отдельными 32KB памяти? Работать как всегда. Дело в том, что память "порвана" на несколько банков, посмотрите memory map. Там не 64Кб одним куском. По моему 32+32 (не помню сейчас). А куча это сегмент памяти. Компилятор не может "растянуть" один сегмент на разные области памяти. Поэтому куча не может быть более 32кб в данном контроллере. А что касается использования динамической памяти - "если очень хочется, то можно". Надо лишь осознавать последствия и быть к ним готовым. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
oman 0 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба А куча это сегмент памяти. Компилятор не может "растянуть" один сегмент на разные области памяти. Поэтому куча не может быть более 32кб в данном контроллере. Ну почему же, как вариант использовать сторонний аллокатор и при запросах блоков памяти выдавать их из разных кусков памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
porex 0 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба Работать как всегда. Дело в том, что память "порвана" на несколько банков, посмотрите memory map. Там не 64Кб одним куском. По моему 32+32 (не помню сейчас). Это я знаю, там 32 +32(16+16). Просто думал куча может занять сразу все 64, а оказывается нет. Сейчас сделал кучу нулевой и если инициализирую массив 20KB в main'e вылетает HardFault, а если глобально, то все отлично+компилятор пишет, что занято столько оперативы. Так и должно быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба Да. Ибо стэк у Вас не резиновый и явно меньше 20 К. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
porex 0 19 мая, 2011 Опубликовано 19 мая, 2011 · Жалоба Получается со вторыми 32KB памяти работать только по указателям? Так как делаю 2 массива размером 32KB и компилятор не хочет размещать второй в дополнительной области. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
porex 0 19 мая, 2011 Опубликовано 19 мая, 2011 · Жалоба Странно как-то получается. Вот пример объявления глобальных объектов и переменных с адресами назначенными компилятором: #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КВ, которые и так забиты. Почему так? Как запихнуть массив в дополнительную память? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amater 0 14 июня, 2011 Опубликовано 14 июня, 2011 · Жалоба Получается со вторыми 32KB памяти работать только по указателям? Так как делаю 2 массива размером 32KB и компилятор не хочет размещать второй в дополнительной области. Так в свойствах проекта галочка есть. Ставишь ее и компилятор использует 32+32к без всякой возни с указателями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться