STM32直连PC,使用FreeRTOS+LWIP,用Cube生成并不修改任何参数,只做以太网,其他任何都不做,发现还是丢包.官方板STM32F407 DISCO.因为直连方式,只考虑10ms的超时,大于10ms基本可以认定为丢包.因为如果过了路由,远远比这个要大.
测试1:32字节,1万次传输,正常PING大小.丢包率0.04%.平均Ping延迟1.58毫秒.
测试2:1024字节,1万次传输,大的数据包,丢包率0.16%.平均Ping延迟2.32毫秒.丢包率已经比最初的大不少了.
测试3:MTU最大大小1472字节,1万次传输,大的数据包,丢包率已经高达1.71%了,平均Ping延迟2.89毫秒.反复测试三次后结果差别不大.
测试4:MTU最大大小1472字节,1万次传输,大的数据包,不分割.不但丢包率一直上升,而且延迟也是越来越大啊.丢包率已经高达4.83%了,平均延迟也超过10ms,而且这是直连,经过路由肯定更多损失.
测试5:经过路由(newifi d1),但是本机经过5G网络相连路由,路由有线连接STM32 ETH,但是只测1000个数据包(因为实在慢),但是1000的大小.先测试下他.
测试6:与测试5一样条件,但是目标是路由自己.
为什么会出现这样的错误,这与处理机制有关.上了系统之后,用了中断方法,还有一个很高优先级的任务.当中断进入HAL_ETH_IRQHandler后,就会给信号量标志,然后高优先级的以太网处理任务就会开始工作,(退出阻塞),看起来是美好的,但是如果信号量添加后,数据处理完之前,那怎么办,加锁机制也不是万全之策,如何使用复杂的缓冲机制,满足需求,或者从软件上避免才是.为什么打开网页不感觉,首先网页就不大,而且TCP是重发机制的.而且STM32本身不是网络专业芯片~ 路由自身速度很快,这个多出来的延迟,大概就是STM32要处理路由广播的一些包~