pvPortMalloc() будет помещен, например,
блок памяти задачи, используется алгоритм
наилучших подходящих фрагментов (the
best fit algorithm).
Работа алгоритма наилучших подходящих
фрагментов заключается в следующем. Когда
pvPortMalloc() запрашивает блок памяти
заданного размера, происходит поиск сво-
бодного участка, размер которого как можно
ближе к размеру запрашиваемого блока и,
естественно, больше его. Например, струк-
тура кучи представляет собой 3 свободных
участка памяти размером 5, 25 и 100 байт.
Функция pvPortMalloc() запрашивает блок
памяти 20 байт. Тогда наименьший подходя-
щий по размеру участок памяти — участок
размером 25 байт. 20 байт из этого участка
будут выделены, а оставшиеся 5 байт оста-
нутся свободными.
Реализация алгоритма наилучших подходя-
щих фрагментов в FreeRTOS не предусматри-
вает слияния двух примыкающих друг к дру-
гу свободных участков в один большой сво-
бодный участок. Поэтому при использовании
схемы heap_2.c возможна фрагментация кучи.
Однако фрагментации можно не опасаться,
если размер выделяемых и освобождаемых
впоследствии блоков памяти не изменяется
в течение выполнения программы.
Схема выделения памяти heap_2.c подхо-
дит для приложений, где создаются и уни-
чтожаются задачи, причем размер стека
при создании задач целесообразно остав-
лять неизменным.
На рис. 6а изображена куча FreeRTOS, бло-
ки памяти под три задачи располагаются по-
следовательно. На рис. 6б Задача 2 уничтоже-
на, куча содержит два свободных участка па-
мяти. На рис. 6в создана Задача 4 с размером
стека таким же, как был у Задачи 2. В соответ-
ствии с алгоритмом наилучших подходящих
фрагментов Задаче 4 выделен блок, который
раньше занимала Задача 2, фрагментации
кучи не произошло.
Время выполнения функций pvPortMalloc()
и vPortFree() для схемы heap_2.c не является
детерминированной величиной, однако их
реализация значительно эффективнее стан-
дартных функций malloc() и free().
Более подробно с существующими алго-
ритмами выделения памяти можно познако-
миться в [8].
Достарыңызбен бөлісу: |