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:连接的 CC2340R5上的堆栈崩溃

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1448231/cc2340r5-stack-crash-on-connected-cc2340r5

器件型号:CC2340R5

工具与软件:

对于 TI 工程师来说、可能需要考虑这个问题、因为我们不确定相关的代码是否是开源的。。 [基于 SimpleLink 低功耗 F3 8.10.1.2 ]

场景:CC2340R5充当 UART <>BLE 桥、MTU 协商以允许最大 GATT Notify 负载244字节、每秒大约100帧。 该代码基于 DATA_STREAM_UART_OVER_BLE 示例。 只要不将任何东西连接到器件就不会出现问题-它将无限期运行、按照正确地切换每个到达 UART 的帧的 LED (但很明显、没有任何地方可用)。 连接后、它将继续正常工作-直到信号强度降低到无法再进行通信的程度。 此时堆栈会崩溃。

反向跟踪显示:

BLE4.12.7() Util_Task

SendUARTOverBLE ()

dsp_sendData ()

DSS_SetParameter()

DSS_sendNotification()

iCall_directAPI ()[GATT_Notification ()用索引258]定义到 iCall_directAPI ()

iCall_abort ()由于 iCall_waitMatch ()返回 ICALL_errno_timeout。

当然、iCall_abort ()不返回、因此可有效地结束 BLE 任务。 再次增大信号强度并手动允许 ICall_abort 在调试器内返回不能解决问题、器件仍"无效"(即没有进一步的 LED 活动和广播、尽管 FreeRTOS 仍为任务切换)。

我的直觉是、堆栈无法处理新数据、因为没有任何连接事件可以排空排队的通知、但它似乎并不能从容地出现故障。 也不清楚如何从这种情况中顺利恢复(从 iCall_abort()返回不起作用)。 对于我来说,栈可以优雅地说"不,不能这样做",抛弃通知,断开连接,回到广告,等待新的连接。 理论上,如果 GATT_Notification ()返回的结果不是成功,DSS_sendNotification ()会释放() malloc ()内存,因此不会有任何内存泄漏,但它当然不会返回。

非常感谢所有的帮助。

非常感谢

Patrick Herborn。

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

    Patrick、您好!

    感谢您的咨询。 我假设您在7.40 SDK 上运行示例? 我同意器件应该正常地出现故障、在这种情况下、可能会返回到通告阶段。 我建议迁移到最新的 SDK、因为我们已围绕这一点实施了多项改进。

    您可以在此处查看迁移指南:

    CC23xx SDK 7.40至 CC23xx SDK 8.10: https://software-dl.ti.com/simplelink/esd/simplelink_lowpower_f3_sdk/8.20.00.119/exports/docs/ble5stack/ble_user_guide/html/ble-stack-5.x-guide/migration-cc23xx.html

    CC23xx SDK 8.10至 CC23xx SDK 8.20: https://software-dl.ti.com/simplelink/esd/simplelink_lowpower_f3_sdk/8.20.00.119/exports/docs/ble5stack/ble_user_guide/html/ble-stack-5.x-guide/porting-guides/cc23xx/CC23XX_SDK_8.10_to_8.20.html

    BR、

    David。

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

    大卫,你好!

    非常感谢您再次来到我的这个问题以及链接的文档和建议。

    为了避免疑问, SDK 版本是 8.10.1.2正如在我的文章顶部所指出的,但它似乎是明智的,因为现在看起来有一个8.20版本,试图升级到那,并有另一个去,看看这是更稳定. 我想您可能是对的、该示例最初是针对7.40构建的(尽管我从未有7.40)-我可能需要仔细检查、确保在根据8.10.1.2进行构建时没有错过任何内容、因此感谢链接。 我会研究这两个问题、看看是否能说服他们自己行事。

    再次感谢大家、

    Patrick Herborn。

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

    Patrick、您好!

    听起来不错! 我们想向您澄清一下、您是使用 DATA_STREAM_UART_OVER_BLE 作为移植到您自己的项目的基准、还是实际使用的是开箱即用的项目: https://github.com/TexasInstruments-Sandbox/ble_examples/tree/simplelink_low_power_f3_sdk-7.20/examples/rtos/LP_EM_CC2340R5/ble5stack/data_stream_UART_over_BLE (未运行最新的 SDK 版本)。 另一个问题是、您如何知道发生了内存泄漏? 您能否 按照以下步骤查看 ROV 以确认这一点?

    您看不到任何设备发出的任何类型的断开连接? 您碰巧有监听器日志吗?

    alex peng 说:
    直到信号强度降低到无法再进行通信的程度为止。

    BR、

    David。

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

    Hiya David、

    非常感谢您的答复。 我当时在 CC2340R5 LaunchPad 上使用开箱即用的 DATA_STREAM_UART_OVER_BLE 来证明一点、然后对工程进行了调整以打造定制硬件。 我不记得以前针对这种情况使用8.10之前的 SDK、因此即使在 LaunchPad 上也会使用该 SDK。 我现在不记得我必须做些什么才能使它基于该版本的 SDK 进行构建(有点遗憾、因为我可能必须做类似的事情、针对8.20)。

    关于记忆泄漏,如果我混淆了情况,道歉。 我不相信目前有一个(因为它只是崩溃)-我评论了这样一个事实,如果它确实失败,那么调用堆栈中有代码将释放()它具有 malloc()的内存,这样就应该防止任何内存泄漏,如果它能够缓慢地失败。 当然、按照编写的内容、它无法正常地失败、因此代码永远无法立即执行。

    我可以尝试让我的嗅探器备份并运行,这将是有趣的看到发生在空中,但在第一个实例,让我们看看发生了什么与8.20 ...

    再次感谢大家、


    Patrick Herborn。

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

    David、您好!

    我很高兴地告诉大家、从8.10更改为8.20 SDK 似乎已经解决了这个问题。 它看起来不会再崩溃堆栈。 它仍然需要更彻底的测试、但到目前为止、我已经能够恢复超出范围的连接、并且在超出范围时也会发生连接中断、但器件会继续正常工作、广播并允许新的连接。

    有趣的是、我之前设置的某些断点不会再起作用、因为文件比现在的短很多、因此引用的行号不再存在-很明显、在发布之间、在幕后有很多工作要做。

    很抱歉可能浪费了每个人的时间、我应该在发布前检查是否有更新的 SDK -经验教训(这可能有助于其他人)。

    再次感谢大家、

    Patrick Herborn。