FreeRTOS程式碼閱讀筆記:heap_3.c
阿新 • • 發佈:2018-10-31
FreeRTOS中對於記憶體的管理當前一共有5種實現方式(作者當前的版本是10.1.1),均在【 \Source\portable\MemMang 】下面,這裡筆記下。
pvPortMalloc() 和 vPortFree() 的實現是基於 malloc()和 free()實現的,此時configTOTAL_HEAP_SIZE 是無效的。
改變記憶體堆是通過修改啟動檔案來實現的。
heap3使得記憶體分配變得不確定性,可能會增加程式碼量。其特點是將標準函式的malloc()和free()函式封裝,使其具有執行緒保護功能。
///////////////////////////////////////////////////////////////////////////////////////////////
heap_3.c:
/*根據上面的註釋可以知道,這裡 pvPortMalloc() 和 vPortFree() 的實現是基於 malloc()和 free() 。 由於使用了標準C函式中的記憶體申請和釋放,因此使用前一定要在工程中設定好堆記憶體。 */ #include <stdlib.h> /* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining all the API functions to use the MPU wrappers. That should only be done when task.h is included from an application file. */ #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE #include "FreeRTOS.h" #include "task.h" #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE #if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 #endif /*-----------------------------------------------------------*/ void *pvPortMalloc( size_t xWantedSize ) { void *pvReturn; vTaskSuspendAll(); { pvReturn = malloc( xWantedSize ); traceMALLOC( pvReturn, xWantedSize ); } ( void ) xTaskResumeAll(); #if( configUSE_MALLOC_FAILED_HOOK == 1 ) { if( pvReturn == NULL ) { extern void vApplicationMallocFailedHook( void ); vApplicationMallocFailedHook(); } } #endif return pvReturn; } /*-----------------------------------------------------------*/ void vPortFree( void *pv ) { if( pv ) { vTaskSuspendAll(); { free( pv ); traceFREE( pv, 0 ); } ( void ) xTaskResumeAll(); } }