|
|
  |
Keil+LPC1768+64KB SRAM |
|
|
|
May 18 2011, 07:05
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Доброго времени суток! Пишу под 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 памяти?
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
May 18 2011, 07:53
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Цитата(DpInRock @ May 18 2011, 11:47)  Так и работать. Указатель и вперед. А компилятор в эту область никого не поселит? Цитата(DpInRock @ May 18 2011, 11:47)  А динамическое выделение - это не просто вредный отстой, это происки сатаны. Разъясните пожалуйста, почему так?
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
May 18 2011, 08:10
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451

|
Цитата Разъясните пожалуйста, почему так? Потому что, когда юзаешь динамическую память надо думать - люди не любят думать и все что связанно с этим процессом называют бякой
|
|
|
|
|
May 18 2011, 08:16
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Цитата(SmileGobo @ May 18 2011, 12:10)  Потому что, когда юзаешь динамическую память надо думать - люди не любят думать и все что связанно с этим процессом называют бякой А чего тут думать поставил malloc и смотришь выделилась память или нет.
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
May 18 2011, 10:27
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(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кб в данном контроллере. А что касается использования динамической памяти - "если очень хочется, то можно". Надо лишь осознавать последствия и быть к ним готовым.
|
|
|
|
|
May 18 2011, 10:39
|
Группа: Участник
Сообщений: 11
Регистрация: 27-02-07
Пользователь №: 25 714

|
Цитата(gladov @ May 18 2011, 13:27)  А куча это сегмент памяти. Компилятор не может "растянуть" один сегмент на разные области памяти. Поэтому куча не может быть более 32кб в данном контроллере. Ну почему же, как вариант использовать сторонний аллокатор и при запросах блоков памяти выдавать их из разных кусков памяти.
|
|
|
|
|
May 18 2011, 11:37
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Цитата(gladov @ May 18 2011, 14:27)  Работать как всегда. Дело в том, что память "порвана" на несколько банков, посмотрите memory map. Там не 64Кб одним куском. По моему 32+32 (не помню сейчас). Это я знаю, там 32 +32(16+16). Просто думал куча может занять сразу все 64, а оказывается нет. Сейчас сделал кучу нулевой и если инициализирую массив 20KB в main'e вылетает HardFault, а если глобально, то все отлично+компилятор пишет, что занято столько оперативы. Так и должно быть?
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
May 19 2011, 04:50
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Получается со вторыми 32KB памяти работать только по указателям? Так как делаю 2 массива размером 32KB и компилятор не хочет размещать второй в дополнительной области.
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
May 19 2011, 05:58
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Странно как-то получается. Вот пример объявления глобальных объектов и переменных с адресами назначенными компилятором: Код #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КВ, которые и так забиты. Почему так? Как запихнуть массив в дополнительную память?
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
Jun 14 2011, 08:09
|

Частый гость
 
Группа: Участник
Сообщений: 95
Регистрация: 3-01-10
Из: Рождественно
Пользователь №: 54 616

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