Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2743
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Запуск FreeRTOS

626

void free (void *ptr) { vPortFree(ptr);

}

Это сработает, потому что в последних выпусках libc обе функции объявлены как __weak.

23.4.1.7.Определение кучи FreeRTOS

Начиная с FreeRTOS 9.x также можно управлять определением кучи в дополнение к ее размеру. Установив для макроса configAPPLICATION_ALLOCATED_HEAP значение 1, мы можем объявить кучу FreeRTOS и принять решение о ее размещении в специфических областях памяти (например, в более быстрой памяти, такой как CCM) с помощью пользовательского скрипта компоновщика. При конфигурации configAPPLICATION_ALLOCATED_HEAP в 1 мы должны предоставить массив типа uint8_t с точным именем и размером, как показано ниже.

uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

23.4.2. Модель статического выделения памяти

Начиная с FreeRTOS 9.x, можно включить полностью статическую модель выделения памяти. Это означает, что мы несем полную ответственность за правильное выделение пулов памяти, необходимых ОС для выполнения своей деятельности. Статически выделенное ОЗУ предоставляет разработчикам некоторые важные преимущества:

Структуры ОС могут быть размещены в специфичных местах памяти. Это является важным преимуществом для тех микроконтроллеров STM32, которые имеют CCM-память или другие кэшируемые памяти SRAM.

Максимальный объем ОЗУ может быть определен во время компоновки, а не во время выполнения.

Разработчикам не нужно заботиться о изящной обработке ошибок выделения памяти.

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

Статическая модель выделения памяти включается путем установки макроса configSUPPORT_STATIC_ALLOCATION в 1, и она влияет на все API-интерфейсы, используемые для определения объектов FreeRTOS. Например, функция, соответствующая osThreadDef() при использовании статической модели выделения, – osThreadStaticDef(). При использовании статического выделения мы должны предоставить FreeRTOS области памяти, в которых должны храниться объекты, путем предварительного их выделения. Например, при создании нового потока нам нужно предоставить область памяти, содержащую один TCB плюс стек, используемый потоком.

...

osThreadId threadID; uint32_t threadStack[ 128 ];

osStaticThreadDef_t threadTCB;

osThreadStaticDef(tid, ThreadFunc, osPriorityNormal, 0, 128, threadStack, &threadTCB); threadID = osThreadCreate(osThread(tid), NULL);