STM32H7+UCOSIII+LWIP踩坑记录

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。
在这里插入图片描述

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
你好!关于在STM32H743上移植UCOSIII和LwIP的问题,我可以为你提供一些指导。首先,确保你已经在STM32H743上成功运行了UCOSIII。如果还没有,请先完成UCOSIII的移植。 接下来是移植LwIPLwIP是一个轻量级的TCP/IP协议栈,适用于嵌入式系统。以下是在STM32H743上移植LwIP的一般步骤: 1. 首先,确保你有LwIP的源代码。你可以从官方网站(https://savannah.nongnu.org/projects/lwip/)下载最新版本的LwIP。 2. 在你的工程中添加LwIP的源文件和头文件。将LwIP的源代码文件夹中的所有.c文件和.h文件添加到你的工程中。 3. 配置LwIP。在LwIP的源代码文件夹中,有一个名为"lwipopts.h"的文件,其中包含了许多配置选项。根据你的需求,修改这些选项。例如,你可以配置网络接口、IP地址、端口号等。 4. 实现适配层函数。LwIP需要一些适配层函数来与硬件进行通信,例如发送和接收数据帧。你需要根据硬件平台的特性实现这些函数。具体实现方法可以参考LwIP的文档和示例代码。 5. 初始化LwIP。在你的代码中调用LwIP的初始化函数,例如"lwip_init()"。这将初始化LwIP协议栈并启动相关的任务。 6. 编写应用程序。使用LwIP提供的API,编写你的应用程序。例如,你可以使用LwIP的socket API来实现TCP或UDP通信。 注意,以上步骤只是一个概述,实际的移植过程可能会因具体的硬件平台和需求而有所不同。建议你查阅相关的文档和示例代码,以便更好地理解和完成移植过程。 希望以上信息对你有所帮助!如果还有其他问题,请随时提问。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值