打印

lwip 环回接口 UDP收发 内存不足

[复制链接]
2055|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
海川先生|  楼主 | 2014-7-9 00:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
没有上系统,lwip裸奔,raw/callback方式调用UDP函数通过环回接口自发自收。
首先是移植,用户需要编写的文件有cc.h,perf.h,cpu.h,lwipopts.h,参考的是st官方代码和lwip的移植说明。
然后stm32的时钟以及串口再加一个定时器配置好,串口输出调试信息,定时器周期更新ARP table和维护TCP slow/fast timer,最重要的是这里用到的环回接口需要周期性调用netif_poll这个函数,把环回接口中收到的数据递交给IP层。
用伪代码描述一下出错的代码:
Stm32时钟外设初始化;
Lwip初始化;
建立一个UDP客户端,绑定127.0.0.1,连接至UDP服务器;
建立一个UDP服务器,绑定127.0.0.1;连接至UDP客户端;
申请内存,
把数据填至内存;
While{
周期调用tcp_tmr();
周期调用etharp_tmr();
周期发送数据udp_sendto();
netif_poll();
}
结果是第一次发送和接收都正常,第二次开始就出错,经跟踪,到第二次发送前发现错误原因。首次发送,接收后申请的内存已释放,再次发送前必须再次申请内存且填充用户数据;
改正后
Stm32时钟外设初始化;
Lwip初始化;
建立一个UDP客户端,绑定127.0.0.1,连接至UDP服务器;
建立一个UDP服务器,绑定127.0.0.1;连接至UDP客户端;
While{
周期调用tcp_tmr();
周期调用etharp_tmr();
周期申请内存并填充数据,然后用netif_poll发送数据;
}
至此数据可以正常收发,但是还是高兴早了,程序跑了一会就停了,重启跑了一会又停了,发现每次都是收发223次后停止,开始怀疑是不是内存泄露了,排查中...
在周期申请内存后,检查是否申请成功,不成功打印输出信息;(单片机初学者没上过系统和协议栈,没有用过动态内存分配,这点常识没有,好羞愧。)
果不其然,224次输出memory error
找到问题所在了,就是内存泄露,但是哪里泄露呢?在Udp的接收处理回调函数里最后释放pbuf了呀,怎么回事,排查中...
开始试探:每一次发送11个字节 223次时内存不足;
          每一次发送196个字节  75次时内存不足;
你怎么看呢?

相关帖子

沙发
dirtwillfly| | 2014-7-9 08:38 | 只看该作者
非ti mcu相关技术问题,帮你移个板块吧

使用特权

评论回复
板凳
dirtwillfly| | 2014-7-9 09:24 | 只看该作者
内存使用完毕要及时释放,不然早晚会内存不足

使用特权

评论回复
地板
海川先生|  楼主 | 2014-7-9 20:38 | 只看该作者
问题解决了,
netif_poll发送数据后应该释放内存

使用特权

评论回复
5
dirtwillfly| | 2014-7-10 14:07 | 只看该作者
海川先生 发表于 2014-7-9 20:38
问题解决了,
netif_poll发送数据后应该释放内存

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

200

帖子

1

粉丝