没有上系统,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次时内存不足;
你怎么看呢? |