Перейти к содержанию
    

IAR оператор new - как задать область памяти?

Пишу на C++ под STM32. Проблема в следующем - пытаюсь задействовать в проекте одновременно CCMRAM и DMA. Соответствующим образом скорректировал .icf файл, без DMA все работает, все объекты создаются в памяти CCMRAM.

Но, как известно, DMA-контроллер не работает с памятью, размещенной в области CCMRAM. Как мне сделать так, чтобы нужные мне объекты классов, которые я собираюсь использовать с DMA, создавались оператором new не в CCMRAM, а в обычной RAM?

Всякие #pragma location не помогают

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это же C++, в нём можно перегрузить что угодно, в том числе new и delete. Но я бы не пошёл по этому скользкому пути, а создал объекты статически там где надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как мне сделать так, чтобы нужные мне объекты классов, которые я собираюсь использовать с DMA, создавались оператором new не в CCMRAM, а в обычной RAM?

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Спасибо, placement new помогло. А почему динамическую лучше не использовать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, placement new помогло. А почему динамическую лучше не использовать?

Потому что когда будет утечка памяти на компе - винда выделит ещё и ещё. А на устройстве - что будете делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, placement new помогло.

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

 

А почему динамическую лучше не использовать?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

placement new - возможность запускать конструктор класса без вызова malloc() (без кучи). Т.е. - к выделению памяти отношения не имеет.

И это полезная вещь как раз в случае использования и многократного использования области памяти, распределённой статически (линкёром).

class TObject1 {
...
};
class TObject2 {
...
};
union {
  char m1[sizeof(TObject1)];
  char m2[sizeof(TObject2)];
} static;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да я же не против, просто констатирую, что ствол вниз уже направлен :excl:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно было бы выделить классы которые требуют специфического аллокатора и переопределить классовый new|delete.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

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

 

Всем спасибо за помощь, буду использовать статические

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...