Пул памяти в FreeRTOS, как в uC/OS II

Недавно я написал C-приложение для Microblaze и использовал uC/OS-II. uC/OS-II предлагает пулы памяти для выделения и освобождения блоков памяти фиксированного размера. Сейчас я пишу C-приложение для STM32, где на этот раз использую FreeRTOS. Кажется, что FreeRTOS не предлагает такой же механизм, или я что-то пропустил? Я думаю, что пять реализаций кучи - это не то, что я ищу.

Если на самом деле нет пулов памяти, есть ли какая-то конкретная причина?


person Semaphor    schedule 31.05.2016    source источник


Ответы (1)


Первоначальная версия FreeRTOS использовала пулы памяти. Однако было обнаружено, что пользователи изо всех сил пытались определить размеры пулов, что привело к постоянному потоку запросов в службу поддержки. Кроме того, поскольку первоначальные версии FreeRTOS предназначались для систем с очень ограниченным объемом оперативной памяти, было обнаружено, что потери оперативной памяти при использовании слишком больших пулов неприемлемы. Поэтому было решено перенести распределение памяти на переносимый уровень, при том понимании, что ни одна схема не подходит больше, чем для подмножества приложений, и позволяя пользователям предоставлять свою собственную схему. Как вы упомянули, есть пять примеров реализации, которые охватывают почти все приложения, но если вы абсолютно должен использовать реализацию пула памяти, тогда вы можете легко добавить это, предоставив свои собственные реализации pvPortMalloc() и vPortFree() (пулы памяти являются одними из самых простых для реализации).

Также обратите внимание, что в FreeRTOS V9 вам не нужно иметь какую-либо схему распределения памяти, так как все может быть статически распределены.

person Richard    schedule 01.06.2016
comment
Один из пяти примеров реализации кучи может подойти для выделения оперативной памяти для ОС (задачи, очереди,...), что также может иметь место для моего приложения. Но если я хочу хранить какие-то сообщения (в основном массив байтов), которые все одного размера? В этом случае я должен реализовать потокобезопасные пулы памяти (что, я думаю, не очень сложно), поскольку я не могу использовать pvPortMalloc() или vPortFree(), так как я использую, может быть, heap_1? - person Semaphor; 06.06.2016