CN / EN
CN / EN

提问

获得支持

您的项目私密技术问题如需获得一对一支持,请点击下方联系我们。

ble_gatts_noti_ind 高速连续收发造成内存泄漏 GR551x

141****com

2021-11-18 19:12

目前使用gr5515做一个无线遥控设备,需要实时上报数据(一帧数据在20bytes以内),频率最大为200Hz,开启4个characteristic,用freeRTOS,heap总大小为48.

开机后调用xPortGetFreeHeapSize()获取剩余内存数为37144上下

当开启第一个char时内存可以依旧稳定在 37144,但是当开到第三个char时内存开始线性下降,最后在几十到几百之间徘徊。

最多在五分钟后系统死机,并且当剩余heap内存开始降低时(例如降低到 20000左右 )断开连接(gr5515端也得到通知连接断开了),但是此时内存将会一直维持在20000左右,不会恢复到最开始的37000.

请问是否是ble_gatts_noti_ind这个方法有内存问题(使用malloc后等待主机端读取到数据再进行free),由于是高速场景,是否有直接notify到主机的办法。

另外可以确定是由于ble_gatts_noti_ind这个函数造成的,将该函数注释掉,传感器上报高速数据,并其余相关逻辑操作,内存数不会大幅度下降。

0收藏

0赞成

lim****com

2021-11-22 17:27

Hi

了解下 “ 开启4个characteristic,用freeRTOS,heap总大小为48.“ 这个是指打开对端的四个属性的notification 功能吗? heap 大下对应的task 是指 notification 的发送任务heap heap 大小吗?

1) ble_gatts_noti_ind 接口不使用OS的heap 资源分配内存, 该接口与OS的heap 没有关系。该接口使用的内存是分配在协议栈的heap 空间之中,协议栈的heap 是在协议栈初始化时注册的。

2) ble_gatts_noti_ind 接口不存在内存问题,并且此接口就是用于发送notification 的直接方法。

当 ble_gatts_noti_ind 分配资源时会先检查协议栈中的heap 中的空间是否足够,如果内存不足,直接返回资源不足错误;否则,分配协议栈的heap 资源,发送完成的之后,释放对应的协议栈heap 资源。

3)关于FreeRTOS 中heap 资源使用率高的问题,请分析下是不是由于调用了 ble_gatts_noti_ind 导致OS 的heap 资源没有及时释放?比如发送时申请的内存是否在发送后都释放了?


谢谢!


0条评论

0赞成

0收藏

您的评论

天狼无星

汇顶员工
2021-11-22 17:35

这个应该是应用层内存管理策略出了问题,跟 ble_gatts_noti_ind 这个接口本身并没有关系。可否详细描述下,应用层是怎么管理数据内存的申请和释放的呢?

0条评论

0赞成

0收藏

您的评论

141****com

2021-12-01 14:05

最新进展

在蓝牙初始化时开启一个二进制信号量,在发送结束时的调用的app_gatts_ntf_ind_cb函数以及打开订阅中post掉:

```

app_driver_sem_post(notify_sem[notify_uuid_index]);

```

在发送时

```

if(app_driver_sem_pend(notify_sem[notify_uuid_index], 0) == APP_DRV_SUCCESS) { error_code = ble_gatts_noti_ind(conn_idx, &send_cmd); }

```

即可解决该问题

另外应用中就是主机端连接并开启订阅后一直发送数据,在一个task中

而且我再强调一点:

当内存溢出后主机端断开连接,内存占用依旧存在,但是task的剩余heap在过程中是一直没什么变化的,变化的是总的剩余heap

0条评论

0赞成

0收藏

您的评论

天狼无星

汇顶员工
2021-12-10 16:32

ble的sdk和协议栈是不会用到freertos所分配的heap的,freertos所分配的heap只是会用在app层。所以这个内存泄露的问题还需要查看下应用层的逻辑。

此外,ble的callback是在中断里面进行回调的,如果在callback中有调用freertos的api,则需要使用带fromISR的api。并且在callback中操作freertos的信号量似乎也是会有问题的。

0条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注