Comments 9
IAR позволяет сделать проще — определить регион, состоящий из нескольких диапазонов. То есть можно сделать отдельный регион для объектов, использующих DMA, и отдельный регион для всего остального, частично размещённый в CCM
В FreeRTOS можно даже выделить место под кучу на нескольких участках памяти:
www.freertos.org/a00111.html#heap_5
www.freertos.org/a00111.html#heap_5
Спасибо, не знал.
Хотя, если честно, то я и не разбирался настолько подробно (сам сейчас использую heap_4).
Хотя, если честно, то я и не разбирался настолько подробно (сам сейчас использую heap_4).
heap_4 — классика, когда нужно получать и освобождать память. По сути 5-я — то же самое, но добавляется возможность занять несколько разных адресных пространств.
Собственно, сам использую похожий трюк у себя одном в проекте. Хотя началось всё как эксперимент, но работает. Разве что там не куча, а переменные, к которым не требуется доступ по DMA.
Собственно, сам использую похожий трюк у себя одном в проекте. Хотя началось всё как эксперимент, но работает. Разве что там не куча, а переменные, к которым не требуется доступ по DMA.
Я понял (уже почитал описание). Хотя мне все равно какой вариант кучи использовать, т.к. выделенную память я не освобождаю (только один раз выделил на старте и больше не трогаю).
Просто у меня задача была немного другая. Не увеличить размер кучи, а перенести её в другой раздел с минимальными изменениями в исходном коде.
Ну а Хабр решил использовать как шпаргалку для памяти :-). Может еще кому пригодится.
Просто у меня задача была немного другая. Не увеличить размер кучи, а перенести её в другой раздел с минимальными изменениями в исходном коде.
Ну а Хабр решил использовать как шпаргалку для памяти :-). Может еще кому пригодится.
А как решена заявленная проблема с DMA? Теперь выделенную в RTOS память нельзя передать функциям, которые используют DMA или они должны проверять какую память им передали и перебуферизовывать ее?
у себя делал так (проект под Segger Embedded Studio), когда хотел «выгнать» РТОС в отдельный регион:
непосредственно в файле heap_4.h для контроллера stm32l471.
Там ОЗУ на 2 сегмента поделена по диапазону адресов:
Особых проблем с работой РТОС не заметил
__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>
Особых проблем с работой РТОС не заметил
Sign up to leave a comment.
Размещение кучи FreeRTOS в разделе CCMRAM для STM32