с использованием Cortex-M MPU

Запускаем новый софт, и думаем об использовании MPU. Наше новое программное обеспечение основано на FreeRTOS (с портом MPU).

Мы правильно понимаем всю сегментацию по поводу межзадачного взаимодействия с MPU. С чем у нас возникают трудности, так это с тем, что делать с защитой динамического размещения. По умолчанию вся оперативная память должна быть защищена в пользовательском режиме. Есть ли какая-либо документация в Интернете, объясняющая, как мы должны обрабатывать динамическое распределение?

Мы хотели бы защитить память так же сильно, так как мы будем разрабатывать большое программное обеспечение> 500 КБ скомпилированного кода.

С Уважением

Джонатан


person Jonathan    schedule 12.11.2013    source источник


Ответы (1)


По сути, FreeRTOS предлагает 4 различных стратегии выделения памяти, реализованных в файлах heap_1.c, heap_2.c... в каталоге portable/MemMang.

heap_1.c предлагает простую реализацию alloc only
heap_2.c предлагает простую реализацию alloc/free

Два других реализуют более продвинутые стратегии alloc/free. FreeRTOS потребуется, чтобы вы хотя бы выбрали один из них, потому что ей нужен этот интерфейс для собственного распределения ресурсов (задач, мьютексов, семафоров и т. д.). Для микроконтроллеров с модулем защиты памяти FreeRTOS также имеет соответствующую поддержку. .

Обратите внимание, что использование MPU заставит вас выделить память с использованием минимального размера блока (например, 1 КБ). Это может быть очень дорого, если вам нужно выделить много маленьких объектов (например, используя std::list<int> или std::map<int,int> со многими элементами). Вы можете рассмотреть возможность предоставления собственных специализированных распределителей для таких случаев.

person πάντα ῥεῖ    schedule 12.11.2013
comment
Как может быть специализированным распределителем для std::xxx ? Вы берете блок памяти, защищаете его, чтобы иметь к нему эксклюзивный доступ и делаете свой собственный распределитель? - person Jonathan; 12.11.2013
comment
@Jonathan Может быть этот ответ полезен в отношении уточнения распределителя (я думаю, вы используете набор инструментов GCC). Другой способ - просто избегать таких конструкций вообще (например, использовать std::vector вместо списка, если это возможно). - person πάντα ῥεῖ; 12.11.2013
comment
std::vector также будет использовать аллокатор no ? - person Jonathan; 13.11.2013
comment
@Jonathan Да, std::vector также использует распределитель, но он выделяет непрерывный фрагмент памяти для хранения содержащихся в нем элементов, тогда как std::list, напротив, выделяет новый фрагмент для каждого хранящегося в нем элемента. Уточнение распределителя может решить эту проблему за счет более эффективного управления ранее выделенной областью памяти, в зависимости от того, какой минимальный фрагмент памяти может быть выделен из низкоуровневого интерфейса управления памятью. - person πάντα ῥεῖ; 13.11.2013