FreeRTOS9.0内存申请函数与LVGL9.0内存配合使用。

软件开发大郭
0 评论
/
3 阅读
/
3989 字
30 2023-11

介绍

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;
    }
}
标签:
    暂无数据