OpenEdv-开源电子网

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

STM32F4XX(探索者 阿波罗)开发板 netconn_recv阻塞线程问题,UCOS节拍问题,求指导!!!

[复制链接]

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
发表于 2016-12-16 15:05:35 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 yangkefeng 于 2016-12-16 15:08 编辑


买了原子哥的开发板学习网口也学习了好久了,解决了一个又一个的问题,看的东西也越来越底层,现在又碰到一个问题琢磨不透,参考原子哥NETCONN_TCP客户端实验,碰上UCOS,凌乱了!!!

实验

实验
然后我就开始学习UCOS!!!F407的UCOS视频看了前13讲,参照教程和例程琢磨了好久,理解了任务创建,任务调度,任务挂起恢复等过程。接着回来研究NETCONN_TCP客户端实验。
首先系统采用UCOSII,没UCOSIII那么复杂,基本的东西还是一样的。稍作修改使得整个系统只包含系统任务,TCPIP内核任务,TCP连接任务(运行一次后挂起)和TCP发送接收任务。
在TCP发送接收任务中主要循环如下:
while(1)
{
    if((tcp_flag&TCP_CONN)==TCP_CONN) //TCP已连接
    {
        netconn_write(conn,user_buffer,1024,NETCONN_COPY);  //向PC发送1024字节数据
        struct  netbuf  *recvbuf;// 定义接收数据缓存
        if((tcp_recv_err=netconn_recv(conn,&recvbuf))==ERR_OK)//收到数据
        {
            memset(tcp_rbuf,0,300);            //接收缓冲清空
            memcpy(tcp_rbuf,recvbuf–>p->payload, recvbuf–>p->len); //拷贝数据
            printf("%s\r\n",tcp_rbuf);         //打印接收到的数据
            netbuf_delete(recvbuf);            //删除接收数据缓存
        }
    }
}
这个任务发送和接收功能实现均没有问题,发送速度为1MB/S,而且可以正常接收数据,也就是说一帧发1024字节,一秒发了1000次。

在netconn_recv()函数内部调用了sys_arch_mbox_fetch()等待消息邮箱,该函数内部又调用了:
     OSQPend(m_box->pQ,(u16_t)ucos_timeout,&ucErr);//请求消息队列,等待时限为ucos_timeout
而ucos_timeout至少为1个节拍,以下为例程中节拍数定义:
      #define OS_TICKS_PER_SEC        1000u    /* Set the number of ticks in onesecond    */

1秒1000个,一个节拍为1ms,也就是说调用netconn_recv()至少需等待1ms的时间请求消息队列,(实际测试发送两次发送间隔1ms)。
大神们是否有办法减小这个等待时间(增大OS_TICKS_PER_SEC的值有用吗),或者采用别的方法来接收网口数据啊,比如直接解析网口中断的数据

   while(ETH_GetRxPktSize(ETH_Handler.RxDesc))   
   {
       lwip_pkt_handle();//中断内处理以太网数据,交给LWIP
   }

   或者在tcpip_input()中解析消息邮箱数据等。具体应该怎么做呢?求助!!!

最佳答案

查看完整内容[请看2#楼]

是否有办法减小这个等待时间(增大OS_TICKS_PER_SEC的值有用吗) 这边等待时间是有办法减小的,将delay_init(180) 改成delay_init(10) 改了之后每个节拍的延时大大减小了 只要使用延时函数的时候注意延时时间被改变了即可,延时函数改变之后并不影响UCOS使用!!!不知道会不会有副作用,反正我是这么改了,暂时没出现什么问题,想要的效果也达到了
求指导!!!兄弟
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
 楼主| 发表于 2016-12-16 15:05:36 | 显示全部楼层
本帖最后由 yangkefeng 于 2016-12-20 16:58 编辑

是否有办法减小这个等待时间(增大OS_TICKS_PER_SEC的值有用吗)
这边等待时间是有办法减小的,将delay_init(180)   改成delay_init(10)   改了之后每个节拍的延时大大减小了     只要使用延时函数的时候注意延时时间被改变了即可,延时函数改变之后并不影响UCOS使用!!!不知道会不会有副作用,反正我是这么改了,暂时没出现什么问题,想要的效果也达到了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-12-17 18:49:36 | 显示全部楼层
你是觉得传输速度低了?
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
 楼主| 发表于 2016-12-19 09:33:33 | 显示全部楼层
本帖最后由 yangkefeng 于 2016-12-19 09:38 编辑
正点原子 发表于 2016-12-17 18:49
你是觉得传输速度低了?

嗯    我是觉得如果连续发送两帧中间需间隔1ms接收,那么以太网100M的意义就不大了,我在想局域网PC之间的数据传输那么快是怎么做到的。@zuozhongkai
求指导!!!兄弟
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-12-19 09:48:36 | 显示全部楼层
yangkefeng 发表于 2016-12-19 09:33
嗯    我是觉得如果连续发送两帧中间需间隔1ms接收,那么以太网100M的意义就不大了,我在想局域网PC之间 ...

程序中对于接收数据的处理很影响网速!STM32就是个单片机,100M只是说支持100M的硬件,我电脑还支持1000M以太网,但我我两台电脑直接传输文件最大也就十几M!要想网速快那就换芯片。
开往春天的手扶拖拉机
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
 楼主| 发表于 2016-12-19 09:51:51 | 显示全部楼层
本帖最后由 yangkefeng 于 2016-12-19 09:52 编辑
zuozhongkai 发表于 2016-12-19 09:48
程序中对于接收数据的处理很影响网速!STM32就是个单片机,100M只是说支持100M的硬件,我电脑还支持1000M ...

OSQPend(m_box->pQ,(u16_t)ucos_timeout,&ucErr);//请求消息队列,等待时限为ucos_timeout

这个是不是真的需要1ms啊   能更小吗,改变单个节拍的时间可行吗
求指导!!!兄弟
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 04:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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