乐鑫技术交流
直播中

绝代双骄

12年用户 1103经验值
私信 关注
[问答]

(RTOS_SDK)mbedtls_ssl_write内存不足怎么解决?

当堆内存不足时,该函数mbedtls_ssl_write永远卡住,大约3-4kb的堆。ssl_write将永远阻塞,直到您重置设备,它仅在堆内存不足时发生。当写入永远阻塞时,中断仍然有效。请进行调查。

File -> RTOS_SDKthird_partymbedtlslibraryssl_tls.c
Function -> int mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len )

Digging a little bit more on the issue, I've added vPortEnterCritical() and vPortExitCritical between the "ssl_write" call, then the code always crashes and prints ShowCritical:1 message on the uart.
            

回帖(1)

caosurround

2024-7-17 11:32:59
在这种情况下,我们需要解决mbedtls_ssl_write函数在堆内存不足时卡住的问题。以下是一些可能的解决方案:

1. **增加堆内存大小**:首先,检查当前的堆内存大小是否足够。如果不够,可以考虑增加堆内存的大小。这可以通过修改RTOS配置文件或编译器设置来实现。

2. **优化内存使用**:检查代码中是否有内存泄漏或不必要的内存分配。使用内存分析工具(如Valgrind)来检测内存泄漏,并优化代码以减少内存使用。

3. **使用动态内存分配**:如果可能,尝试使用动态内存分配而不是静态分配。这样可以在运行时根据需要分配内存,从而减少内存不足的风险。

4. **限制写入数据的大小**:在调用mbedtls_ssl_write之前,检查要写入的数据大小,并确保它不会超过堆内存的限制。如果数据太大,可以考虑将其分成较小的部分,然后逐个发送。

5. **使用临界区保护**:在调用mbedtls_ssl_write之前和之后使用临界区保护(如vPortEnterCritical和vPortExitCritical)。这可以确保在写入操作期间不会发生内存分配或释放,从而避免死锁。

6. **实现内存回收机制**:在应用程序中实现内存回收机制,以便在不再需要内存时释放它。这可以通过定期检查不再使用的内存并释放它来实现。

7. **监控内存使用情况**:在应用程序中添加内存使用监控功能,以便在内存不足时及时采取措施。这可以通过定期检查内存使用情况并发出警告来实现。

8. **优化mbedtls库**:检查mbedtls库的配置,看看是否有优化内存使用的方法。例如,可以尝试使用更小的加密算法或减少缓存大小。

9. **考虑使用其他SSL库**:如果mbedtls库的内存使用问题无法解决,可以考虑使用其他SSL库,如OpenSSL或WolfSSL,这些库可能在内存使用方面更优化。

通过以上方法,可以有效地解决mbedtls_ssl_write在堆内存不足时卡住的问题。在实施这些解决方案时,请确保充分测试以确保它们不会引入新的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分