STM32
直播中

而无返还

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

SMT32F429频繁接收数据之后,发送会报错ERR_MEM(-1)的原因?

主控芯片为SMT32F429,使用RMII,外面接LAN8742,无系统(裸系统)。
直接使用CubeMx生成代码,堆栈设置都是0x800。其它代码很少。ping和发送都没有问题,但是每次接收数据时会报错:
Assertion "pbuf_free: p->ref > 0" failed at line 753 in ../Middlewares/Third_Party/LwIP/src/core/pbuf.c
频繁接收数据之后,发送会报错ERR_MEM(-1),后面就再也不能正常收发数据了。
各位大佬,请问这是什么原因导致的?或者如何能避免啊?

回帖(1)

足球上篮

2024-7-5 17:20:09
从您提供的信息来看,这个问题可能是由于内存不足导致的。在LwIP中,ERR_MEM(-1)表示内存分配失败。以下是一些建议来解决这个问题:

1. **检查内存分配**:首先,确保您为LwIP分配了足够的内存。您可以通过修改`lwipopts.h`文件中的`MEM_SIZE`宏来增加内存大小。例如,将其设置为16KB:

   ```c
   #define MEM_SIZE (16 * 1024)
   ```

2. **优化内存使用**:检查您的代码,确保没有内存泄漏或不必要的内存分配。使用LwIP的内存调试功能可以帮助您找到内存泄漏。

3. **调整PBUF配置**:在`lwipopts.h`文件中,您可以调整PBUF的配置,例如减少PBUF_POOL_SIZE,以减少每个PBUF占用的内存。但是请注意,这可能会影响网络性能。

   ```c
   #define PBUF_POOL_SIZE 4
   ```

4. **使用更小的MTU**:减小MTU(最大传输单元)可以减少每个数据包所需的内存。在`lwipopts.h`文件中,将`ETH_MAX_MTU`设置为较小的值,例如:

   ```c
   #define ETH_MAX_MTU 1500
   ```

5. **检查LAN8742配置**:确保您的LAN8742配置正确,没有导致过多的数据包丢失或错误。检查硬件连接和配置参数,如速率、双工模式等。

6. **使用LwIP调试**:启用LwIP的调试选项,以便在出现问题时提供更多信息。在`lwipopts.h`文件中,取消以下行的注释:

   ```c
   //#define LWIP_DEBUG 1
   ```

   然后,重新编译并运行您的程序,查看调试输出以找到问题所在。

7. **优化网络协议栈**:如果您的应用程序对网络性能要求较高,您可能需要优化LwIP协议栈以适应您的特定需求。这可能包括调整TCP、UDP和IP层的参数。

尝试上述建议,看看是否能解决您遇到的问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助您。
举报

更多回帖

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