1. 程式人生 > >FreeRTOS程式碼閱讀筆記:heap_3.c

FreeRTOS程式碼閱讀筆記:heap_3.c

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();
	}
}