реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Keil+LPC1768+64KB SRAM
PoReX
сообщение May 18 2011, 07:05
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
DpInRock
сообщение May 18 2011, 07:47
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Так и работать. Указатель и вперед. А динамическое выделение - это не просто вредный отстой, это происки сатаны.
--
Чисто так. Ни в одной программе у меня heap не бывает больше нуля.

Сообщение отредактировал DpInRock - May 18 2011, 07:48


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
PoReX
сообщение May 18 2011, 07:53
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518



Цитата(DpInRock @ May 18 2011, 11:47) *
Так и работать. Указатель и вперед.

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

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

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


--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
SmileGobo
сообщение May 18 2011, 08:10
Сообщение #4


Участник
*

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



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


Потому что, когда юзаешь динамическую память надо думать - люди не любят думать и все что связанно с этим процессом называют бякой
Go to the top of the page
 
+Quote Post
PoReX
сообщение May 18 2011, 08:16
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518



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

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


--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
mdmitry
сообщение May 18 2011, 09:32
Сообщение #6


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



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

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


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
gladov
сообщение May 18 2011, 10:27
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 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кб в данном контроллере. А что касается использования динамической памяти - "если очень хочется, то можно". Надо лишь осознавать последствия и быть к ним готовым.
Go to the top of the page
 
+Quote Post
oman
сообщение May 18 2011, 10:39
Сообщение #8





Группа: Участник
Сообщений: 11
Регистрация: 27-02-07
Пользователь №: 25 714



Цитата(gladov @ May 18 2011, 13:27) *
А куча это сегмент памяти. Компилятор не может "растянуть" один сегмент на разные области памяти. Поэтому куча не может быть более 32кб в данном контроллере.

Ну почему же, как вариант использовать сторонний аллокатор и при запросах блоков памяти выдавать их из разных кусков памяти.
Go to the top of the page
 
+Quote Post
PoReX
сообщение May 18 2011, 11:37
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 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-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение May 18 2011, 11:40
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Да. Ибо стэк у Вас не резиновый и явно меньше 20 К.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
PoReX
сообщение May 19 2011, 04:50
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518



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


--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
PoReX
сообщение May 19 2011, 05:58
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 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-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
Аматер
сообщение Jun 14 2011, 08:09
Сообщение #13


Частый гость
**

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



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

Так в свойствах проекта галочка есть. Ставишь ее и компилятор использует 32+32к без всякой возни с указателями.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01472 секунд с 7
ELECTRONIX ©2004-2016