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.

[参考译文] CC2640R2F:向 iOS 中央设备发送连接参数更新请求会导致固件挂起

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1409108/cc2640r2f-connection-parameter-update-request-to-ios-central-device-causes-firmware-hang

器件型号:CC2640R2F

工具与软件:

大家好、团队成员:

我在 iOS 中遇到动态连接参数更新请求的问题。  

我正在使用  simplelink_cc2640r2_sdk_5_30_00_03  SDK (BLE4.2)。 默认情况下、我使用以下配置、运行非常好。  

#define DEFAULT_DESIRED MIN_CONN_INTERVAL        60.

#define DEFAULT_DESIRED MAX_CONN_INTERVAL         108.

#define DEFAULT_DESIRED SLAVE_LATENCY              3.

#define DEFAULT_DESIRED CONN_TIMEOUT              600

 

由于我的应用需要实时数据传输、有时我需要以更快的速率传输数据。 以及以下配置参数。

#define DEFAULT_DESIRED MIN_CONN_INTERVAL        12 //15ms

#define DEFAULT_DESIRED MAX_CONN_INTERVAL         24 //30ms

#define DEFAULT_DESIRED SLAVE_LATENCY              3.  

#define DEFAULT_DESIRED CONN_TIMEOUT              600

我使用   GAP_UpdateLinkParamReq  API、以动态修改这些参数。  

我确保所有这些设置均符合 iOS 设计指南。  

在 Android 上一切正常。 但在 iOS 中央版(  iPhone 7 Plus)上,只要调用此 API ,固件就会挂起,设备就会进入无响应模式。 它需要上电复位才能使其工作。  

 

有人知道这里会出现什么问题吗?  

 

好的

Lakshmi

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

    尊敬的社区:

    请查看它。 非常感谢您提供任何帮助。  

    提前感谢。

    好的

    Lakshmi

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

    尊敬的 Lakshmi:

    感谢您联系我们。 您是否可以尝试在器件挂起并共享调用堆栈时暂停器件的执行?

    此致、

    1月

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

    您好、Jan:

    由于出现这个问题本质上是随机的、因此 我无法使用调试器捕获此事件。  

    我需要一些有关如何正确地获得 conn param 更新完成的信息。  

    我正在使用注册回叫  G3074 Role_Register CB4.65 以捕捉事件。 我理想情况下不在该回调中执行任何操作、除非检查参数是否已更新。  

    当我想更新新参数时、我会等待连接建立、然后输入 GAPROLE_CONNECTED 我调用 GAP_UpdateLinkParamReq ()并等待调用回调。  

    但在监听器日志中、我可以看到传感器正在请求多个连接参数更新、即使在首次尝试时已被接受也是如此。  

    我有什么问题吗? 您是否会建议申请连接参数的正确方法?  

    提前感谢。  

    好的

    Lakshmi

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

    您好 Lakshmi、

    您能否确认     执行时返回(bStatus_t)状态(Success、INVALIDPARAMETER、bleIncorrectMode、bleAlreadyInRequestedMode、bleNotConnected)是什么 GAP_UpdateLinkParamReq ()? 此外、您是否可以共享监听器日志来查看?

    BR、

    David。

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

    尊敬的 David:  

    附件是所执行测试的 NRF 监听器日志。  我在检查退货状态时请查看一下。 您将 在13.16时间戳附近找到固件挂起事件。 您可以在 Wireshark 中打开该文件。  

    e2e.ti.com/.../fw_5F00_hang_5F00_wireshark_5F00_log.zip

    好的

    Lakshmi

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

    您好 Lakshmi、

    好的、谢谢。 请允许我明天看看它。

    BR、

    David。

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

    尊敬的 David:

    感谢您的到来。  

    >>您能否确认退货(bStatus_t)状态是什么?  

    我的 GAP_UpdateLinkParamReq 调用始终返回成功。 但我观察到、我的固件大多数时间都没有调用此事件的回调。 因此、新参数未生效。  之后、我的固件最终挂起。 似乎主器件正在接受新的连接参数、但不知何故、固件无法处理这些参数。 我附上了监听器屏幕截图供参考。  

     

    好的

    Lakshmi

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

    您好 Lakshmi

    我明白了。 是否可以使用另一个 IOS 设备(新版本)进行测试? 我可能怀疑问题出在参数上、您能否确认他们在之后实际采用的值是什么 GAP_UpdateLinkParamReq () ? 并将其与 Android 系统进行比较? 也许这可以给我们一个提示。

    BR、

    David。

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

    尊敬的 David:

    我已经在多个版本的 iOS 设备上进行了测试。 问题相同。 Android 有时也会显示这种模式。 我确认我尝试更新的参数在 BLE iOS 指南中可用。 这些是主设备接受的。 请检查我所附的视频。  

    但您可以在该屏幕截图中看到3个背对背连接参数请求、即使我调用也是如此  GAP_UpdateLinkParamReq 一次。  

    有时我在我的应用程序中没有收到 conn param 更新回调、即使它被 Master 接受也是如此。 更新后的参数并没有被我的器件使用。 我怀疑这是导致一段时间后挂起。

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

    尊敬的 David:  

    有任何相关更新? 非常感谢您的任何帮助。 这对我们的项目至关重要。  

    提前感谢。  

    好的
    Lakshmi

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

    您好 Lakshmi、

    很抱歉在此发生延迟、我将使用您分享的修改后的参数在我这边重现此问题、并尽快回复给您。 如果您使用新参数开始连接、固件是否也会挂起?

    我从日志中看到第二个连接更新参数请求、这之后外围设备无响应。 我想问一下、这第二次更新是否会返回到默认参数?

    BR、

    David。

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

    尊敬的 David:  

    如果 使用新参数开始连接、固件不会挂起。  

    有。 第二次连接更新是恢复到默认连接。 在日志中、您可以观察到该文件已被接受。 但很多时候、我没有被调用回调。  

    好的

    Lakshmi。

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

    你好

    通过回调、您的意思是任务 执行 GAP_UpdateLinkParamReq ()之后没有在 gapRole_processGAPMsg ()函数内接收到 GAP_LINK_PARAM_UPDATE_EVENT? 还是 Gassu Role_Register CB30s ()?

    BR、

    David。

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

    尊敬的 David:

     我注册一个回叫 Gassu Role_Register CB30s API. 我希望每次连接参数更新时都可以调用它。 但它没有被调用。 我尚未测试 是否已执行 GAP_UpdateLinkParamReq ()。  

    好的

    Lakshmi

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

    尊敬的 David:

    我终于成功捕获了调用堆栈。 请查看附件。 代码似乎永远不会回来  Rate_Meas 4.12.2. () API。  

    可能的原因是什么?  

    好的。

    Lakshmi

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

    您好 Lakshmi、

    应用程序进入 HearRate 功能的原因是什么? 它是否在将参数修改回默认参数后立即访问? 是否未正确释放为通知(发送失败)分配的内存? 此外、我认为我们可以通过了解 HAL 断言的原因来获取更多信息。 这个光源可以提供更多关于这个问题的信息。 在您的项目中,您能找到 AssertHandler()函数吗? 部分原因包括:HAL_assert_cause_out_of_memory、HAL_assert_cause_ICALL_abort、HAL_assert_cause_wrong_api_call 等-可以在 hal_assert.h 中找到

    BR、

    David。

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

    尊敬的 David:

    我使用 GATT 通知向手机发送数据。 由于此设备流式传输实时数据、所以会连续调用 HeartRate 函数。 下面是当通知失败时释放内存的方法。 但是、您可以从调用堆栈中看到、即使在通知 API 失败之前、固件也处于挂起状态。 它不是从 240310(791) Rate_Meas 呼叫返回的。  

    // Send notification.
    if (HeartRate_MeasNotify(gapConnHandle, &heartRateMeas) != SUCCESS)
    {
         GATT_bm_free((gattMsg_t *)&heartRateMeas, ATT_HANDLE_VALUE_NOTI);
       return;
    }

    好的

    Lakshmi

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

    您好 Lakshmi、

    器件在崩溃之前能够发送的通知数量是否始终相同(HAL 置位)? 您能否尝试运行运行运行运行运行时对象查看器来查看内存堆大小是否不足? https://software-dl.ti.com/simplelink/esd/simplelink_cc13xx_cc26xx_sdk/7.40.00.77/exports/docs/ble5stack/ble_user_guide/html/ble-stack-5.x-guide/debugging-index.html?highlight=rov#ti-rtos-object-viewer

    BR、

    David。

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

    尊敬的 David:  


    我设法捕获了 ROV 在暂停期间。 在挂起期间附加 BIOS ->扫描错误和 hwi 状态。 请验证。

    谢谢

    Lakshmi

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

    您好 Lakshmi、

    谢谢你。 您还可以附加 HeapMem 视图吗? 此外、是器件在崩溃之前能够发送的通知数量始终相同(hal 断言)、还是问题在崩溃前以不同数量的通知重现?  

    BR.

    David。

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

    尊敬的 David:

    请查看随附的 HeapMem 视图。  

    我将在计算后稍后发送通知信息的数量。  

    好的

    Lakshmi

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

    尊敬的 David:  

    我们还检查了崩溃前的通知数量。 这些值在每次碰撞中都是不同的。  

    好的

    Lashmi

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

    尊敬的 David:

    下面是关于此问题的一些其他见解。  

    1. 我已禁用连接参数更新。 在整个课程中使用相同的参数。 但我仍然看到我的固件在 iPhone 上挂起。  
    2. 它 仅在 iOS 中央设备(移动设备)上发生。
    3. 仅在 BLE 断开并再次重新连接时才会发生。
    4. 在 Android 上,这是不发生的。  

    我希望以上各点能就这问题提供更多的细节。 我真的需要你们的帮助来解决这个问题。 到目前为止、我们已经在这方面工作了几个月。  

    请尽快查看。

    提前感谢。

    好的

    Lakshmi

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

    您好 Lakshmi、

    这不是关于参数更新的问题。 我看不出你分享的记忆统计中有什么异常。 不过、我期望已释放的堆内存以及总大小、如您在此处所见: https://software-dl.ti.com/lprf/sdg-latest/html/debugging/ble-common_heap.html。在尝试之前,或者已经直接增加堆大小以查看这是否避免或增加问题重现的时间之前,你能帮助我分享从使用 Android 与 IOS 设备收集的空气日志吗? 这样、我们就可以尝试在对数差异中找出问题的原因。

    固件在默认参数正确的情况下挂起?

    PDU 大小是多少? 我从您以前的 IOS 日志中看到它是20字节、Android 是否相同?

    #define DEFAULT_DESIRED_MIN_CONN_INTERVAL              60
    
    #define DEFAULT_DESIRED_MAX_CONN_INTERVAL               108
    
    #define DEFAULT_DESIRED_SLAVE_LATENCY                         3
    
    #define DEFAULT_DESIRED_CONN_TIMEOUT                         600

    BR、

    David。

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

    尊敬的 David:  

    我明天将分享所要求的内容。  

    Android 和 iOS 的参数相同

    好的

    Lakashmi

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

    您好 Lakshmi、

    看看通知功能是如何实现的,例如,这是一种分配内存、使用 GATT_Notification ()发送通知和释放内存的典型方法。

    我还建议看看该示例、该示例通过使用通知 simple_serial_socket_server 的 BLE 服务器/外设实现 UART

    static bStatus_t gattServApp_SendNotiInd( uint16 connHandle, uint8 cccValue,
                                              uint8 authenticated, gattAttribute_t *pAttr,
                                              uint8 taskId, pfnGATTReadAttrCB_t pfnReadAttrCB )
    {
      attHandleValueNoti_t noti;
      uint16 len;
      bStatus_t status;
    
      // If the attribute value is longer than (ATT_MTU - 3) octets, then
      // only the first (ATT_MTU - 3) octets of this attributes value can
      // be sent in a notification.
      noti.pValue = (uint8 *)GATT_bm_alloc( connHandle, ATT_HANDLE_VALUE_NOTI,
                                            GATT_MAX_MTU, &len );
      if ( noti.pValue != NULL )
      {
        status = (*pfnReadAttrCB)( connHandle, pAttr, noti.pValue, &noti.len,
                                   0, len, GATT_LOCAL_READ );
        if ( status == SUCCESS )
        {
          noti.handle = pAttr->handle;
    
          if ( cccValue & GATT_CLIENT_CFG_NOTIFY )
          {
            status = GATT_Notification( connHandle, &noti, authenticated );
          }
          else // GATT_CLIENT_CFG_INDICATE
          {
            status = GATT_Indication( connHandle, (attHandleValueInd_t *)&noti,
                                      authenticated, taskId );
          }
        }
    
        if ( status != SUCCESS )
        {
          GATT_bm_free( (gattMsg_t *)&noti, ATT_HANDLE_VALUE_NOTI );
        }
      }
      else
      {
        status = bleNoResources;
      }
    
      return ( status );
    }

    BR、

    David。

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

    尊敬的 David:  

    1) 1)除了以下支票、我发送的通知与您共享的代码相同。

    STATUS =(* pfnReadAttrCB)(connHandle、pAttr、Noti.pValue、&Noti.len、0、len、 GATT_LOCAL_READ );

    我的通知具有固定长度(20字节)。  

    我不确定无线电的内部 TX FIFO 的深度有多大。 但是、在一些测试后 、我发现6个数据包、每个数据包20个字节将发送、而  GATT_Notification API 未收到故障。  

    因此,我尝试发送最多6个通知,直到我从 GATT_Notification () API 收到失败。  这意味着最多6个通知 、或直到我收到失败消息。 下面是我的代码。 请查阅。  

                    for(i=0; i<6; i++)
                        {
                            heartRateMeas.pValue = GATT_bm_alloc(gapConnHandle, ATT_HANDLE_VALUE_NOTI,
                                                                 HEARTRATE_MEAS_LEN, NULL);
                            if (heartRateMeas.pValue != NULL)
                            {
                              uint8_t *p = heartRateMeas.pValue;
                              
                              //Prepend Packet counter
                              *p++ = (counter & 0xFF00)>>8;
                              *p++ = (counter & 0xFF);
                              
                              // copy sensor data
    
                               memcpy(p, &recv_buf[mwptr * PKT_DATA_SIZE], PKT_DATA_SIZE);
    
                              heartRateMeas.len = HEARTRATE_MEAS_LEN;
       
                              // Send notification. 
                              gattErr = HeartRate_MeasNotify(gapConnHandle, &heartRateMeas);
                            if (gattErr != SUCCESS)
                              {
                                switch (gattErr)
                                {
                                case INVALIDPARAMETER :
                                    break;
                                case MSG_BUFFER_NOT_AVAIL :
                                   break;
                                case     bleMemAllocError :
                                    break;
                                case     bleInvalidMtuSize :
                                    break;
                                case bleTimeout :
                                    break;
                                default :
                                    break;
                                }
                                PIN_setOutputValue(hLEDPin, Board_LED1, 1);
                                // free the notification buffer
                                GATT_bm_free((gattMsg_t *)&heartRateMeas, ATT_HANDLE_VALUE_NOTI);
                                return;
                              }
                        }

    2)我还根据请求连接了 Android 中央设备日志。 请检查。  

    e2e.ti.com/.../Andorid_5F00_wireshark_5F00_air_5F00_log_5F00_no_5F00_fw_5F00_hang.zip

    3) 3)我尚未启用 HEAPMGR_METRICS 、并且 在我的项目中定义了 HEAPMGR_CONFIG 预处理器。 我将启用它们并拍摄堆快照。 稍后将分享这些详细信息。  

    1)我希望1)和2)提供一些见解。  

    好的

    Lakshmi

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

    尊敬的 David:

    除了我之前的回复之外、我还浏览了的文档 Heapmem 配置示例。 我意识到我的项目使用以下配置。  

    0x80 OSAL HeapMgr、静态堆大小 由链接时 HeapStart 和 HeapEnd 符号之间的可用空间量自动确定

    详细介绍 Heapmem 热度量、我可能需要将其配置为实际值  HeapMem 或 HeapMem + HeapTrack。

    使用此配置时是否有任何准则和/或参考工程? 请参阅。  

    好的

    Lakshmi

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

    您好 Lakshmi、

    请查看我的以下评论。

    IOS 通知中发送的字节数为20字节、而 Android 中为2字节。 这可以通过查看 MTU 交换请求解释 IOS 主机 问题,这在 Android 中不会发生(至少基于您的最后嗅探器日志)。 我怀疑问题与我们如何处理正在发送的数据有关(不是通知本身、而可能是从缓冲区读取/复制传感器数据的过程)。

    根据您提供的屏幕截图、我们可以看到 Rate_Meas (283)函数中发生了错误、并让我们看到出现暂停问题、我会再次检查您是否正确地从缓冲区中复制数据。 此外、您在哪里能够阅读断言原因?

    memcpy(p, &recv_buf[mwptr * PKT_DATA_SIZE], PKT_DATA_SIZE);

    BR、

    David。

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

    尊敬的 David:  

    在 Android 和 iOS 的固件中复制数据使用相同的方法 、因为我们对两者使用相同的代码。 不清楚为什么 iOS 是以不同的方式解释。 这是否是在 iOS 上运行的应用程序、它以不同于 Android 的方式解释数据包?  

    好的

    Lakshmi

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

    您好 Lakshmi、

    区别在于 IOS 触发 MTU 大小交换请求、而 Android 则不触发。

    BR、

    David。

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

    尊敬的 David:  

    1)即使 iOS 请求更大的 MTU 大小,我们可以观察到设备在其响应中将其限制为23。 在这种情况下、这不会导致任何问题。  

    2)

    >> IOS 通知中发送的字节数为20字节、而 Android 中发送的字节数为2字节

    关于上述查询、iOS 日志出于某种原因显示完整的原始20字节数据包、而 Android 日志仅显示前两个字节。 但 固件实际发送的通知仅为20个字节。 我们可以通过日志右侧窗口中的原始数据包观察到这一点。  

    好的

    Lakshmi

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

    尊敬的 David:  

    我碰巧捕获了监听器日志、因为固件挂起。 在此事务中、我观察到在重新连接期间 、当中央设备(手机 iOS)超出 BLE 范围一段时间、然后再次恢复到范围时、中央设备会连续请求海量的 LL_VERSION_IND 数据包。 对于哪个设备将以空 PDU 进行响应。 最终、我的器件将进入未知状态并导致固件挂起。

    随附了相应的监听器日志、供您参考。 请看一下。  

    好的

    Lakshmi


    e2e.ti.com/.../fw_5F00_hang_5F00_during_5F00_reconnection_5F00_with_5F00_repeat_5F00_LL_5F00_VERSION_5F00_IND.zip

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

    尊敬的 David:

    我们正处于此项目的关键阶段。 非常感谢在这方面提供任何帮助。  

    您能尽快查看一下吗?  

    好的

    Lakshmi

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

    您好 Lakshmi、

    对于延迟、我们深表歉意。 我看到从器件没有使用相应的 LL_VERSION_IND 操作码做出应答、因此主器件似乎一直在尝试该请求很长时间。 我还看到第一次连接尝试(成功且版本已正确交换)和第二次连接(重新连接后)之间的链路层信息没有区别。 如果您由于其他原因(例如重新安装 cc26器件)而重新连接、是否会发生这种情况? 我想问一下、这个问题是否与上一个问题有关(在 Rate_Meas 中发送通知时出现 halcirabi(Assert))?

    BR、

    David。

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

    尊敬的 David:  

    当我将手机移出 BLE 范围并返回到范围以重新尝试连接时、会发生此情况(有时不是一直)。  

    是的,当发生这种情况时,我在  Rate_Meas 内遇到 halassert ()。  

    好的

    Lalshmi

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

    您好 Lakshmi、

    您能否在此过程中共享监听器日志? 在前面的日志中、我看不到 LL_VERSION_IND、在最近的一个日志中、我看不到任何传输通知的尝试、只从主控方尝试了几次 LL_VERSION_IND。 在交换期间是否发生了暂停? 我不这么认为、因为器件在最后一次日志记录之前仍在用空数据包进行应答。

    我认为我们需要在这里系统地搜索暂停的原因/原因。 我认为本指南可能有用: https://software-dl.ti.com/simplelink/esd/simplelink_cc13xx_cc26xx_sdk/7.40.00.77/exports/docs/ble5stack/ble_user_guide/html/ble-stack-5.x-guide/debugging-index.html?highlight=assert#hal-assert-handling。

    BR、

    David

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

    尊敬的 David:  

    我能够找出暂停的原因。 正是 HAL_ASSERT_CAUSE_ICALL_TIMEOUT、该断言赶上了。 请查看附件中的屏幕截图。  

    根据文档、这是由堆栈挂起引起的。 我还附加了相同的监听器日志。 这一次主设备和设备之间有许多空 PDU 交换、然后主设备发出了连接终止。 大多数挂起实例都是这种情况。  

    我将很快捕获 LL_VERSION_IND 挂起监听器并发送。  

    好的

    Lakshmi

    e2e.ti.com/.../fw_5F00_hang_5F00_dueto_5F00_icall_5F00_timout.zip

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

    您好 Lakshmi、

    ICall 是 TI BLE 实现中的不同处理器或任务之间使用的通信机制。 当 ICall 操作花费的时间超过预期完成时间时、会导致此超时错误。 我将考虑以下两种可能性:

    1. 资源争用:如果多个任务争用相同的资源、则可能导致延迟和超时。

    2. 系统过载:如果系统同时处理过多的任务、它可能无法及时响应 ICall 请求。

    这可以转换为具有比 ICall (?)更高优先级的另一个任务或 ICall 任务(BLE 任务)、而这些任务会因中断等某些更高优先级的任务(例如中断)(可能是在传感器收集数据时来自传感器的中断回调?)而被中断 您是否还可以尝试在通知之间添加一些延迟(在 for 循环内)?

    BR、

    David。

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

    尊敬的 David:

    我测试过两者之间存在100个时钟周期的延迟。 问题仍然存在。 更多我增加的延迟挂起更频繁和更早比没有延迟.

    下面是供您了解的程序流程。 请检查一次、如果您发现有任何问题、请告诉我。  

    在 SPI0上有一个传感器、它每5毫秒在 GPIO 上生成一次中断。 我在 ISR 内部将大约1秒的数据累积到缓冲区中、并写入 SPI1接口上的外部闪存。  

    当上述例程中的数据就绪时、定期事件计时器被编程为每10毫秒发送一次(从 SPI1读取闪存) GATT 通知(Rate_Meas 3573)。  

    好的

    Lakshmi

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

    您好 Lakshmi、

    感谢额外的信息和日志。 正如您提到的、外设正在发出空数据包、我没有看到与之前相同的行为、外设进入暂停状态(超时)、因此在连接中停止应答。 此外、在尝试重新连接之前也没有多个 LL_VERSION_IND。

    如果您共享的逻辑与使用 IOS 或 Android 时执行的逻辑相同、那么我认为错误是由于时间(连接间隔)和数据包大小(MTU)的差异而触发的。

    您是否仍在使用相同的 IO 参数、但它仅在 IO 正确时失败?

    #define DEFAULT_DESIRED MIN_CONN_INTERVAL        60.

    #define DEFAULT_DESIRED MAX_CONN_INTERVAL         108.

    #define DEFAULT_DESIRED SLAVE_LATENCY              3.

    #define DEFAULT_DESIRED CONN_TIMEOUT              600

    BR、

    David

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

    尊敬的 David:

    有。 使用相同的连接参数进行此调试。  

    我尝试了不同的计时变量(GATT_NOTIES 之间的延迟和不同的连接间隔、iOS 兼容的从器件延迟和监控超时)、但未成功。  

    我意识到有两个变量导致了这个问题。 我在下面提供了概要和我的程序逻辑。 请查阅。  

    1)连接间隔  

    重新连接后、无论我使用什么连接参数、固件迟早都会挂起。

    2)频度为 100K 的 Rate_Meas ( 301) API 调用

    我使用10ms 的软件计时器在从传感器收集数据后发送通知。  

    这里有两种情况。

    a)断开连接前:  我从传感器的 ISR (外部 GPIO 中断)收集28个数据包(28x20 = 560字节)、并让软件计时器回调知道数据已就绪。 在每次回调执行期间、我仅发送6个通知。 接下来的6个通知将在下一次通话中发送。 同时、传感器将接下来的28个数据包填充到另一个缓冲器中、以在乒乓模式下的电流传输后准备发送。 如果电流传输延迟或 BLE 意外断开或手机超出范围、则我将冻结乒乓缓冲器、并将下一个传感器数据写入外部闪存(SPI)存储器、以确保不会丢失数据。

    b)断开连接后: 在 BLE 恢复或当前缓冲区传输完成后、我将使用新值更新连接参数(15ms Ci)。  然后、从停止的位置恢复数据传输。 与情景1不同的是、这段时间 内的 Rate_Meas 联络频率将会迅速增加。 尽管我在每次计时器回调中仍然只发送6个通知、但由于数据始终在闪存中就绪、直到所有数据都 被清除为止、却连续调用 Rate_Meas 524.52。  

    在这种情况下固件始终挂起 b) . 我已经测试了各种计时器参数(100ms,200ms.. 因此在1000ms 时)、具有不同的 Ci 值(15ms、30ms ... 等等)没有成功。 我的应用程序总是被困在 GATT_Notification () API 中,并导致挂起,无论我在这些调用之间提供多少延迟(6调用和延迟6调用.. 等等)。  

    非常快速地发送存储的数据是我们的应用程序的基本要求、因为备份恢复需要大量时间。 我们依靠 BLE (我们使用4.2)带宽来实现最大吞吐量。  

    我要求您查看我的上述逻辑并提出处理这些情况的最佳方法。 此 流程在 Android 设备上完美运行。

    增加 MTU 大小是否有帮助?

    或者、我是否需要更改我的逻辑?  

    由于我们正处于项目的非常关键的阶段、并且在8周多的时间内解决这个问题、我们非常感谢您提供任何帮助。  

    提前感谢。

    好的

    Lakshmi

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

    您好 Lakshmi、

    感谢大家参加夏季活动。 这很有帮助、现在我们可以专注于场景 b)。 以下是我的想法:

    1. 外设将连接间隔更新为15ms、但我只看到主器件在使用 Android 主器件时接受了这一点、而 IO 不接受这一点(我再次查看无线日志、我看到连接更新将间隔设置为30ms)。
    2. 您提到" Rate_Meas 呼叫的频率会迅速增加"、这是否意味着计时器会在10毫秒之前触发? 这有多快?
    3. 您如何读取外部闪存? 我只看到 memcpy (p、&recv_buf[mwptr * PKT_DATA_SIZE]、PKT_DATA_SIZE);我认为这是 SPI 事务中断的缓冲区、这是否也是由 NVS 驱动程序填充的缓冲区(从外部闪存读取时)? 如前所述、发生 HAL_ASSERT_CAUSE_ICALL_TIMEOUT 是因为执行了一些其他更高优先级的任务(NVS 或 SPI 传感器驱动器回调)并且 BLE 任务无法在正确的时间交付。

    IOS

    Android:

    同时我也会向我的学院征求有关如何进一步调试这一点的见解。

    BR、

    David。

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

    尊敬的 David:  

    下面是我的答案。 希望大家能有更多的了解。  

    1) iOS 主机接受新参数。  挂起仅在数据传输开始后发生。

    2) 2)在场景 A) BLE 断开连接之前、没有外部闪存就位。 我使用乒乓缓冲器来存储传感器数据。 当 Ping 缓冲器接收数据时、数据传输来自 Pong 缓冲器。 发送所有数据后、Ping 缓冲器便可准备好传输数据。 正如我提到过的、我收集28个数据包并开始传输。 收集28个数据包大约需要1秒。 那么、在70ms 的连接间隔下、我有足够的时间传输28个数据包。 但在场景 b)没有 BLE 连接的情况下、我会将数据存储在外部闪存中。 重新连接 BLE 后、必须快速刷新所有存储的数据、因此我将 Ci 更改为15ms、并开始发送连续通知、因为我不需要等待数据准备就绪。 因此、在方案 b)中、通知的频率将增加。

    3)我从 SPI 将数据读取到本地缓冲区中(1次读取28个数据包)、然后使用本地20字节缓冲区复制每个数据包并发送。 在这种情况下、没有机会使用 SPI 块。  

    但是、当 GATT 通知正在进行时、可能会发生传感器中断事件、该事件再次使用 SPI 从传感器读取数据。 此中断是由传感器触发的外部 GPIO。 我们无法避免该事件、因为它会从传感器提供数据。 此外、我还在阻塞模式下使用 SPI。  

    好的

    Lakshmi  

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

    您好 Lakshmi、

    为了缩小问题的范围、您是否想禁用从外部闪存读取数据并通过通知传输数据的过程? 我想看看如果没有这个过程、错误不会重现、因此我将重点讨论如何在建立机制后避免它。 此外、是否可以在传输完所有外部闪存传感器数据后启用 SPI 中断? 您目前对这些数据做了些什么?

    BR、

    David。

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

    尊敬的 David:

    我正在进行第一部分的工作。 同时、

     此外、是否可以在传输完所有外部闪存传感器数据后启用 SPI 中断? 您目前对这些数据做了些什么?  

    您能否详细说明一下? 我不明白到底需要做什么。  

    好的

    Lakshmi

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

    您好 Lakshmi、

    好的、从之前对代码的描述中可以看出、如果 MCU 在以更高的频率读取和传输外部闪存中的数据时仍在通过 SPI 从传感器中获取数据、我不清楚、还是在传输外部闪存中的数据时传感器数据丢失(未传输)了?

    但是、在 GATT 通知进行时、可能会发生传感器中断事件、该事件再次使用 SPI 从传感器读取数据。 此中断是由传感器触发的外部 GPIO。 我们无法避免该事件、因为它会从传感器提供数据。 此外、我还在阻塞模式下使用 SPI。  [报价]

    BR、

    David

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

    尊敬的 David:  

    有。 当数据从外部闪存传输时、传感器仍通过 SPI 获取数据。 收集的数据被写入同一个闪存。 因此、传输例程从闪存读取数据、然后在收集例程(传感器 ISR)收集数据并写入闪存的同时发送。  我不会停止从传感器进行数据收集、因为我们无法承担数据丢失的费用。  

    [报价 userid="575772" url="~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1409108/cc2640r2f-connection-parameter-update-request-to-ios-central-device-causes-firmware-hang/5537428 #5537428"]
    但是、当 GATT 通知正在进行时、可能会发生传感器中断事件、该事件再次使用 SPI 从传感器读取数据。 此中断是由传感器触发的外部 GPIO。 我们无法避免该事件、因为它会从传感器提供数据。 此外、我还在阻塞模式下使用 SPI。  
    [报价]

    SPI0 (传感器)每5ms 生成一次数据就绪中断。 我使用10ms 计时器调用 GATT_NOTIFICATION API。 在这个回调中、我从闪存中读取数据并调用 API。 如果 GATT_NOTIFICATIONS 循环无法在5ms 内完成、传感器可能会中断。 希望它有所帮助。 如果不清楚、请告诉我。  

    好的

    Lakshmi

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

    您好 Lakshmi、

    感谢您的澄清。 我想了解的是、这些用于获取数据的机制(例如基于中断的机制)中的任何机制是否阻止了 BLE 任务的执行。 我建议再次使用 ROV 工具来在运行时查看任务和 Hwi 信息、正如 下面视频 www.ti.com/.../5631158932001 中描述的那样。 此外、进一步挖掘可能报告了类似问题的其他线程、我发现 这个线程 可将错误追溯到错误使用时钟实例、这可能值得在您的应用中进行检查。

    BR、

    David。

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

    尊敬的 David:  

    1) 1)我正在 Util 构造时钟构建的时钟处理程序内部、以阻塞模式使用 SPI 闪存读取。 我认为该时钟处理程序将在 swi 环境中运行。  此外、我还在外部中断处理程序内使用另一个 SPI 写入(闪存)读取(传感器)。 所有 SPI 操作都处于阻塞 SPI 模式。  这会是问题吗?


    2) 2)我将仅使用一个时钟实例来传输数据、其中 GATT_NOTIFICATIONS 和 SPI 闪存读取操作连续运行、如上一点1)所述。

    好的

    Lakshmi