CN / EN
CN / EN

提问

获得支持

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

反复复位 蓝牙服务初始化不成功

157***568

2022-05-14 09:01

请问一下 反复复位 蓝牙服务初始化不成功 有什么好的解决办法,或者查找问题的方法,具体信息如下:

sdk16.10 版本 主控GR5515IOND 。

经反复复位重启 出现蓝牙协议初始化不成功:返回错误码0x10,测试多种情况均有此情况。

1,重启之后自动连接蓝牙 定时器到时间 直接使用hal_nvic_system_reset();

2,重启之后自动连接蓝牙 定时器到时间后 拉低片子硬件chip_en ,

3,重启之后不自动连接蓝牙 定时器到时间后直接调用 hal_nvic_system_reset()。


具体log 如下():


0收藏

0赞成

lim****com

2022-05-20 14:24

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

参考如下:

以上,

0条评论

1赞成

1收藏

您的评论

157***568

2022-05-14 09:16

出现的概率 大概1/1000

0条评论

0赞成

0收藏

您的评论

Ping

汇顶员工
2022-05-14 11:43

麻烦参考如下方法,把协议栈日志也打印输出下,谢谢!

如何开启BLE协议栈日志打印

0条评论

0赞成

0收藏

您的评论

157***568

2022-05-17 15:05


上面这分log 是已经打开了 协议栈日志了。后面初始化服务的时候报错了。




下面是上一次成功 信息


0条评论

0赞成

0收藏

您的评论

天狼无星

汇顶员工
2022-05-18 14:53

你好,从你提供的日志信息中,我没有看到协议栈有报错的地方。以下截图部分应该是app层打印的信息,没有理解到底是啥意思,请把这里打印error的代码发出来看下?


0条评论

0赞成

0收藏

您的评论

157***568

2022-05-19 10:39

下面是配置文件







麻烦您了。

0条评论

0赞成

0收藏

您的评论

lim****com

2022-05-19 20:24

hi 你好!

1. 以下是我们示例工程实现, 不知道是否与你那边实现一致?。err code 返回的是ble_client_prf_add 的结果。


2. 如果返回err 是 ble_client_prf_add 的结果。0x10 表示是资源不足。看配置设置支持6个prf,正常添加prf 不超过6个,不会出现此结果返回。

怀疑点:可能内存被踩。

需要进步定位:出问题时读取内存 0x008022e8 地址 32字节数据,资源不足时前4个字节的数据与正常的应该不一致。

复现后,请提供下以上信息,进步定位下。


谢谢!


0条评论

0赞成

0收藏

您的评论

157***568

2022-05-20 13:31

第一个是不正常的,看着被清0了,后面是正常的。有啥办法知道怎么被清掉的么


0条评论

0赞成

0收藏

您的评论

best

2022-11-08 10:14

调试方法:协议栈初始化完成之后,添加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工程。

0条评论

0赞成

0收藏

您的评论

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

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

扫描关注公众号

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