Версия для печати темы
Форум разработчиков электроники ELECTRONIX.ru _ IAR _ IAR оператор new - как задать область памяти?
Автор: AlphaLaiman Apr 17 2018, 15:58
Пишу на C++ под STM32. Проблема в следующем - пытаюсь задействовать в проекте одновременно CCMRAM и DMA. Соответствующим образом скорректировал .icf файл, без DMA все работает, все объекты создаются в памяти CCMRAM.
Но, как известно, DMA-контроллер не работает с памятью, размещенной в области CCMRAM. Как мне сделать так, чтобы нужные мне объекты классов, которые я собираюсь использовать с DMA, создавались оператором new не в CCMRAM, а в обычной RAM?
Всякие #pragma location не помогают
Автор: VladislavS Apr 17 2018, 16:08
Это же C++, в нём можно перегрузить что угодно, в том числе new и delete. Но я бы не пошёл по этому скользкому пути, а создал объекты статически там где надо.
Автор: jcxz Apr 17 2018, 16:33
Цитата(AlphaLaiman @ Apr 17 2018, 18:58)
Как мне сделать так, чтобы нужные мне объекты классов, которые я собираюсь использовать с DMA, создавались оператором new не в CCMRAM, а в обычной RAM?
Так уберите из
new функцию выделения памяти, оставьте только вызов конструктора. Читайте что такое
placement new. А потом выделяйте память где душе угодно.
PS: А вообще - для embedded-применений лучше не использовать без динамическую память. Без лишней необходимости.
Автор: AlphaLaiman Apr 17 2018, 17:05
Цитата(jcxz @ Apr 17 2018, 16:33)
Так уберите из new функцию выделения памяти, оставьте только вызов конструктора. Читайте что такое placement new. А потом выделяйте память где душе угодно.
PS: А вообще - для embedded-применений лучше не использовать без динамическую память. Без лишней необходимости.
Спасибо, placement new помогло. А почему динамическую лучше не использовать?
Автор: jcxz Apr 17 2018, 17:21
Цитата(AlphaLaiman @ Apr 17 2018, 20:05)
Спасибо, placement new помогло. А почему динамическую лучше не использовать?
Потому что когда будет утечка памяти на компе - винда выделит ещё и ещё. А на устройстве - что будете делать?
Автор: VladislavS Apr 17 2018, 18:01
Цитата(AlphaLaiman @ Apr 17 2018, 20:05)
Спасибо, placement new помогло.
Курок вы ещё не спустили, но карабин в сторону голеностопа уже направили. Линкер справился бы с этим не хуже, размещая статические объекты.
Цитата(AlphaLaiman @ Apr 17 2018, 20:05)
А почему динамическую лучше не использовать?
Полноценная поддержка кучи достаточно дорогое удовольствие, а упрощённые её реализации дают неэффективное использование памяти.
Автор: jcxz Apr 17 2018, 19:09
Цитата(VladislavS @ Apr 17 2018, 21:01)
Курок вы ещё не спустили, но карабин в сторону голеностопа уже направили. Линкер справился бы с этим не хуже, размещая статические объекты.
placement new - возможность запускать конструктор класса
без вызова malloc() (без кучи). Т.е. - к выделению памяти отношения не имеет.
И это полезная вещь как раз в случае использования и многократного использования области памяти, распределённой статически (линкёром).
Код
class TObject1 {
...
};
class TObject2 {
...
};
union {
char m1[sizeof(TObject1)];
char m2[sizeof(TObject2)];
} static;
Автор: VladislavS Apr 18 2018, 07:06
Да я же не против, просто констатирую, что ствол вниз уже направлен
Автор: Kabdim Apr 18 2018, 08:10
А можно было бы выделить классы которые требуют специфического аллокатора и переопределить классовый new|delete.
Автор: AlphaLaiman Apr 18 2018, 12:49
Цитата(VladislavS @ Apr 17 2018, 19:01)
Курок вы ещё не спустили, но карабин в сторону голеностопа уже направили. Линкер справился бы с этим не хуже, размещая статические объекты.
Полноценная поддержка кучи достаточно дорогое удовольствие, а упрощённые её реализации дают неэффективное использование памяти.
Всем спасибо за помощь, буду использовать статические
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)