完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,
在这个FreeRTOS板块求助下大家,我在原子开发板STM32F103的LWIP例程例移植了FreeRTOS操作系统,然后测试了一下发现很容易挂掉。 在网络调试助手设置成1ms发送一次的情况下,使用FreeRTOS操作系统的LWIP例程就会出现网卡溢出的情况,而UCOS就不会出现。 麻烦大神们帮我看下,是我写的代码有问题还是什么。 我是先学习的FreeRTOS操作系统的,UCOS我都没去接触过,这样的测试结果等于一盆冷水往头上泼了。 附件里是UCOS操作系统的LWIP例程和freeRTOS操作系统的LWIP例程,可以直接编译下载到战舰V3开发板实验的。 网络实验7 NETCONN_UDP实验_FreeRTOS.zip (1.33 MB ) 网络实验7 NETCONN_UDP实验_UCOS2.zip (1.16 MB ) |
|
相关推荐
6个回答
|
|
很抱歉我这段时间都比较忙没法及时处理你们的问题,非常抱歉!
对于你说的FreeRTOS+LWIP出现的问题,我本人用LWIP时没有跑OS,所以观点可能比较片面 你的附件下载不了,根据你的截图只能判断你用的是战舰板,网卡是DM9000 很抱歉我不了解DM9000的驱动,目前只能大概给你讲下LWIP的接收处理过程 看了下战舰版的例程,都是调用以下两行代码来执行数据接收处理的: [AppleScript] 纯文本查看 复制代码 lwip_periodic_handle();lwip_pkt_handle(); 以UDP为例,上面的函数调用最终会调用底层的回调函数: [AppleScript] 纯文本查看 复制代码 void udp_demo_recv(void *arg,struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port){u32 data_len = 0;struct pbuf *q;if(p!=NULL)//接收到不为空的数据时{memset(udp_demo_recvbuf,0,UDP_DEMO_RX_BUFSIZE); //数据接收缓冲区清零for(q=p;q!=NULL;q=q->next) //遍历完整个pbuf链表{//判断要拷贝到UDP_DEMO_RX_BUFSIZE中的数据是否大于UDP_DEMO_RX_BUFSIZE的剩余空间,如果大于//的话就只拷贝UDP_DEMO_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据if(q->len > (UDP_DEMO_RX_BUFSIZE-data_len)) memcpy(udp_demo_recvbuf+data_len,q->payload,(UDP_DEMO_RX_BUFSIZE-data_len));//拷贝数据else memcpy(udp_demo_recvbuf+data_len,q->payload,q->len);data_len += q->len; if(data_len > UDP_DEMO_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出}upcb->remote_ip=*addr; //记录远程主机的IP地址upcb->remote_port=port; //记录远程主机的端口号lwipdev.remoteip[0]=upcb->remote_ip.addr&0xff; //IADDR4lwipdev.remoteip[1]=(upcb->remote_ip.addr>>8)&0xff; //IADDR3lwipdev.remoteip[2]=(upcb->remote_ip.addr>>16)&0xff;//IADDR2lwipdev.remoteip[3]=(upcb->remote_ip.addr>>24)&0xff;//IADDR1 udp_demo_flag|=1<<6;//标记接收到数据了pbuf_free(p);//释放内存}else{udp_disconnect(upcb); LCD_Clear(WHITE);//清屏POINT_COLOR = RED;LCD_ShowString(30,30,200,16,16,"WarShip STM32");LCD_ShowString(30,50,200,16,16,"UDP Test");LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");POINT_COLOR=BLUE;LCD_ShowString(30,90,200,16,16,"Connect break!"); LCD_ShowString(30,110,200,16,16,"KEY1:Connect");udp_demo_flag &= ~(1<<5);//标记连接断开} } 由于LWIP采用pbuf链表形式存储接收数据,因此接收时是先分配pbuf,用完后立刻释放,这部分原子的代码都处理了,不应该有问题 更具体的内容请参照另一篇文章:http://www.openedv.com/forum.php ... d=106344&extra= 值得注意的是,LWIP的函数嵌套比较多,栈深度不太好估计,所以你任务开辟的堆栈一定要足够大 最后建议你在上面的回调函数里设断点,看函数返回之前会不会进入硬件错误 |
|
|
|
freertos+lwip应该没有问题的,我用过
|
|
|
|
楼主,你FreeRTOS时钟节拍设置的多少,原子例程默认的是50MS;而UCOSIII例程的时钟节拍是1MS
|
|
|
|
版主您好,
前两天论坛被攻击了,所以附件不能下载,现在附件可以下载了,ucos版本的和freertos版本的都有上传,可以比较着来看。 现在测试结果是这样的,如果用freertos操作系统的话,慢一点发也没有问题,如果调1ms一次发送就会有问题。 |
|
|
|
使用的时钟节拍是1ms一次哦
|
|
|
|
额,那我搞错了
|
|
|
|
只有小组成员才能发言,加入小组>>
692 浏览 0 评论
1105 浏览 1 评论
2473 浏览 5 评论
2807 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2645 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
652浏览 9评论
649浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
781浏览 6评论
628浏览 5评论
668浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 19:02 , Processed in 0.931220 second(s), Total 56, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号