外围角色,设置堆是9k,可连接数3,开始时蓝牙连接发送数据都正常,但运行一段时间后,百分之一左右的设备就出现蓝牙只能连接,找不到任何服务UUID了,专门针对一台设备,进行上百次的反复连接发送数据断开也会出现只能连接发现不了任何服务。1)不知是不是堆溢出问题?还是别的原因?有没有主动释放所有堆占用的分配?看了例程,GATT_bm_alloc申请的空间,只有相应功能不成功时才会释放空间,那成功了如何释放?2)有没有办法监测到找不到服务异常?若能监测到,重启就行了。
如果是主机,查看回连的时候,枚举服务的函数的返回值是否为成功,如果出现0x16的报错可以重复枚举。
如果是从机,用BLE调试助手跟该从机连接并查看枚举的服务。
谢谢,以下是我抓的日志,一个是connect和另一个toolbox
你上面截图的是芯片作为从机,跟手机主机建立连接的枚举。
建议:
①抓包需要通过抓包工具获取,即使用BLE分析仪。淘宝官方店可以购买。
②直接使用例程测试对比是否可以枚举,然后排查你的代码跟例程的区别。
芯片是作为从机模式,现在问题不是一开始就枚举失败,而是上百次的连接发送断连才出现的(重现率基本100%),这里面明显与次数相关的,原因应是内存空间的溢出,或UUID的初始化参数有误(按理一上电就不行),或SDK有bug。我现在解决是从Connected到PHY更新事件之间加入了时间限制,超10秒就重启。若按你说的工具抓包,发现问题点后,也要在SDK的API上实现,我查看了所有涉及堆空间的API或参数,没有看到对堆空间有有效管理的API。至于例程,例程流程比较单一,很难出现类似问题。如果有对堆内存有影响API或涉及UUID初始化可能引起类似问题的参数,请提示下,谢谢!
暂未出现过类似的问题。
内存的占用函数:
(适用非固定库OTA的代码)启用一个TMOS事件,每隔一段时间打印一下协议栈ram余量:
PRINT("memory_len = %d\n",tmos_memory_getlen());//tmos_memory_getlen()这个接口头文件里没有,调用前声明一下
确认一下是否出现手机无法枚举的情况后,再次断开连接也无法枚举,还是偶现无法枚举。
可以换一个BLE调试助手APP测试。
哦,好的,谢谢!1)我用这个观察下,但非固定库有点不是特别理解,我现在OTA包是不包括库文件的,不知适不适用?2)无法枚举后,断开链接,也无法枚举了,放置了两天都没有恢复,只有重启。
如果是用的固定库方式,无法通过该函数获取。
根据你的描述,出问题之后是一直出现问题,此时可以用其他手机连接该从机试试看。并且看起来是代码层面的问题。通用的例程和其他开发产品并未出现过类似情况。
可以发送邮件至lpc@wch.cn,我们这里进行查看问题。