介绍
FreeRTOS 9.0 提供了一系列用于内存管理的函数。这些函数允许您在任务或中断服务例程中动态地分配和释放内存。下面是一些主要的内存管理函数:
pvPortMalloc: 这个函数用于申请内存。它类似于标准 C 库中的 malloc 函数。您可以使用此函数分配指定大小的内存块。
用法示例:
void *pvBuffer = pvPortMalloc(100); // 分配 100 字节的内存
vPortFree: 这个函数用于释放先前使用 pvPortMalloc 分配的内存。它类似于标准 C 库中的 free 函数。
用法示例:
vPortFree(pvBuffer); // 释放之前分配的内存
使用这些函数时需要注意,不应在中断服务例程中调用可能会导致阻塞的函数(比如 pvPortMalloc),因为它们可能会影响系统的实时性能。另外,分配的内存应当在不需要时及时释放,以避免内存泄漏。
结合LVGL9.0使用
修改配置文件lv_conf.h 先修改
#define LV_USE_BUILTIN_MALLOC 0
然后增加下面代码
#if LV_USE_BUILTIN_MALLOC
#define LV_MALLOC lv_malloc_builtin
#define LV_REALLOC lv_realloc_builtin
#define LV_FREE lv_free_builtin
#else
#define LV_STDLIB_INCLUDE <FreeRTOS.h>
#define LV_MALLOC pvPortMalloc
#define LV_REALLOC pvPortRealloc
#define LV_FREE vPortFree
#endif
其中pvPortRealloc是自定义的函数,不是FreeRTOS自带的。
pvPortRealloc函数实现
// ******************************************************************************************************
// * *
// * pvPortRealloc *
// * *
// * Funzione per riallocare dimensione memoria in heap region *
// * *
// * Parameter : (void *) Pointer to a memory block previously allocated with malloc, calloc or realloc *
// * (size_t) Number of byte to resize section *
// * *
// * Return : (void *) Pointer to allocate region, NULL if error on allocation *
// * *
// ******************************************************************************************************
#include "FreeRTOS.h"
#include "task.h"
#include <string.h> // For memcpy
typedef struct xBlockLink
{
size_t xBlockSize;
struct xBlockLink *pxNextFreeBlock;
} BlockLink_t;
/* This constant is used to indicate that the block is allocated. */
#define xBlockAllocatedBit 0x01
/* Size of the structure placed in front of each allocated memory block. */
#define xHeapStructSize ((size_t)sizeof(BlockLink_t))
void* pvPortRealloc (void *pv, size_t xWantedSize)
{
void *pvNew = NULL;
void *pvOld = pv;
if (pvOld != NULL)
{
if (xWantedSize == 0)
{
/* Requested size is 0, which is equivalent to freeing the memory. */
vPortFree (pvOld);
return NULL;
}
}
/* Allocate a new memory block with the requested size. */
pvNew = pvPortMalloc (xWantedSize);
if (pvNew != NULL)
{
if (pvOld != NULL)
{
size_t xOldSize = 0;
BlockLink_t *pxLink = (BlockLink_t*) ((uint8_t*) pvOld - xHeapStructSize);
// Get the size of the old memory block
xOldSize = pxLink->xBlockSize & ~xBlockAllocatedBit;
// Calculate the size to copy
size_t xCopySize = (xWantedSize < xOldSize) ? xWantedSize : xOldSize;
// Copy data from old block to new block
memcpy (pvNew, pvOld, xCopySize);
// Free the old memory block
vPortFree (pvOld);
}
return pvNew;
}
else
{
/* Allocation of new memory block failed. */
return NULL;
}
}