Как стать автором
Обновить

Комментарии 9

IAR позволяет сделать проще — определить регион, состоящий из нескольких диапазонов. То есть можно сделать отдельный регион для объектов, использующих DMA, и отдельный регион для всего остального, частично размещённый в CCM
Безусловно можно. Но все же хотелось сделать все с минимальными переделками, чтобы не словить ошибок из-за неправильного аллоцирования объектов.

Да и использую я gcc под STM32CubeIDE.
Спасибо, не знал.
Хотя, если честно, то я и не разбирался настолько подробно (сам сейчас использую heap_4).
heap_4 — классика, когда нужно получать и освобождать память. По сути 5-я — то же самое, но добавляется возможность занять несколько разных адресных пространств.
Собственно, сам использую похожий трюк у себя одном в проекте. Хотя началось всё как эксперимент, но работает. Разве что там не куча, а переменные, к которым не требуется доступ по DMA.
Я понял (уже почитал описание). Хотя мне все равно какой вариант кучи использовать, т.к. выделенную память я не освобождаю (только один раз выделил на старте и больше не трогаю).

Просто у меня задача была немного другая. Не увеличить размер кучи, а перенести её в другой раздел с минимальными изменениями в исходном коде.

Ну а Хабр решил использовать как шпаргалку для памяти :-). Может еще кому пригодится.

А как решена заявленная проблема с DMA? Теперь выделенную в RTOS память нельзя передать функциям, которые используют DMA или они должны проверять какую память им передали и перебуферизовывать ее?

Изначально буфера для DMA распределялись статически, а не в куче, поэтому проблем не возникло.
у себя делал так (проект под Segger Embedded Studio), когда хотел «выгнать» РТОС в отдельный регион:
__attribute__((section(".bss2"))) static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

непосредственно в файле heap_4.h для контроллера stm32l471.

Там ОЗУ на 2 сегмента поделена по диапазону адресов:
<root name="STM32L471RG">
  <MemorySegment name="FLASH" start="0x08000000" size="0x00100000" access="ReadOnly" />
  <MemorySegment name="RAM" start="0x20000000" size="0x00018000" access="Read/Write" />
  <MemorySegment name="RAM2" start="0x10000000" size="0x00008000" access="Read/Write" />
</root>


Особых проблем с работой РТОС не заметил
Зарегистрируйтесь на Хабре, чтобы оставить комментарий