【问题标题】:Shortage of Heap memroy on FreeRTOSFreeRTOS 中的堆内存不足
【发布时间】:2020-12-30 01:05:20
【问题描述】:

我正在使用 FreeRTOS V9.0.0 在 Marvell MW300 板上运行我的应用程序。 在我的应用程序中,当我尝试连接 HTTPS 服务器时,mbedtls 显示错误。

[wm_mbedtls] ssl_tls.c:5431: |1| 0x00121188: alloc(4429 in bytes) (4429 out bytes) failed.

在调试时,观察者发现这是由于堆内存不足造成的。这是堆内存统计数据

Heap size ---------------------- : 305536
Free size ---------------------- : 17888
Peak Heap Usage since bootup --- : 291048
Total allocations -------------- : 136
Failed allocations ------------- : 0
Min overhead per allocation ---- : 16
Biggest free block available now : 8040

在尝试连接我的 HTTPS 服务器之前,我会打印此堆内存信息。 据观察,当设备尝试连接 HTTPS 服务器时,mbedtls 想要分配两个 4429 字节的缓冲区(输入和输出),但由于可用的最大空闲块为 8040,因此失败 这是mbedtls的代码。

/*
  * Prepare base structures
   */
     if( ( ssl-> in_buf = mbedtls_calloc( 1, MBEDTLS_SSL_IN_BUFFER_LEN( ssl->conf ) ) ) == NULL ||
         ( ssl->out_buf = mbedtls_calloc( 1, MBEDTLS_SSL_OUT_BUFFER_LEN( ssl->conf ) ) ) == NULL )
     {
                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d in bytes) (%d out  bytes) failed", MBEDTLS_SSL_IN_BUFFER_LEN( ssl->conf ),
                                MBEDTLS_SSL_OUT_BUFFER_LEN( ssl->conf ) ) );
              mbedtls_free( ssl->in_buf );
                 ssl->in_buf = NULL;
             return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
     }

板载可用内存为 17888。 是否可以在“可用的空闲块”中添加一些“空闲内存”? 或者有什么建议,如何处理这个问题?

我正在使用堆 4 方案。

提前致谢。

【问题讨论】:

    标签: heap-memory freertos


    【解决方案1】:

    根据您发布的日志,您总共有305536 字节可用于堆,您使用287648 字节,只剩下17888 字节的可用内存。换句话说,您使用了超过 94% 的可用“动态”内存。

    对于通过 TLS 连接的应用程序(您已经提到 HTTPS,即基于 TLS 的 HTTP),拥有约 18KB 的可用内存可能还不够。我遇到的大多数 TCP/IP 堆栈实现中的 TLS 连接往往非常“占用大量内存”,因为它们倾向于分配用于加密和解密数据包的内部缓冲区。 TLS 握手期间的证书验证步骤也往往不是很“轻量级”,因为服务器可能决定向您发送整个证书链进行验证,其大小可能仅是 KB 本身。所有这些都需要至少暂时在内存中。

    要回答Is it possible to add some “Free memory” into “free blocks available? 的问题,您有两种选择:

    1. 获得具有更多 RAM 的硬件:要么具有更多内部 RAM 的 MCU,要么使用外部 RAM 芯片,

    2. 优化您的应用程序。

    第一个选项是不言自明的。我首先建议选择第二种选择。我假设您提供的数字(17888 字节免费)适用于空闲/“什么都不做”的应用程序。如果是这样 - 那是很多,你应该看看是什么导致在这种情况下使用这么多 RAM。这将涉及您调试应用程序的所有部分,这些部分可能会在某些时候动态分配内存。

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 2021-07-05
      • 2018-02-10
      • 2013-08-09
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多