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:接收通知时出现 gattMsg 内存泄漏

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1425386/cc2340r5-gattmsg-memory-leak-when-receiving-notifications

器件型号:CC2340R5

工具与软件:

您好!

我将一个 CC2340R5工程配置为中央工程、并连接到另一个 CC2340R5作为外设。 外设本质上实现了数据流示例、但它通过发布 GATT 通知定期从 ADC 发送数据。 发送的数据为8字节、频率为1。 我运行代码、可以从中央读取 ADC 的值、但随着时间的推移、器件停止接收通知。

现在、在中央设备上、我会注意到每次从外设收到通知时、可用堆都会递减、这表明栈没有释放这些 GATT 通知。 我的理解是、如果这些消息由堆栈创建和分配、我们不应在 GATT 事件处理程序中释放、但 ROV 显然表明此处存在内存泄漏。  

您应该如何处理通知消息、还是应该在用户应用程序中释放这些消息?

以下是 app_data.c 中我的 ATT_Handle_Value_Noti 案例的代码片段:

case   ATT_HANDLE_VALUE_NOTI:
        {
            uint32_t remoteVal1, remoteVal2;

            attHandleValueNoti_t *rsp = (attHandleValueNoti_t*) &gattMsg->msg.handleValueInd;

            if(rsp->len == 8) {
                GPIO_toggle( CONFIG_GPIO_LED_GREEN );
                remoteVal1 = BUILD_UINT32( rsp->pValue[0], rsp->pValue[1],
                                           rsp->pValue[2], rsp->pValue[3]);
                remoteVal2 = BUILD_UINT32( rsp->pValue[4], rsp->pValue[5],
                                           rsp->pValue[6], rsp->pValue[7]);
                MenuModule_printf(APP_MENU_PROFILE_STATUS_LINE1, 0, "Notification received =  val1 = %d, val2 = %d",
                                                          remoteVal1, remoteVal2);
            }

            break;
        }

下面是一个简短的视频,介绍了应用程序运行时的堆视图,其中显示了可用堆的数量正在稳步下降:

e2e.ti.com/.../cc2340_5F00_notification_5F00_mem_5F00_leak_5F00_v1.mp4

Munan

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

    尊敬的 Munan:

    感谢您联系我们。 您能否指定它在哪个 SDK 版本中出现?

    此致、

    1月

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

    SDK 7.40.0.64之前、我曾在 A 层启动此项目

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

    Munan、您好!

    感谢您的咨询。 请帮助我回答以下问题:

    1. 您是否能够使用最新的 SDK 尝试重现此问题? 最后的版本中包含几个错误修复程序、您一般也可以从中受益。
    2. 通知停止多长时间后?
    3. 请看一下中央设备和外设的这两个示例及其如何实现通知: https://github.com/TexasInstruments/ble_examples/tree/simplelink_low_power_f3_sdk-7.20/examples/rtos/LP_EM_CC2340R5/ble5stack。你可以看到有没有必要释放消息,同时被送达。  

    BR、

    David。

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

    嗨、David、

    我将其移植到了新的 SDK、并在客户访问结束后重试。

    对于您的第二个问题、 连接后需要几分钟时间才能收到通知。 一件事是在我实施通知之前,连接和应用程序是稳定的,尽管它在连接时没有真正做任何事情。

    Munan

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

    尊敬的 David:

    我刚刚在迁移到 SDK 8.10.01.02的工程中再次运行它。

    相同的结果、即每次通知时堆使用量峰值都会增加、并且不会下降、最终导致应用程序崩溃。

    Munan

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

    尊敬的 Munan:

    几天前、我遇到了一个类似的问题。 连接中心设备和外设后、当外设向中心设备发送通知时、我发现 ATT_Handle_Value_Noti 未释放动态内存。 外设一次发送200个字节、发送4次后、中央设备崩溃。 你可以参考这篇文章;我遵循它,问题已解决。


    https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1414244/cc2340r5-ble-stack-malloc

    此致、

    Anthony

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

    嗨、Anthony、

    感谢您的分享!  释放 gattMSG->msg 似乎可以稳定内存使用率。

    Munan