【问题标题】:CMSIS FreeRTOS dynamic allocationCMSIS FreeRTOS 动态分配
【发布时间】:2018-08-08 07:15:22
【问题描述】:

我正在使用 CMSIS FreeRtos 和 heap4 作为内存管理方案的嵌入式系统。

现在我正在尝试将 mbedTls 移植到我的系统中,我必须提供动态分配功能,例如 alloc 和 free。

mbedTLS 需要两个函数来分配和释放内存。 这些是 mbedTLS 所需的函数原型:

void * (*mbedtls_calloc)( size_t, size_t ) = MBEDTLS_PLATFORM_STD_CALLOC;
void (*mbedtls_free)( void * )             = MBEDTLS_PLATFORM_STD_FREE;

int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ),
                              void (*free_func)( void * ) )

正确使用 FreeRTOS 提供的堆的最佳方式是什么? 以内存池为例。

Heap4 不提供 calloc 和 free 等功能。那么,我应该包装哪个函数以允许 mbedTls 分配内存?

提前感谢您的帮助。

费德里科

【问题讨论】:

  • "功能类似于..."!? 准确指定需要哪些功能,或提供指向您所指的 mbedTLS 产品文档的链接。
  • @Clifford 我需要在 FreeRTOS 中高效分配和释放内存的函数。不知道使用内存池是不是最好的选择。
  • 不是我要问的。 mbedTLS 需要什么 - 从语义上讲。您提到了分配、calloc 和 free,但说“类似的功能”暗示还有其他功能。
  • @Clifford 我的问题很简单:如何在具有 heap4 ad 内存管理的 FreeRTOS 中分配动态内存?就是这样
  • 尊重,这不是你问的。您的编辑回答了我的问题,mbedTLS 使用回调。 freeRTOS 中的内存分配功能已记录在案,并且适用于所有方案。您可能必须创建包装器来支持某些语义,例如 calloc 初始化。我很难看出这个问题有什么不明显的地方。

标签: embedded dynamic-memory-allocation freertos mbedtls


【解决方案1】:

第 1 步: 在您的源代码中制作一个 calloc 和 free 函数的包装器,如下所示。

void *pvWrap_mbedtls_calloc( size_t sNb, size_t sSize )
{
    void *vPtr = NULL;
    if (sSize > 0) {
        vPtr = pvPortMalloc(sSize * sNb); // Call FreeRTOS or other standard API
        if(vPtr)
           memset(vPtr, 0, (sSize * sNb)); // Must required
    }
    return vPtr;
}

void vWrap_mbedtls_free( void *vPtr )
{
    if (vPtr) {
        vPortFree(vPtr); // Call FreeRTOS or other standard API
    }
}

第 2 步:在您的应用程序初始化时注册这些 API,如下所示。

void Custom_MBEDTLS_Init(void)
{
    mbedtls_platform_set_calloc_free(&pvWrap_mbedtls_calloc, &vWrap_mbedtls_free);
} 

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 2019-09-22
    • 1970-01-01
    • 2016-09-07
    • 2010-12-04
    • 2011-01-15
    • 2020-12-05
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多