本帖最后由 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()中解析消息邮箱数据等。具体应该怎么做呢?求助!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
程序中对于接收数据的处理很影响网速!STM32就是个单片机,100M只是说支持100M的硬件,我电脑还支持1000M以太网,但我我两台电脑直接传输文件最大也就十几M!要想网速快那就换芯片。
一周热门 更多>