STM32H7+UCOSIII+LWIP踩坑记录

   日期:2020-09-25     浏览:222    评论:0    
核心提示:STM32H7+UCOSIII+LWIP踩坑记录主要功能:单片机作TCP服务器实现PC端多客户端连接单片机,并发传输数据。坑点1、优先级问题:一个客户端连接就创建一个线程,优先级由高到低递减,即先连接上的客户端线程优先级高于后连接上的。这样虽然传输速率慢的时候也能发能收,但是,当传输速率加快的时候就会出现一个问题:高优先级的线程会一直抢占CPU的控制权,导致低优先级线程丢包甚至断开连接。可能有人会想到给每个线程尾部加个系统延时让线程执行完之后挂起一段时间,以达到让出CPU控制权。这样确实能达到一定的效

STM32H7+UCOSIII+LWIP踩坑记录

主要功能:单片机作TCP服务器实现PC端多客户端连接单片机,并发传输数据。

坑点1、优先级问题:
一个客户端连接就创建一个线程,优先级由高到低递减,即先连接上的客户端线程优先级高于后连接上的。这样虽然传输速率慢的时候也能发能收,但是,当传输速率加快的时候就会出现一个问题:高优先级的线程会一直抢占CPU的控制权,导致低优先级线程丢包甚至断开连接。可能有人会想到给每个线程尾部加个系统延时让线程执行完之后挂起一段时间,以达到让出CPU控制权。这样确实能达到一定的效果,丢包率也可能有所降低,但是治标不治本,下一个坑点就是延时的问题。最好的解决办法是将所有客户端线程固定在同一个优先级下,UCOSIII是支持多个任务共用一个优先级的。
坑点2、线程延时调度问题:
上面说到给线程加上延时调度确实能够降低丢包率,但是丢包的现象依然存在,可能有人连接两个或三个客户端并发通信都没有问题,但你可以试试连五个六个,丢包现象就会很明显了。另外延时会造成通信效率降低。那最好的办法还是去掉延时。不过之前用过F4的芯片实现同样的功能时,去掉延时会造成程序卡死,具体原因当时没有去深究,估计也是优先级的问题,当时的线程优先级还是采用由高到低的方式。这次用H7改成同等优先级去掉延时之后没有卡死的现象,并且通信效率也提高了,丢包现象几乎不存在。UCOSIII里有个概念叫时间片调度,其作用是让同等优先级任务执行完n个片段之后主动让出CPU使用权。n在OSTaskCreate()创建任务时可以设置。单个时间片时长也可以通过下面的宏定义设置。
#define OS_CFG_TICK_RATE_HZ 1000u
这个宏定义跟系统时间有关,修改后会改变时间函数例如延时等跟时间有关的函数的单位值,一般不建议修改这个,保持默认即可。
下面截一张通信图放上来,目前四个客户端同时连接并发传输读取ModbusTCP数据区0 err。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服