This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2340R5-Q1:CC2340R5-Q1:外设未能响应 Exchange MTU 请求

Guru**** 2694555 points

Other Parts Discussed in Thread: CC2340R5-Q1, CC2340R5

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1588211/cc2340r5-q1-cc2340r5-q1-peripheral-device-fails-to-respond-to-exchange-mtu-request

器件型号: CC2340R5-Q1
主题中讨论的其他器件: CC2340R5

我们已经使用 CC2340R5-Q1 开发了外围器件。 在正常情况下、它会与我们的 BLE 中央器件正确通信。 但是、在运行数天或数周后(由于问题的间歇性性质,确切的时间不明确)、外围设备将停止响应 Central 的 Exchange MTU 请求。

在外围设备上执行电源重置可暂时解决此问题。

附件是我们中央器件的 Bluetooth .pcap 捕获结果、显示了正常行为和故障情况。

image.png

【正常连接】

 

image.png

[故障 MTU 请求交换]

 

此外、这也是我们外设的存储器使用情况

谢谢你。  此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我很抱歉耽误你的时间。 是否在每个设备上都有足够的时间出现这种情况?还是仅在受影响的设备的特定子集出现这种情况? 您能分享一下您正在使用的 SDK 版本吗?

    此致、

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jan、

    目前、我们的几个 CC2340R5 器件在运行一段时间后、会出现该问题。

    我们使用的是 simplelink_f3_SDK_8_40_00_61 SDK。

    此致、

    Chandra

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Chandra:

    感谢您分享 SDK 版本。 问题是仅发生在那些已识别的设备上、还是所有设备都有足够的时间? 对于提供的堆栈/存储器屏幕截图、该行为发生后的状态是否正确?

    此致、

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jan、

    目前、我们使用的几个远程无钥匙设备在激活一段时间(几周或几个月)后会出现此问题。 但是、我们认为、如果让所有器件运行足够长、该问题最终可能会出现在所有器件上。

    我分享的堆栈/内存屏幕截图显示了任务运行时的默认堆条件、而不是问题发生时的状态。

    此致、
    Chandra

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jan、

    我在调试过程中发现内存泄漏、这可能会影响外设和中央器件之间的 BLE 连接。 以下是观察数据的摘要。

    摘要
    - 分钟 0: 初始堆: 2160 b. (闪烁后,与 Central 配对前)。   


    - 分钟 1: 配对后:堆下降到 1856 B 。 外设启动 广告 、然后与 Central 通信 5 秒 可以通过通知发送多个数据。   



    - 分钟 2: 在连接/通知期间:发送通知时堆暂时减少、然后成功返回 1856 B 。   



    - 分钟 7: 它仍成功返回 1856 B 发送通知后。   



    - 分钟 16: 堆永久下降到 1728 B ( 泄漏 开始出现)。   


    - 第 17–25 分钟 : Heap 进一步下降到 1536 B 并且不再返回 1856 B 。   



    ##注释
    -在我的应用程序中,我只使用 malloc 在 RNG、AES-CCM 和 ECDH 初始化期间执行。 除此之外、我不会将内存分配到其他位置。

    ##问题
    - BLE SDK 中的某些进程可能有分配内存但无法释放内存的处理程序或函数吗? 我注意到许多与 BLE 相关的功能在内部使用 malloc

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    感谢您的深入分析! 这是非常有帮助的! 设备在 7 到 16 分钟之间有什么作用? 设备是否仍处于连接状态并正在发送通知? 在此期间发生了哪些 BLE 操作?

    此致、

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jan、

    在此期间、外设每 5 秒广播一次以重新连接到中央器件。 发送所需数据后、它立即断开连接并进入睡眠状态、然后在 5 秒后再次唤醒并重复该过程。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    明白。 感谢您的确认。 您能否共享发生 LINK_RESTED 和 LINK_END 事件时执行的代码? 您还能分享数据传输代码吗?

    此致、

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    感谢您的分享。 我无法在您分享的代码中看到任何泄漏可能来自哪里。 您正在正确处理通知的分配和取消分配。 您能否分享  eventBleConnection 变量是什么以及这些事件回调的作用?

    此致、

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    感谢您分享这些功能。 我看到了一些自定义函数。 您是否能够通过电子邮件私下共享整个项目?

    此致、

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jan、

    请将您的电子邮件地址发送给我。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我很抱歉耽误你的时间。 我看到您的 FAE 发送了该项目。 让我们通过电子邮件继续讨论。我为延误道歉,上周我们有美国假期。

    此致、

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jan、
    我正在使用数据流示例通过 BLE 发送通知。
    为什么该功能会在状态时阻止 bleNoResource

    如果我添加一个、就可以了 休息 while耦合到环路内bleNoResource
    我的应用程序可能会卡在该功能中。



    ```μ s
    /************************************************************************************
     *@fn   dss_sendNotification
     *
     *@  通过 BLE 通知传输数据。
     *
     *@param  pValue — 指向要写入的数据的指针
     *@param  len — 待写入数据的长度
     *
     *@返回 成功,或堆栈调用状态
     */
    static bStatus_t DSS_sendNotification (uint8 *pValue、uint16 len)

      bStatus_t STATUS =成功;
      gattAttribute_t *pAttr = NULL;
      attHandleValueNoti_t Noti ={ 0 };
      linkDBInfo_t connInfo ={0};
      uint16 offset = 0;
      uint8 i = 0;

      //验证输入参数
      if (pValue == NULL)
      {
        返回 (INVALIDATION PARAMETER);
      }

      //找到特性值属性
      pAttr = GATTServ App_Find 属性 (dss_attrTbl、GATT_NUM_ATTRS (dss_attrTbl)、
                     &DSS_dataOut_val);
      IF (pAttr!= NULL)
      {

        //检查每个 BLE 连接的 CCC 值
        对于 (I = 0;I < MAX_NUM_BLE_CON;I++)
        {
          gattCharCfg_t *pItem =&(dss_dataOut_config[i]);

          //如果连接已注册通知
          if ((pItem->connHandle!= LINKDB_CONNECNHANDLE_INVALID)
              &&(pItem->value =GATT_CLIENT_CFG_NOTICE)
          {
            //找出每个连接的最大 MTU 大小
            status = linkDB_getinfo (pItem->connHandle、&connInfo);
            偏移= 0;

            while (status != bleTimeout && status != bleNotConnected
                && len > offset)
            {
              //确定分配大小
              uint16_t allocLen =(len - offset);
              if (allocLen >(connInfo.MTU - DSS_Noti_HDR_SIZE))
              {
                //如果 len > MTU 将数据拆分为 MTU 大小的块
                allocLen = connInfo.MTU - DSS_NOti_HDR_SIZE;
              }

              Noti.len = allocLen;
              Noti.pValue =(uint8*) GATT_BM_alloc (pItem->connHandle、
              ATT_Handle_Value_Noti、
                                 allocLen、0);
              if (Noti.pValue!= NULL)
              {
                //如果分配成功、请复制数据并发送
                memcpy (Noti.pValue、pValue + offset、Noti.len);
                noti.handle = pAttr->handle;

                //通过 BLE 通知发送数据
                状态= GATT_Notification (pItem->connHandle、&Noti、
                错误);

                //如果无法发送数据、则释放分配的缓冲区并返回
                if (status != success)
                {
                  GATT_BM_FREE ((gattMsg_t*)&Noti、
                  ATT_Handle_Value_Noti);

                  //发送通知失败、打印错误消息
                }
                暴露
                {
                  //递增数据偏移
                  Offset += allocLen;
                }
              }
              暴露
              {
                status = bleNoResources;
              }
            }//结束时间
          }
        }//结束于
      }// IF 结束

      //返回状态值
      故障分析 (STATUS);
    }
    ```μ s

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    返回 bleNoResources 状态、并且由于缺少 MTU、堆或可用时隙、BLEstack 无法调度 API。 您应该能够添加逻辑、以便在看到该返回代码时稍后尝试重试。

    此致、

    1 月