157***568
请问一下 反复复位 蓝牙服务初始化不成功 有什么好的解决办法,或者查找问题的方法,具体信息如下:
sdk16.10 版本 主控GR5515IOND 。
经反复复位重启 出现蓝牙协议初始化不成功:返回错误码0x10,测试多种情况均有此情况。
1,重启之后自动连接蓝牙 定时器到时间 直接使用hal_nvic_system_reset();
2,重启之后自动连接蓝牙 定时器到时间后 拉低片子硬件chip_en ,
3,重启之后不自动连接蓝牙 定时器到时间后直接调用 hal_nvic_system_reset()。
具体log 如下():
lim****com
hi 你好。
这里是打印的 0x008022e8 地址的数据吧
问题原因分析:
0x008022e8 地址存放变量记录支持的最大prf 个数,应该是6.
0x008022e9 地址存放变量是记录当前是第几个prf. 记录02 开始,应该是
dfu_service_init也会注册添加prf。
通过 ble_client_prf_add or ble_server_prf_add 都会使
008022e9 记录的个数递增。
当 0x008022e9记录值 >= 008022e8 记录的值时 会返回no resource err.
有以下几点需要进步确认。
1. 这个函数实现里面是不是有注册超过6个prf.
可以搜索 ble_client_prf_add or ble_server_prf_add 确认。
2. 出问题时读取内存信息是有问题的,按说 008022e8 应该是06 (1 字节长度)
继续排查此问题有两个方向:
(1) 第一个是 ble_stack_init 在任务的栈空间执行,需要指定的多大的任务栈空间需要定位,
如果栈空间小的话,可能会踩内存。
(2) 为了避免任务栈空间指定不足可能导致和os 环境相关的问题。我们建议参考freertos 模板工程实现方案,在主栈空间先调用协议栈初始化代码, 其他一次初始化的也可以在主栈先执行,然后启动任务start。
可参考sdk 包中的ble_app_template_freertos
参考如下:
以上,
157***568
出现的概率 大概1/1000
157***568
上面这分log 是已经打开了 协议栈日志了。后面初始化服务的时候报错了。
下面是上一次成功 信息
天狼无星
你好,从你提供的日志信息中,我没有看到协议栈有报错的地方。以下截图部分应该是app层打印的信息,没有理解到底是啥意思,请把这里打印error的代码发出来看下?
157***568
下面是配置文件
麻烦您了。
lim****com
hi 你好!
1. 以下是我们示例工程实现, 不知道是否与你那边实现一致?。err code 返回的是ble_client_prf_add 的结果。
2. 如果返回err 是 ble_client_prf_add 的结果。0x10 表示是资源不足。看配置设置支持6个prf,正常添加prf 不超过6个,不会出现此结果返回。
怀疑点:可能内存被踩。
需要进步定位:出问题时读取内存 0x008022e8 地址 32字节数据,资源不足时前4个字节的数据与正常的应该不一致。
复现后,请提供下以上信息,进步定位下。
谢谢!
157***568
第一个是不正常的,看着被清0了,后面是正常的。有啥办法知道怎么被清掉的么
best
调试方法:协议栈初始化完成之后,添加profile之前,打印0x008022e8 和 0x008022e9寄存器值,客户端该值均为0;正常情况下0x008022e8的值为6,0x008022e9的值为0,比较大的概率为 踩内存问题,将profile prf_num_max 值修改成0;
解决方案:客户原本的做法是在freertos task中初始化BLE协议栈,将 ble_stack_init(&s_app_ble_callback, &heaps_table); 移出到task之前,压测多天不再复现问题,具体参考SDK 的freertos工程。
打开微信,使用“扫一扫”即可关注