|
|
|
IAR оператор new - как задать область памяти? |
|
|
|
Apr 17 2018, 15:58
|
Группа: Участник
Сообщений: 11
Регистрация: 1-11-15
Пользователь №: 89 126
|
Пишу на C++ под STM32. Проблема в следующем - пытаюсь задействовать в проекте одновременно CCMRAM и DMA. Соответствующим образом скорректировал .icf файл, без DMA все работает, все объекты создаются в памяти CCMRAM. Но, как известно, DMA-контроллер не работает с памятью, размещенной в области CCMRAM. Как мне сделать так, чтобы нужные мне объекты классов, которые я собираюсь использовать с DMA, создавались оператором new не в CCMRAM, а в обычной RAM? Всякие #pragma location не помогают
|
|
|
|
|
Apr 17 2018, 16:33
|
Гуру
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713
|
Цитата(AlphaLaiman @ Apr 17 2018, 18:58) Как мне сделать так, чтобы нужные мне объекты классов, которые я собираюсь использовать с DMA, создавались оператором new не в CCMRAM, а в обычной RAM? Так уберите из new функцию выделения памяти, оставьте только вызов конструктора. Читайте что такое placement new. А потом выделяйте память где душе угодно. PS: А вообще - для embedded-применений лучше не использовать без динамическую память. Без лишней необходимости.
|
|
|
|
|
Apr 17 2018, 17:05
|
Группа: Участник
Сообщений: 11
Регистрация: 1-11-15
Пользователь №: 89 126
|
Цитата(jcxz @ Apr 17 2018, 16:33) Так уберите из new функцию выделения памяти, оставьте только вызов конструктора. Читайте что такое placement new. А потом выделяйте память где душе угодно.
PS: А вообще - для embedded-применений лучше не использовать без динамическую память. Без лишней необходимости. Спасибо, placement new помогло. А почему динамическую лучше не использовать?
|
|
|
|
|
Apr 17 2018, 18:01
|
Местный
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140
|
Цитата(AlphaLaiman @ Apr 17 2018, 20:05) Спасибо, placement new помогло. Курок вы ещё не спустили, но карабин в сторону голеностопа уже направили. Линкер справился бы с этим не хуже, размещая статические объекты. Цитата(AlphaLaiman @ Apr 17 2018, 20:05) А почему динамическую лучше не использовать? Полноценная поддержка кучи достаточно дорогое удовольствие, а упрощённые её реализации дают неэффективное использование памяти.
|
|
|
|
|
Apr 17 2018, 19:09
|
Гуру
Группа: Свой
Сообщений: 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;
|
|
|
|
|
Apr 18 2018, 12:49
|
Группа: Участник
Сообщений: 11
Регистрация: 1-11-15
Пользователь №: 89 126
|
Цитата(VladislavS @ Apr 17 2018, 19:01) Курок вы ещё не спустили, но карабин в сторону голеностопа уже направили. Линкер справился бы с этим не хуже, размещая статические объекты.
Полноценная поддержка кучи достаточно дорогое удовольствие, а упрощённые её реализации дают неэффективное использование памяти. Всем спасибо за помощь, буду использовать статические
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|