乐鑫技术交流
直播中

kasdlak

8年用户 1213经验值
擅长:光电显示
私信 关注
[问答]

长时间发送344个字节的UDP报文,出现overflow the heap_size并导致系统异常重启怎么解决?

1,pmT 堆异常
"pmT"(stack_size = 0,task handle = 3fff56c8) overflow the heap_size.
"pmT"(stack_size = 0,task handle = 3fff56c8) overflow the heap_size.

2,异常重启
ShowCritical:0
ets Jan  8 2013,rst cause:2, boot mode:(3,0)

请问这个协议栈有问题??什么原因导致这个问题???

另外的现象,就是sendto的地方挂死。

之前在sendto地方加了一个select 判断是否能够发送报文,短一点的报文,不会出现异常或者挂死的现象。
                                                                                                                                                            

回帖(1)

石玉兰

2024-7-11 16:17:28
这个问题可能是由于UDP报文发送过程中内存不足导致的。以下是一些建议来解决这个问题:

1. **增加堆内存大小**:检查你的系统配置,看看是否可以增加堆内存(heap size)的大小。这可以通过修改系统配置文件或编译时设置来实现。

2. **优化内存使用**:检查你的代码,看看是否有内存泄漏或者不必要的内存分配。使用内存分析工具来帮助识别这些问题。

3. **限制报文大小**:如果你的应用场景允许,尝试限制发送的UDP报文大小。较小的报文可能会减少内存溢出的风险。

4. **使用动态内存管理**:如果你的应用程序需要频繁地分配和释放内存,考虑使用动态内存管理技术,如内存池(memory pool)。

5. **优化发送逻辑**:检查你的发送逻辑,确保在发送报文之前检查内存是否足够。如果内存不足,可以暂停发送或等待内存释放。

6. **使用非阻塞I/O**:使用非阻塞I/O(如select或poll)可以避免在sendto函数调用时挂死。你已经尝试了select,但可能需要进一步优化你的逻辑以确保它在内存不足时能够正确处理。

7. **错误处理**:在发送报文时添加错误处理逻辑,以便在遇到问题时能够优雅地处理。例如,如果sendto调用失败,可以重试或记录错误信息。

8. **更新协议栈**:如果你怀疑问题可能与协议栈有关,尝试更新到最新版本的协议栈,看看是否解决了问题。

9. **硬件或固件问题**:如果上述方法都不能解决问题,可能需要检查硬件或固件是否存在问题。与硬件供应商或固件开发者联系,看看是否有已知的问题或解决方案。

通过尝试上述建议,你应该能够找到导致内存溢出的原因,并采取相应的措施来解决这个问题。
举报

更多回帖

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