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

 
 
 
Reply to this topicStart new topic
> IAR оператор new - как задать область памяти?
AlphaLaiman
сообщение Apr 17 2018, 15:58
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 1-11-15
Пользователь №: 89 126



Пишу на C++ под STM32. Проблема в следующем - пытаюсь задействовать в проекте одновременно CCMRAM и DMA. Соответствующим образом скорректировал .icf файл, без DMA все работает, все объекты создаются в памяти CCMRAM.
Но, как известно, DMA-контроллер не работает с памятью, размещенной в области CCMRAM. Как мне сделать так, чтобы нужные мне объекты классов, которые я собираюсь использовать с DMA, создавались оператором new не в CCMRAM, а в обычной RAM?
Всякие #pragma location не помогают
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Apr 17 2018, 16:08
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Это же C++, в нём можно перегрузить что угодно, в том числе new и delete. Но я бы не пошёл по этому скользкому пути, а создал объекты статически там где надо.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 17 2018, 16:33
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlphaLaiman @ Apr 17 2018, 18:58) *
Как мне сделать так, чтобы нужные мне объекты классов, которые я собираюсь использовать с DMA, создавались оператором new не в CCMRAM, а в обычной RAM?

Так уберите из new функцию выделения памяти, оставьте только вызов конструктора. Читайте что такое placement new. А потом выделяйте память где душе угодно.

PS: А вообще - для embedded-применений лучше не использовать без динамическую память. Без лишней необходимости.
Go to the top of the page
 
+Quote Post
AlphaLaiman
сообщение Apr 17 2018, 17:05
Сообщение #4





Группа: Участник
Сообщений: 11
Регистрация: 1-11-15
Пользователь №: 89 126



Цитата(jcxz @ Apr 17 2018, 16:33) *
Так уберите из new функцию выделения памяти, оставьте только вызов конструктора. Читайте что такое placement new. А потом выделяйте память где душе угодно.

PS: А вообще - для embedded-применений лучше не использовать без динамическую память. Без лишней необходимости.

Спасибо, placement new помогло. А почему динамическую лучше не использовать?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 17 2018, 17:21
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlphaLaiman @ Apr 17 2018, 20:05) *
Спасибо, placement new помогло. А почему динамическую лучше не использовать?

Потому что когда будет утечка памяти на компе - винда выделит ещё и ещё. А на устройстве - что будете делать?
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Apr 17 2018, 18:01
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(AlphaLaiman @ Apr 17 2018, 20:05) *
Спасибо, placement new помогло.

Курок вы ещё не спустили, но карабин в сторону голеностопа уже направили. Линкер справился бы с этим не хуже, размещая статические объекты.

Цитата(AlphaLaiman @ Apr 17 2018, 20:05) *
А почему динамическую лучше не использовать?

Полноценная поддержка кучи достаточно дорогое удовольствие, а упрощённые её реализации дают неэффективное использование памяти.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 17 2018, 19:09
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(VladislavS @ Apr 17 2018, 21:01) *
Курок вы ещё не спустили, но карабин в сторону голеностопа уже направили. Линкер справился бы с этим не хуже, размещая статические объекты.

placement new - возможность запускать конструктор класса без вызова malloc() (без кучи). Т.е. - к выделению памяти отношения не имеет.
И это полезная вещь как раз в случае использования и многократного использования области памяти, распределённой статически (линкёром).
Код
class TObject1 {
...
};
class TObject2 {
...
};
union {
  char m1[sizeof(TObject1)];
  char m2[sizeof(TObject2)];
} static;
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Apr 18 2018, 07:06
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Да я же не против, просто констатирую, что ствол вниз уже направлен excl.gif
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Apr 18 2018, 08:10
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



А можно было бы выделить классы которые требуют специфического аллокатора и переопределить классовый new|delete.
Go to the top of the page
 
+Quote Post
AlphaLaiman
сообщение Apr 18 2018, 12:49
Сообщение #10





Группа: Участник
Сообщений: 11
Регистрация: 1-11-15
Пользователь №: 89 126



Цитата(VladislavS @ Apr 17 2018, 19:01) *
Курок вы ещё не спустили, но карабин в сторону голеностопа уже направили. Линкер справился бы с этим не хуже, размещая статические объекты.


Полноценная поддержка кучи достаточно дорогое удовольствие, а упрощённые её реализации дают неэффективное использование памяти.


Всем спасибо за помощь, буду использовать статические
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th April 2024 - 01:44
Рейтинг@Mail.ru


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