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

2019-07-20 18:01发布

本帖最后由 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 ",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()中解析消息邮箱数据等。具体应该怎么做呢?求助!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
yangkefeng
1楼-- · 2019-07-20 21:14
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-07-20 21:21
 精彩回答 2  元偷偷看……
yangkefeng
3楼-- · 2019-07-21 01:22
本帖最后由 yangkefeng 于 2016-12-19 09:38 编辑
正点原子 发表于 2016-12-17 18:49
你是觉得传输速度低了?

嗯    我是觉得如果连续发送两帧中间需间隔1ms接收,那么以太网100M的意义就不大了,我在想局域网PC之间的数据传输那么快是怎么做到的。@zuozhongkai
taizonglai
4楼-- · 2019-07-21 04:44
yangkefeng 发表于 2016-12-19 09:33
嗯    我是觉得如果连续发送两帧中间需间隔1ms接收,那么以太网100M的意义就不大了,我在想局域网PC之间 ...

程序中对于接收数据的处理很影响网速!STM32就是个单片机,100M只是说支持100M的硬件,我电脑还支持1000M以太网,但我我两台电脑直接传输文件最大也就十几M!要想网速快那就换芯片。
yangkefeng
5楼-- · 2019-07-21 05:30
本帖最后由 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啊   能更小吗,改变单个节拍的时间可行吗