Перейти к содержанию
    

Keil+LPC1768+64KB SRAM

Доброго времени суток!

Пишу под 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 памяти?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так и работать. Указатель и вперед. А динамическое выделение - это не просто вредный отстой, это происки сатаны.

--

Чисто так. Ни в одной программе у меня heap не бывает больше нуля.

Изменено пользователем DpInRock

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так и работать. Указатель и вперед.

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

 

А динамическое выделение - это не просто вредный отстой, это происки сатаны.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Потому что, когда юзаешь динамическую память надо думать - люди не любят думать и все что связанно с этим процессом называют бякой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что, когда юзаешь динамическую память надо думать - люди не любят думать и все что связанно с этим процессом называют бякой

А чего тут думать поставил malloc и смотришь выделилась память или нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А чего тут думать поставил malloc и смотришь выделилась память или нет.

Ага. Выделите несколько раз подряд, потом первый блок удалите, снова выделите и посмотрите, что будет. У Вас есть сборщик мусора и дефрагментатор? На форуме уже были обсуждения про динамическое использование памяти в контроллерах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток!

Пишу под LPC1768 в Keil'e и понадобились мне все 64KB оперативки, только как правильно ее включить не пойму. В опциях на вкладке Target включаю IRAM2 с адресом 0x2007C000 и длиной 0x8000 (32KB), HeapSize 0x7D00 и все компилится. Правда динамический массив длиной больше ~30KB не создается. Если увеличить кучу до 0xFD00(любой размер больше 32КВ), то компилятор выдает:

 

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А куча это сегмент памяти. Компилятор не может "растянуть" один сегмент на разные области памяти. Поэтому куча не может быть более 32кб в данном контроллере.

Ну почему же, как вариант использовать сторонний аллокатор и при запросах блоков памяти выдавать их из разных кусков памяти.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Работать как всегда. Дело в том, что память "порвана" на несколько банков, посмотрите memory map. Там не 64Кб одним куском. По моему 32+32 (не помню сейчас).

Это я знаю, там 32 +32(16+16). Просто думал куча может занять сразу все 64, а оказывается нет.

Сейчас сделал кучу нулевой и если инициализирую массив 20KB в main'e вылетает HardFault, а если глобально, то все отлично+компилятор пишет, что занято столько оперативы. Так и должно быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получается со вторыми 32KB памяти работать только по указателям? Так как делаю 2 массива размером 32KB и компилятор не хочет размещать второй в дополнительной области.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно как-то получается. Вот пример объявления глобальных объектов и переменных с адресами назначенными компилятором:

#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КВ, которые и так забиты. Почему так? Как запихнуть массив в дополнительную память?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получается со вторыми 32KB памяти работать только по указателям? Так как делаю 2 массива размером 32KB и компилятор не хочет размещать второй в дополнительной области.

Так в свойствах проекта галочка есть. Ставишь ее и компилятор использует 32+32к без всякой возни с указателями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...