fhqmcu
fhqmcu - 认证专家

注册于 1 year ago

回答
8
文章
0
关注者
4

下载使用最新版本的协议栈,或者去我的https://github.com/longtengmcu/kawaii-mqtt仓库下载,原来老版本的程序在断网多次重连的情况下存在内存耗尽的问题

at组件使用4G模块联网,已经在正式产品上使用过,组件未发现有内存泄漏的。应用层程序使用过非阻塞socket编程的示例程序,这段程序有内存泄漏的代码,修改后就可以。

把应用程序的tcp线程的堆栈调整到4096。看我发的帖子,有关于网络这部分测试发现的一些问题,可以参考对照一下。

程序其他地方有内存泄露,意外修改了这个信号量的数据空间

用keil编译一下试试,gcc环境有时能编译出来bin,但是有可能不对。

kawaii mqtt目前已经经过24小时的连续运行,联网稳定,并且之前发现的内存泄漏问题,没有再出现,内存使用十分稳定。最近正在编写测试软件,测试大数据量发送给mqtt设备的情形。应个别网友想测试mqtt协议的要求,我将近期发布修改后的mqtt软件包 github下载链接,请关注这个帐子或我的GitHub:https://github.com/longtengmcu

@ andychen, 改版后,这个帖子中原来的内容显示不全了,少了一部分。

新改版的社区,显示出来的帖子内容变少了,丢失了一部分呀。@管理员

目前mqtt协议,已经发现并且解决7处bug, 并且解决完成,初步测试稳定工作。正在进行长时间的稳定性测试,有需要的朋友可以与我联系,提供修改后的代码一起验证测试。待测试稳定后,提交给pr给杰杰。

1、platform_thread.c函数中的创建线程,删除线程的方式存在使用已经释放的内存的问题,修改platform_thread_init函数内部采用rt_thread_creat方式创建 ,线程释放时调用的platform_thread_destroy函数置空线程指针就可以了, 已经修改

2、mqtt_send_packet函数内部已经对timer变量进行了初始化和操作,把timer变量内置为此函数的局部变量,相关外部调用不用初始化, 有一个个例的地方:mqtt_connect_with_results函数的第1005 1008行发送包和接收包函数都会使用同一个connect_timer,这里要求此变量外置。 已经修改

3、platform_timer_init(&timer);
platform_timer_cutdown(&timer, c->mqtt_cmd_timeout);这两个函数都是对同一变量进行赋值,建议去除第一个函数,已经修改,删除第一个函数 已经修改

4、mqtt_connect_with_results,内部申请的发送与接收缓冲区放到mqtt_lease函数中进行。解决多次重新连接导致的内存泄漏
连接失败时,不执行释放platform_memory_free(c->mqtt_network),方便下次接着使用。
1025行启动函数只执行一次就可以,删除下和行的。
增加创建线程失败的打印,位于1031行,同时断开链接 已经修改完成

5、ack list链表的写入访问采用c->mqtt_write_lock信号量来进行保护, mqtt_publish_packet_handle函数中的调用mqtt_ack_list_record未进行保护?已解决

6、mqtt_ack_list_unrecord函数对链表的操作没有被c->mqtt_write_lock进行保护?这是为什么 已解决

7、mqtt连接断开再重连时,出现内存耗用增加64字节-128字节不等的情况。这时由于断开重新连接网络后mqtt_subscribe函数重新订阅,申请的内存导致的,这里的链表的处理导致内存泄漏了。 已解决。

图片上传不了呀,说明一下内存用尽的位置:mqtt_connect_with_results()函数在重连过程会多次调用,函数的952行会申请写读内存区,这样会导致不断的申请内存直接到内存耗尽。目前我正在仔细阅读你的代码逻辑,分析解决办法,我的微信:longtengweixin,如要详细了解情况可以加我微信。

2、 mqtt_yield_thread线程在重连网络时或其他异常的情况,不释放CPU时间,导致低优先级的任务没法运行。
目前我正在查看代码解决问题。 如果你有时间的话也看看代码是不是存在此问题?

杰杰 发表于 2020-6-21 22:38
每个函数都有返回值的,根据返回值做成判断即可,关于代码实现的机制,可以参考:https://github.com/jie ...


杰杰,你好,这几天测试你的mqtt协议,初步发现2个问题,正在解决中...使用正点的F429,阿波罗开发板,使用网线连接以太网。1、内存耗尽问题:程序连接上onenet平台后,断开网线后,mqtt协议显示连接断开,并且进行重连,由于代码在发现网络断开后,只是进行网络的重新连接,并没有释放申请的内存资源,导致再次连接时还会新申请比如下图

杰杰 发表于 2020-6-21 22:14
是我的荣幸啊哈哈哈哈哈


客气了,向你学习。我一般都是先把整个软件的包的机制代码弄明白再商用。目前刚看了遍MQTT协议,代码目前还没有看完,碰到大神在线直接问一下,软件包提供mqtt连接断开的状态回调函数或接口么?应用层时需要获取连接的状态来控制联网指示灯。

赞,最近正在研究你的mqtt,准备商用一把。

问题原因只有这3点:1、进入应用程序前要先关闭中断,2、进入应用程序后,应用程序要重新设置中断向量表的起始地址为应用程序的地起始地址 3、此时的应用程序在编译时必须修改分散加载文件的rom起始地址,不能还是原来的不带uboot运行时的地址。

发布
问题

分享
好友