欢迎来到天天文库
浏览记录
ID:10390019
大小:18.50 KB
页数:3页
时间:2018-07-06
《lwip环回调试笔记》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、没有上系统,lwip裸奔,raw/callback方式调用UDP函数通过环回接口自发自收。首先是移植,用户需要编写的文件有cc.h,perf.h,cpu.h,lwipopts.h,参考的是st官方代码和lwip的移植说明。然后stm32的时钟以及串口再加一个定时器配置好,串口输出调试信息,定时器周期更新ARPtable和维护TCPslow/fasttimer,最重要的是这里用到的环回接口需要周期性调用netif_poll这个函数,把环回接口中收到的数据递交给IP层。用伪代码描述一下出错的代码:St
2、m32时钟外设初始化;Lwip初始化;建立一个UDP客户端,绑定127.0.0.1,连接至UDP服务器;建立一个UDP服务器,绑定127.0.0.1;连接至UDP客户端;申请内存,把数据填至内存;While{周期调用tcp_tmr();周期调用etharp_tmr();周期发送数据udp_sendto();netif_poll();}结果是第一次发送和接收都正常,第二次开始就出错,经跟踪,到第二次发送前发现错误原因。首次发送,接收后申请的内存已释放,再次发送前必须再次申请内存且填充用户数据;改正后
3、Stm32时钟外设初始化;Lwip初始化;建立一个UDP客户端,绑定127.0.0.1,连接至UDP服务器;建立一个UDP服务器,绑定127.0.0.1;连接至UDP客户端;While{周期调用tcp_tmr();周期调用etharp_tmr();周期申请内存并填充数据,然后用周期发送数据udp_sendto()发送数据;netif_poll();}至此数据可以正常收发,但是还是高兴早了,程序跑了一会就停了,重启跑了一会又停了,发现每次都是收发223次后停止,开始怀疑是不是内存泄露了,排查中...
4、在周期申请内存后,检查是否申请成功,不成功打印输出信息;(单片机初学者没上过系统和协议栈,没有用过动态内存分配,这点常识没有,好羞愧。)果不其然,224次输出memoryerror找到问题所在了,就是内存泄露,但是哪里泄露呢?在Udp的接收处理回调函数里最后释放pbuf了呀,怎么回事,排查中...开始试探:每一次发送11个字节223次时内存不足;每一次发送196个字节75次时内存不足;一觉醒来,已经是第二天早上,用keil仿真,看内存区,的确是被占的满满的,开始跟踪调试...有重大发现,netif
5、_loop_output该函数会申请内存,并把用户数据赋值到其中,而后递交给IP进而UDP,最终至用户,我之前在回调函数里只是把netif_loop_output申请的内存给释放了,而我自个发送前申请的内存未释放,好了改代码如下:Stm32时钟外设初始化;Lwip初始化;建立一个UDP客户端,绑定127.0.0.1,连接至UDP服务器;建立一个UDP服务器,绑定127.0.0.1;连接至UDP客户端;While{周期调用tcp_tmr();周期调用etharp_tmr();周期申请内存并填充数据,
6、然后用周期发送数据udp_sendto()发送数据,发送完毕释放内存;netif_poll();}至此OK;
此文档下载收益归作者所有