OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 979|回复: 6

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

[复制链接]

  离线 

4

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-9-8
在线时间
21 小时
发表于 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, 下载次数: 141

网络实验7 NETCONN_UDP实验_UCOS2.zip

1.16 MB, 下载次数: 128

回复

使用道具 举报

  离线 

23

主题

676

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
3447
金钱
3447
注册时间
2015-11-5
在线时间
1067 小时
发表于 2017-12-11 13:36:14 | 显示全部楼层
很抱歉我这段时间都比较忙没法及时处理你们的问题,非常抱歉!
对于你说的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; 		//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);	//标记连接断开
	} 
} 

由于LWIP采用pbuf链表形式存储接收数据,因此接收时是先分配pbuf,用完后立刻释放,这部分原子的代码都处理了,不应该有问题
更具体的内容请参照另一篇文章:http://www.openedv.com/forum.php ... d=106344&extra=

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

生活不只有眼前的苟且,还有你看不懂的诗和永远到不了的远方!
回复 支持 反对

使用道具 举报

  离线 

13

主题

291

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

  离线 

12

主题

229

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

  离线 

4

主题

8

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

4

主题

8

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

12

主题

229

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

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

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-4-25 07:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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