zynq ucos lwip echo sever优化版

2016-07-28 21:53 阅读 1,012 次 评论 5 条

在上一日志MicroZed ucos lwip echo server测试中,测试时cpu使用率为100%,这次想通过在tcptest_task任务中,增加OSTimeDlyHMSM函数,延时一下250ms,正好与fasttmr和slowtmr相对应,然而在运行时会出现“unable to alloc pbuf in recv_handler”的错误信息,如下图

clip_image002

跟踪代码,void setup_rx_bds(xemacpsif_s *xemacpsif, XEmacPs_BdRing *rxring)运行出错,上级调用为void emacps_recv_handler(void *arg);

emacps_recv_handler(void *arg)中XEMACPS_RXSR_OFFSET的值为0或1。

image

即出现buffer description中对应buffer没有空闲的,还会有"Receive buffer not available"信息提示。

在XEmacPs_BdRingFree(rxring, bd_processed, rxbdset);

通过bd_processed生成的数据太多,在setup_rx_bds分配缓存溢出。

XEMACPS_ISR的寄存器中相关接收部分定义如下:

clip_image002[4]

在Int中断中,经常会接收到中断状态为0x4或0x6的标志,从而进入void emacps_error_handler(void *arg,u8 Direction, u32 ErrorWord)函数,而再调用emacps_recv_handler,在接收溢出的情况下,会生成大量的bd_processed,从而使分配不到内存。

clip_image004

通过几天的跟踪调试,感兴趣的童鞋可以看看折腾过程zynq下ucos lwip优化debug过程,最后联想到在通过持续占用cpu的方式能够正常运行,怀疑是否OSTimeDlyHMSM函数延时太多,造成接收处理过慢,使接收buffer不能及时释放,减少延时到1ms,再次运行程序,基本能够正常运行。

通过cmd ping指令与网络调试助手同时测试,运行大约10min,能够正常运行echo server,下图为运行时截图。

image

现在ucos系统配置为cache、mmu均配置且使能的情况下,Xil_DCacheDisable();关闭dcache。

同样使用1ms的延时查询网口输入状态,cpu使用率如80%左右,如下

clip_image002[6]

后又尝试在ucos系统配置使,不配置cache、mmu,不使能cache、mmu,在运行程序中也不需要Xil_DCacheDisable();关闭dcache。 此网口可以正常运行,且运行时的cpu占用率为2%左右,如下图

image

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:zynq ucos lwip echo sever优化版 | 起点博客
分类:应用笔记 标签:, , ,

发表评论


表情

  1. 苏朕
    苏朕 【队长】

    您好,我也遇到了运行lwip栈CPU使用率过高的问题,文中您提到的解决方法“不配置cache、mmu,不使能cache、mmu,在运行程序中也不需要Xil_DCacheDisable();关闭dcache。 ”具体操作是怎么做的呢,是在BSP中修改配置么?研究了两天没有解决,希望您能不吝赐教,谢谢。

  2. will
    will【站长】

    这个在ucos的bsp中可以配置,也可以直接调用Xil_DCacheDisable()函数;关闭dcache。

  3. 苏朕
    苏朕 【队长】

    您好,谢谢您的回复,直接调用Xil_DCacheDisable();是可以正常通信,但是CPU占用率达到了86%,您博客中提到的CPU占用率降到2%是怎么实现的呢?

  4. will
    will【站长】

    在ucos bsp属性中有选项可以配置,手头没有sdk,现在看不了,晚些邮件回复你。

  5. 苏朕
    苏朕 【队长】

    您好,按照您的方法,CPU使用率降到了1%,但是不能正常通信了,帮帮忙啊