100
КОМПОНЕНТЫ И ТЕХНОЛОГИИ •
№ 5 '2011
компоненты
микроконтроллеры
Вызов
pvPortMalloc() приводит к вы-
делению блока памяти для размещения
структуры tskTCB и стека задачи из кучи
FreeRTOS. Выделяемые блоки памяти рас-
полагаются последовательно друг за другом
(рис. 5). Куча FreeRTOS представляет со-
бой массив байт, определенный как обыч-
ная глобальная переменная. Размер этого
массива в байтах задается макроопределе-
нием
conf igTOTAL_HEAP_SIZE в
файле
FreeRTOSConfig.h.
Разработчик должен учесть, что объем до-
ступной памяти для размещения перемен-
ных, связанных с решением прикладных за-
дач, уменьшается на размер кучи FreeRTOS.
Поэтому размер кучи FreeRTOS следует за-
давать минимальным, но достаточным для
размещения всех объектов ядра. Далее будет
показано, как получить объем оставшейся
свободной памяти в куче FreeRTOS на этапе
выполнения программы.
На рис. 5а изображена куча FreeRTOS в мо-
мент, когда ни одна задача еще не создана.
На рис. 5б и в отображено размещение бло-
ков памяти задач при их последовательном
создании и, соответственно, уменьшение
объема свободной памяти кучи.
Очевидно, что за счет того, что задачи
не уничтожаются, эффект фрагментации па-
мяти кучи исключен.
Схема выделения памяти
heap_2.c
Как и в схеме
heap_1.c, память для за-
дач выделяется из кучи FreeRTOS размером
configTOTAL_HEAP_SIZE байт. Однако схе-
ма
heap_2.c в отличие от
heap_1.c позволяет
уничтожать задачи после запуска планиров-
щика, соответственно, она содержит реализа-
цию
API-функции vPortFree().
Так как задачи могут уничтожаться, то бло-
ки памяти, которые они использовали, будут
освобождаться, следовательно, в куче может
находиться несколько отдельных участков
свободной памяти (фрагментация). Для на-
хождения подходящего участка свободной
памяти, в который с помощью API-функции
Достарыңызбен бөлісу: