嵌入式技术论坛
直播中

张强

7年用户 1366经验值
私信 关注
[问答]

请教一下大神ec200x内存泄露是何原因呢?

项目使用STM32L431,rtthread版本4.1.0,开启ec200x网络,使用at组件进行网络通信,经常需要将ec200x模块关闭再打开,代码示意如下:


while(1){
    ec200x_init(device); 初始化ec200,开启网络功能
    //联网通信发送。(经过验证,网络传输这一块代码没有内存泄露)
    ec200x_deinit(device);关闭ec200,关闭ec200x
    //延时
    cmd_free(int argc, char **argv); //执行行ps命令,打印内存使用情况 发现每次循环已使用内存会增加8字节,长期下去会造成内存不够
}
统计每次循环中打印free命令,内存的使用情况,可以看出每次循环一次增加8字节内存


used    : 24412
used    : 24420
used    : 24428
used    : 24436
used    : 24444
used    : 24452
used    : 24460
used    : 24468
used    : 24476
used    : 24484
used    : 24492
used    : 24500
used    : 24508
used    : 24516
used    : 24524
used    : 24532
used    : 24540
used    : 24548
used    : 24556
used    : 24564
used    : 24572
used    : 24580
used    : 24588
used    : 24596
used    : 24604
used    : 24612
经过反复验证内存泄露发生在每次ec200x_init和ec200x_deinit这个过程,即每次while循环,用
free命令查看内存使用,每次循环后使用内存固定会增加8字节。内存泄露没有发生在其他
地方,屏蔽掉ec200x_init(device)和ec200x_deinit(device)就没有出现内存逐渐增加的现象。联网发送数据也没有发现内存泄露,应该是ec200x_deinit(device)这个操作中没有释放掉相关资源造成下一次ec200x_init(device)中又重新分配了资源,不知道在代码中哪儿没有释放。

回帖(5)

王秀兰

2023-5-17 11:25:47
问题出在:

at_obj_set_urc_table(device->client, urc_table, sizeof(urc_table) / sizeof(urc_table[0]));
举报

王刚

2023-5-17 11:25:56
对的,每次增加urc_table都会加长列表
举报

张强

2023-5-17 11:26:08
怎么解决呢,需要在哪儿释放掉吗,感觉不大好处理这儿。每次都股固定增加8字节。
1.jpg
没有提供一个ec200x_socket反初始化的函数,在关闭的时候反初始化一下释放掉资源,每次开机的时候正初始化
举报

王刚

2023-5-17 11:26:15
增加个ec200x_socket_deinit,将urc_table释放,长度清零
1.jpg
2.jpg
举报

张强

2023-5-17 11:26:23
厉害厉害,解决了,内存不再泄露了。

total   : 110240
used    : 19720
maximum : 20864
free information
total   : 110240
used    : 19720
maximum : 20864
free information
total   : 110240
used    : 19720
maximum : 20864
free information
total   : 110240
used    : 19720
maximum : 20864
举报

更多回帖

发帖
×
20
完善资料,
赚取积分