找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

查看: 10735|回复: 10

[CSR8系列] CSR8670 BLE多次连接失败后程序panic

[复制链接]
连续签到天数:1天
签到总天数:1023天
签到总奖励:12600金币
发表于 2017-9-20 17:46:17 | 显示全部楼层 |阅读模式
悬赏10金币未解决
我的8670是双模的,连接耳机后,会继续scan BLE设备。
而BLE设备发送的是定向广播,如果一个BLE设备匹配的是另外一个8670,那当前的8670可以scan到该BLE设备,但总是连接失败,于是就会反复scan,反复连接。
由于scan到的是ble_adv_event_connectable_directed类型的广播,所以8670会调用ConnectionSmGetAuthDevice函数去查找该设备是否在TDL中,这个函数反复调用多次以后,好像就把堆栈空间耗尽了。当再malloc的时候,就会失败,从而导致程序panic。
个人认为,函数调用过程中malloc的空间,最终都会合理释放掉,不断产生的消息的载荷,最终也都会释放掉,不明白为什么最后就把空间耗尽了?


附:最终产生panic的位置:
  1. static td_data_t *tdl_find_device(
  2.                         uint8                   addr_type,
  3.                         const bdaddr            *addr,
  4.                         uint16                  *pp,
  5.                         uint16                  *pi
  6.                         )
  7. {
  8.     td_data_t *td = (td_data_t *) PanicUnlessMalloc(SIZE_TD_DATA_T);
  9.     one_slot *os = PanicUnlessNew(one_slot); /*每次都在这里panic,无可用空间分配了 */
  10.     uint16 used = 0;
  11.     uint16 pos;
  12.     uint16 idx;
  13.     uint16 max_trusted_devices = MAX_TRUSTED_DEVICES;
  14.    
  15.     read_trusted_device_index(&os->tdi);

  16.     for (idx = 0;
  17.          idx < max_trusted_devices && (pos = os->tdi.order[idx]) != TDI_UNUSED;
  18.          idx++)
  19.     {
  20.         if (PsRetrieve(TRUSTED_DEVICE_LIST + pos, td, SIZE_TD_DATA_T))
  21.         {
  22.             os->dev_taddr.type = unpack_td_bdaddr(&os->dev_taddr.addr, td);

  23.             if (
  24.                 os->dev_taddr.type == addr_type &&
  25.                 BdaddrIsSame(&os->dev_taddr.addr, addr)
  26.                 )
  27.             {
  28.                 /* found our device */
  29.                 goto out;
  30.             }

  31.             /* mark slot as used */
  32.             used |= 1 << pos;
  33.         }
  34.     }

  35.     /* device data not needed anymore */
  36.     free(td);
  37.     td = NULL;

  38.     if (idx < max_trusted_devices)
  39.     {
  40.         /* find first free slot */
  41.         /* we do know that there is a free slot so no need for checking
  42.          * idx < max_trusted_devices */
  43.         for (pos = 0; used & (1 << pos); pos++);
  44.     }
  45.     else
  46.     {
  47.         /* tdl is full, return the last position */
  48.         idx = max_trusted_devices - 1;
  49.         pos = os->tdi.order[idx];
  50.     }

  51. out:
  52.     free(os);

  53.     if (pp)
  54.     {
  55.         *pp = pos;
  56.     }

  57.     if (pi)
  58.     {
  59.         *pi = idx;
  60.     }
  61.    
  62.     return td;
  63. }
复制代码


楼主热帖
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
连续签到天数:1天
签到总天数:54天
签到总奖励:1575金币
发表于 2017-9-20 22:56:19 来自手机 | 显示全部楼层
可以设置8670只是处理白名单中ble设备的广播
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复

使用道具 举报

连续签到天数:1天
签到总天数:1023天
签到总奖励:12600金币
 楼主| 发表于 2017-9-21 08:36:59 | 显示全部楼层
德王 发表于 2017-9-20 22:56
可以设置8670只是处理白名单中ble设备的广播

谢谢。
但是我需要经常更换和8670配对的BLE设备,所以scan→连接这个操作是必须要保留的,也必须可以处理白名单以外的新设备
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复

使用道具 举报

连续签到天数:1天
签到总天数:54天
签到总奖励:1575金币
发表于 2017-9-21 09:02:19 | 显示全部楼层
ConnectionSmGetAuthDevice好像和ble无关
只是在ENABLE_SUBWOOFER/ENABLE_PEER才会用到
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复

使用道具 举报

连续签到天数:1天
签到总天数:1023天
签到总奖励:12600金币
 楼主| 发表于 2017-9-21 09:20:45 | 显示全部楼层
德王 发表于 2017-9-21 09:02
ConnectionSmGetAuthDevice好像和ble无关
只是在ENABLE_SUBWOOFER/ENABLE_PEER才会用到

嗯,ConnectionSmGetAuthDevice是一个通用函数,传统蓝牙和BLE连接时都会用到,就是看远程设备是否已经授权。
当然我的BLE部分其实也可以跳过这个函数:我只要收到合适的广播,不管他是什么类型,也不管有没有授权,反正去连接就好了,大不了就是连接失败而已。
但是例程中处理是要读取授权信息的,我也就照着做了。
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复

使用道具 举报

连续签到天数:1天
签到总天数:1023天
签到总奖励:12600金币
 楼主| 发表于 2017-9-21 09:22:35 | 显示全部楼层
  1. void handle_ble_advertising_report(CL_DM_BLE_ADVERTISING_REPORT_IND_T * ind)
  2. {
  3.     switch(ind->event_type)
  4.     {
  5.         /* If connectable or discoverable, decide whether or not to connect the device */
  6.         case ble_adv_event_discoverable:
  7.         case ble_adv_event_connectable_undirected:
  8.         {
  9.             handle_ble_connectable_discoverable_adverts(ind);
  10.         }
  11.         case ble_adv_event_connectable_directed:
  12.         {
  13.             /* If the advertisement is from a paired device, request to connect it, otherwise ignore as pairing mode is not enabled */
  14.             ConnectionSmGetAuthDevice(&theSink.rundata->bleInputMonitor.task, &ind->permanent_taddr.addr);            
  15.         }
  16.         break;
  17.         case ble_adv_event_non_connectable:
  18.         case ble_adv_event_scan_response:
  19.         case ble_adv_event_unknown:
  20.         {
  21.             BLE_AD_DEBUG(("ble_adv_event_unknown\n"));
  22.         }
  23.         break;
  24.     }
  25. }
复制代码
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复

使用道具 举报

连续签到天数:1天
签到总天数:54天
签到总奖励:1575金币
发表于 2017-9-21 10:21:47 | 显示全部楼层
我用的 4.2 没有这些代码
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复

使用道具 举报

连续签到天数:1天
签到总天数:1023天
签到总奖励:12600金币
 楼主| 发表于 2017-9-21 10:52:45 | 显示全部楼层
德王 发表于 2017-9-21 10:21
我用的 4.2 没有这些代码

source是没有的。
我的BLE代码是从sink复制过来的……
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复

使用道具 举报

连续签到天数:1天
签到总天数:54天
签到总奖励:1575金币
发表于 2017-9-21 15:19:18 | 显示全部楼层
sink ADK 4.2 也是没有的哦
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复

使用道具 举报

连续签到天数:1天
签到总天数:1023天
签到总奖励:12600金币
 楼主| 发表于 2017-9-22 08:19:16 | 显示全部楼层
德王 发表于 2017-9-21 15:19
sink ADK 4.2 也是没有的哦

不知道了,我是用的3.5版本……
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2024-4-16 16:48 , Processed in 0.213093 second(s), 20 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表