OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 17008|回复: 6

FreeRTOS、UCOS2 没有对比就没有伤害

[复制链接]

8

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2017-9-8
在线时间
65 小时
发表于 2017-12-8 19:59:14 | 显示全部楼层 |阅读模式
大家好,
      在这个FreeRTOS板块求助下大家,我在原子开发板STM32F103的LWIP例程例移植了FreeRTOS操作系统,然后测试了一下发现很容易挂掉。
      在网络调试助手设置成1ms发送一次的情况下,使用FreeRTOS操作系统的LWIP例程就会出现网卡溢出的情况,而UCOS就不会出现。
      
      麻烦大神们帮我看下,是我写的代码有问题还是什么。


      我是先学习的FreeRTOS操作系统的,UCOS我都没去接触过,这样的测试结果等于一盆冷水往头上泼了。
      
      附件里是UCOS操作系统的LWIP例程和freeRTOS操作系统的LWIP例程,可以直接编译下载到战舰V3开发板实验的。




Freertos.png

网络实验7 NETCONN_UDP实验_FreeRTOS.zip

1.33 MB, 下载次数: 438

网络实验7 NETCONN_UDP实验_UCOS2.zip

1.16 MB, 下载次数: 410

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-12-11 13:36:14 | 显示全部楼层
很抱歉我这段时间都比较忙没法及时处理你们的问题,非常抱歉!
对于你说的FreeRTOS+LWIP出现的问题,我本人用LWIP时没有跑OS,所以观点可能比较片面
你的附件下载不了,根据你的截图只能判断你用的是战舰板,网卡是DM9000
很抱歉我不了解DM9000的驱动,目前只能大概给你讲下LWIP的接收处理过程
看了下战舰版的例程,都是调用以下两行代码来执行数据接收处理的:
[mw_shl_code=applescript,true]lwip_periodic_handle();
lwip_pkt_handle();[/mw_shl_code]
以UDP为例,上面的函数调用最终会调用底层的回调函数:
[mw_shl_code=applescript,true]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;                 //IADDR4
                lwipdev.remoteip[1]=(upcb->remote_ip.addr>>8)&0xff; //IADDR3
                lwipdev.remoteip[2]=(upcb->remote_ip.addr>>16)&0xff;//IADDR2
                lwipdev.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);        //标记连接断开
        }
} [/mw_shl_code]
由于LWIP采用pbuf链表形式存储接收数据,因此接收时是先分配pbuf,用完后立刻释放,这部分原子的代码都处理了,不应该有问题
更具体的内容请参照另一篇文章:http://www.openedv.com/forum.php ... d=106344&extra=

值得注意的是,LWIP的函数嵌套比较多,栈深度不太好估计,所以你任务开辟的堆栈一定要足够大
最后建议你在上面的回调函数里设断点,看函数返回之前会不会进入硬件错误

拿来长岛冰茶换我半晚安睡
回复 支持 反对

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
发表于 2017-12-11 14:56:55 | 显示全部楼层
freertos+lwip应该没有问题的,我用过
活着才是王道!健康是一切的前提!
回复 支持 反对

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-12-11 15:55:38 | 显示全部楼层
楼主,你FreeRTOS时钟节拍设置的多少,原子例程默认的是50MS;而UCOSIII例程的时钟节拍是1MS
回复 支持 反对

使用道具 举报

8

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2017-9-8
在线时间
65 小时
 楼主| 发表于 2017-12-14 14:24:17 | 显示全部楼层
FreeRTOS 发表于 2017-12-11 13:36
很抱歉我这段时间都比较忙没法及时处理你们的问题,非常抱歉!
对于你说的FreeRTOS+LWIP出现的问题,我本 ...

版主您好,
       前两天论坛被攻击了,所以附件不能下载,现在附件可以下载了,ucos版本的和freertos版本的都有上传,可以比较着来看。
      
       现在测试结果是这样的,如果用freertos操作系统的话,慢一点发也没有问题,如果调1ms一次发送就会有问题。
回复 支持 反对

使用道具 举报

8

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2017-9-8
在线时间
65 小时
 楼主| 发表于 2017-12-14 14:26:44 | 显示全部楼层
1547674987 发表于 2017-12-11 15:55
楼主,你FreeRTOS时钟节拍设置的多少,原子例程默认的是50MS;而UCOSIII例程的时钟节拍是1MS

使用的时钟节拍是1ms一次哦
回复 支持 反对

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-12-14 19:25:55 | 显示全部楼层
swi 发表于 2017-12-14 14:26
使用的时钟节拍是1ms一次哦

额,那我搞错了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表