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**** 2334820 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

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

    尊敬的 David:

    除了我的上述响应、我在进入 计时器回调、传感器 ISR、内存读取和内存写入 API 之前放置了标志设置 、并在离开这些 API 时清除这些标志。  


    当发生此事件时、我看不到这些例程之间存在任何冲突。

    好的

    Lakshmi

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

    您好 Lakshmi、

    对于延迟、我们深表歉意。 好的、感谢您的确认。 我们是否可以检查以下各项:

    1. 使用逻辑分析仪、在例程内使用 GPIO 引脚检查通知发送的频率。 它们如何比较 IOS 和 android?
    2. 您是否尝试过将 IOS conn 参数设置为与 Android 设置类似、并检查行为是否相同?
    3. 您是否尝试过使用较新的 IOS 手机(而不是 iPhone 7)。

    BR、

    David。

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

    尊敬的 David:

    1) 1)我已经使用 LA 测试了 GPIO 切换。 有一个有趣的观察。 我在进入 GATT_NOTIFICATION 发送例程之前将 GPIO 设置为高电平。 我每10毫秒设置一次软件计时器。 因此、当数据准备就绪时、应该每10ms 调用一次此例程。 每当调用此函数时、我都会背靠背发送6条通知。 每次在 发送通知之前、我使用 GATT_BM_ALLOC 为20字节数据包分配存储器时。  

     我在 GATT_BM_alloc 之前将 GPIO 设置为高电平   、并仅在通知返回成功后才将其设置为低电平。 我不使其处于低电平 、GATT_BM_ALLOC 失败或 Rate_Meas 357API 返回失败。 这意味着、如果6个通知中的任何一个未能分配存储器、则 GPIO 保持高电平、或者通知 API 返回错误。  

    我大多数时候都能观察到  GATT_BM_alloc  分配内存失败。 因此、不会发送所有6个通知。 其他观察结果是、只要  GATT_BM_alloc 失败、就不会生成段10ms 的计时器中断。 下面是来自 saleae 逻辑专业版的屏幕截图。 您可以看到 GPIO 在下一个计时器中断生成(146ms 之后)之前保持高电平。  

    为了查看是否6个数据包太高、我已将每个计时器中断的 no of notifications 更改为1。 这一次初始状态良好。 请参考下图。 所有的28个数据包都会冒烟、每隔10ms 产生一个定时器中断。 下一次迭代在数据就绪时开始、大约为600ms。 这种行为是预期行为。

    但是、只要 GATT_BM_alloc 失败、在这种情况下、也会缺少计时器事件。 请参阅以下内容。

    似乎出现 GATT_BM_ALLOCH 失败的问题、这可能是个问题。

    我也用 Android 测试。 在 Android 中也是一样的行为。 但这不会导致固件挂起。  

    我已附上所有逻辑专业日志供您参考。  

    e2e.ti.com/.../logic_5F00_pro_5F00_logs.zip

    2) 2)是。 我对 iOS 和 Android 使用相同的连接参数

    3)我们也测试了 iOS 15。 我们在其中也发现了相同的问题。  

    好的

    Lakshmi。  

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

    您好 Lakshmi、

    好的。 我假设  GATT_BM_alloc 失败并返回 NULL? 你可能知道,这是由 i ) malloc ()无法为你的应用程序提供所需的堆空间,因为它没有足够的空间来分配所需的空间或 ii )由于堆碎片,无法获得该大小的连续块。 关于第一点、我认为最好是查看实际消耗的堆数量、本节内容可能会有所帮助:调试常见堆问题: https://dev.ti.com/tirex/explore/node?node=A__AJeuPVXEmN6WGbpf2dTXEw__com.ti.SIMPLELINK_CC2640R2_SDK__krol.2c__LATEST。关于第二点、您是否可以尝试分配更少的数据(< 20字节)、看看此问题是否会重现?

    BR、

    David。

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

    尊敬的 David:  

    1) 1)我正在尝试 在我的项目中启用 HeapMem + HeapTrack (自动堆容量)。 我要将 HEAPMGR_CONFIG=0x82;HEAPMGR_SIZE=0;配置 HEAPMGR_METRICS 为项目选项中的预处理器定义。 我假设 app_ble.cf 和 ble_stack_heap.cfg 文件使用这些定义。 但出于某种原因、我看不到 ROV 堆和堆栈图正在更新。 我配置堆管理器的步骤是否正确? 请参考。  

    2)很明显  GATT_BM_alloc  在存储器分配期间多次出现故障。 但这为什么影响计时器事件?  

    3)我假设  Rate_Meas 中的数据包写入内部 TX FIFO。 该 FIFO 将在连接内部事件期间发送。 我要在连接间隔之前填充该 FIFO。 我的理解是否正确? 如果正确、该 FIFO 的深度是多少? 如何获得此 FIFO 的可用空闲时隙? 将其关闭。 我将尝试填充所需的数据包到缓冲区中、这样可以避免几个 mallocs。

    4)由于我使用20字节的数据包 MTU 和相同的通知,是否可以使用静态缓冲区  attHandleValueNoti_t 结构变量、用于保存我的通知以完全避开  GATT_BM_alloc?  我只能使用 memcpy 将数据包更新到静态分配的缓冲区中。  

    好的

    Lakshmi。

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

    尊敬的 David:

    请您对此进行调查。  

    好的

    Lakshmi

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

    尊敬的 David:

    您能尽快查看一下吗?

    好的

    Lakshmi

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

    尊敬的 Lakshmi:

    很抱歉耽误你的时间。 David 目前不在办公室、因此我现在将继续为您的线程提供支持。 您是否能够在行为发生前后监视堆/堆栈大小? 如果某个地方似乎存在内存泄漏、了解这一点很有帮助。 您是否能够使用稍作修改的示例重现此行为?

    此致、

    1月

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

    您好、Jan:  

    谢谢您的接管。  

    正如我在前面的回答中提到的、我在使用 ROV 配置时面临问题。 请您继续阅读我之前的消息中的问题。  

    我想尽可能避免使用 GATT_BM_alloc。 因为、我以非常高的吞吐量发送实时数据。 所以、有时可能会赶上堆分段问题。 我已经尝试向 attHandleValueNoti_t 变量 pValue 指针分配一个静态数组。 但它无法正常工作。 请建议一些可以使其在没有的情况下正常工作的东西 GATT_BM_alloc。  

    有。 我能够在极少配置且没有内存(SPI1)操作的情况下重现此问题。  

    [报价 userid="179339" url="~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1409108/cc2640r2f-connection-parameter-update-request-to-ios-central-device-causes-firmware-hang/5567750 #5567750"]

    1) 1)我正在尝试 在我的项目中启用 HeapMem + HeapTrack (自动堆容量)。 我要将 HEAPMGR_CONFIG=0x82;HEAPMGR_SIZE=0;配置 HEAPMGR_METRICS 为项目选项中的预处理器定义。 我假设 app_ble.cf 和 ble_stack_heap.cfg 文件使用这些定义。 但出于某种原因、我看不到 ROV 堆和堆栈图正在更新。 我配置堆管理器的步骤是否正确? 请参考。  

    2)很明显  GATT_BM_alloc  在存储器分配期间多次出现故障。 但这为什么影响计时器事件?  

    3)我假设  Rate_Meas 中的数据包写入内部 TX FIFO。 该 FIFO 将在连接内部事件期间发送。 我要在连接间隔之前填充该 FIFO。 我的理解是否正确? 如果正确、该 FIFO 的深度是多少? 如何获得此 FIFO 的可用空闲时隙? 将其关闭。 我将尝试填充所需的数据包到缓冲区中、这样可以避免几个 mallocs。

    4)由于我使用20字节的数据包 MTU 和相同的通知,是否可以使用静态缓冲区  attHandleValueNoti_t 结构变量、用于保存我的通知以完全避开  GATT_BM_alloc?  我只能使用 memcpy 将数据包更新到静态分配的缓冲区中。  

    [报价]

    好的

    Lakshmi

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

    尊敬的 Lakshmi:

    没问题! 以下是我对您的问题的看法:

    1)我正在尝试 在项目内启用 HeapMem + HeapTrack (自动堆大小)。 我要将 HEAPMGR_CONFIG=0x82;HEAPMGR_SIZE=0;配置 HEAPMGR_METRICS 为项目选项中的预处理器定义。 我假设 app_ble.cf 和 ble_stack_heap.cfg 文件使用这些定义。 但出于某种原因、我看不到 ROV 堆和堆栈图正在更新。 我配置堆管理器的步骤是否正确? 请参考。  [报价]

    发生这种情况时、您是否在控制台日志或 ROV 窗口中看到错误? 或者您是否根本看不到任何更新发生? 退一步讲、您能解释一下为什么您使用 HeapMem + HeapTrack 吗? 这是由于 HeapTrack 提供的额外调试功能造成的吗?

    2)很明显  GATT_BM_alloc  在存储器分配期间多次出现故障。 但这为什么影响计时器事件?  [报价]

    可能有些堆溢出或接近溢出、这会引起意外行为。 我不知道发生故障的确切机制是什么、但这是我的猜测。

    Unknown 说:
    3)假设  Rate_Meas appa 将数据包写入内部 TX FIFO。 该 FIFO 将在连接内部事件期间发送。 我要在连接间隔之前填充该 FIFO。 我的理解是否正确? 如果正确、该 FIFO 的深度是多少? 如何获得此 FIFO 的可用空闲时隙? 将其关闭。 我将尝试将所需的数据包填充到缓冲区中、以便避免几个 mallocs。
    [/quote]

    我认为该函数会执行虚拟测量、然后分配一个通知数据包并将其添加到要发送的内部队列中。 此队列的深度应与项目使用的 PDU 大小和数量成正比。

    4)由于我使用的是20字节的数据包 MTU 和相同的通知、是否可以将静态缓冲区用于  attHandleValueNoti_t 结构变量、用于保存我的通知以完全避开  GATT_BM_alloc?  我只能使用 memcpy 将数据包更新到静态分配的缓冲区中。  [报价]

    这可能可行、但通知 API 旨在使用动态分配的数据。 我建议尝试查看静态通知是否有效、但我认为这不受支持。

    此致、

    1月

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

    您好、Jan:

    1) 1)我在该事件之后没有观察到任何堆或堆栈冲突。 随附了事件后的我的 ROV 屏幕截图。 请检查。  

      由于我使用默认配置、所以我的项目使用 OSAL 堆配置( HEAPMGR_CONFIG=0x80)。    为了获得更多见解、我想启用 HeapMem + HeapTrack 配置(HEAPMGR_CONFIG=0x82)。 我没有在控制台或 ROV 中观察到任何错误。 在任何情况下、图形都不会更新。  

       

    好的

    Lakshmi

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

    尊敬的 Lakshmi:

    很抱歉耽误你的时间。 我是因为假期离开办公室的。 如果单击自动刷新按钮并按调试器上的"Play"、值是否仍然没有变化? 您是否也可以尝试定期单击单次刷新按钮? 如果我们可以看到任何值(根据您的图像、似乎是这种情况)、那么我希望更新也能起作用。

    此致、

    1月

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

    您好、Jan:  

    我也检查了自动刷新。 值正在更新、但图表没有更新。 但是、我在自动刷新期间也没有看到这些值跨越堆边界。  

    这对我们至关重要。 我们花了很多时间进行调试、但没有任何结论。 我们的 iOS 用户正变得 非常严重,因为这。  

    TI 是否提供了任何高级帮助、让我们可以 每天一对一地解决此问题、从而了解为什么我们的应用/堆栈不能仅与 iOS 主设备(手机)一起工作? 我们希望立即找到解决办法、因为我们不能再在这一时刻拖延下去。  

    非常感谢您的任何帮助。  


    好的

    Lakshmi

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

    尊敬的 Lakshmi:

    感谢您确认没有跨越堆边界。 对于此问题造成的任何不便、我深表歉意。 如果可能的话、我想尽量重复这一点。 您能否检查一下、在使用 David 之前引用的串行套接字示例时、您能够观察到类似的行为? 此外、您是否可以共享 iOS 版本(如有可能、使用内部版本号)和您正在使用的确切 iOS 设备?

    如果您更愿意将支持切换到电子邮件、我们可以为您提供支持。 如果您想获得此帖子、请联系您的 TI 代表并为其提供此 e2e 主题、我们可以通过电子邮件进行此讨论。

    此致、

    1月

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

    您好、Jan:

    感谢您的响应。  

    我将查看串行插座示例并返回。 下面是我用于测试的 iPhone 详细信息。

    软件版本 15.8.2.   

    模型名称 iPhone 7 Plus

    型号 MN4Q2HN/A

    我们还测试了 iPhone 15 PLUS 型号。

    我们将切换到电子邮件支持模式、以加速调试。 但我们仅通过 TI 网上商店购买器件。 我们没有当地代表的联系方式。  

    请告诉我如何继续。  

    提前感谢。

    好的

    Lakshmi

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

    尊敬的 Lakshmi:

    我懂了。 感谢您发送编修。 请尝试使用串行插座示例重现问题。 如果无法重现问题、则可能我们需要更改项目中的逻辑、以便尽可能更接近串行套接字。 如果不可能、我们必须尝试使用修改极少的 SDK 示例与 LaunchPad 重新生成、这样我就可以与我们的研发团队合作确定可能会发生什么情况。

    此致、

    1月

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

    您好、Jan:  

    我们定制了 simple_peripheral_cc2640r2lp_oad_onchip_app 应用来满足我们的要求。 我在它上面添加了从心率示例中提取的心率剖面。 此外、我们的板与 Launchpad 不同。 在我们的设计中、我们添加了外部闪存和传感器。  

    我的板级配置文件与用于 Launchpad 的板级配置文件不同。 我不确定它是否可以在 Launchpad 上重现、供您测试。 我可以  在 LaunchPad 上使用心率示例和 simple_peripheral_cc2640r2lp_oad_onchip_app 默认示例。 但我认为它不会有帮助。

    更好的调试方法是什么? 请告诉我。

     另外关于电子邮件支持、请告诉我如何继续。 我们没有当地代表,因为我们直接从您的电子商店购买。  

    好的

    Lakshmi

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

    尊敬的 Lakshmi:

    感谢您发送编修。 我懂了。 只要问题可以在修改最少的 SDK 示例上重现、那就应该适合研发 为了澄清、这是否意味着您能够使用 simple_peripheral_cc2640r2lp_oad_onchip_app 在 LP 上重现此设计? 如果是、那么您能否向我提供您复制的项目、图像和确切步骤? 如果我能够重现问题、这将允许研发继续进行他们这边的调试。

    此致、

    1月